正如之前在 ref: https://www.v2ex.com/t/1144403#reply14 帖子中所提到的,我自己写了一个 S3 客户端,使用 Electron 作为 UI ,c++ 写的网络库。 目前已经基本完成。
但是最近遇到一个问题: 当我的远程“目录”中文件数量较多的时候,UI 会卡死。原因是我的 UI 中没有在 Table 中使用虚拟化技术。 网上找了一圈,目前 shadcn ui table 的 tanstack-virtualizer 一起工作的例子还没找见,去 shadcn ui 官方 issue 看了一下,有人问过类似问题,但是很长时间了依然没有解决方案。 这只是个引子,这里不讨论如何解决这个问题了。
所以最近在考虑是否应该使用 Qt QML 来重写我的这个工具, 主要有以下考虑:
我个人对于 Web 技术的掌握非常浅,大部分事件依赖 AI 给我的方案。AI 解决不了的,大概率我也解决不了
Electron 有点儿吃内存,打包大小也有些大。 感觉对与我这种工具来说,有点儿太重了。
我的 c++ 库暴露成 js 需要手动编写 napi wrapper ,也有点儿繁琐
4 )但是对于 QML 我也需要重新学习,但是预期这个性能会好很多。
5 )还多多少考虑到 nodejs/js 中依赖太多,水平质量层次不齐。
想知道,这里的大佬们如何看待这个问题。 提前谢过!
1
NoNewWorld 2 天前
闲的话,可以试试
|
2
C64NRD 2 天前
既然你不擅长 web 技术,那也不必犹豫了,just do it!
|
3
spritecn 2 天前
@NoNewWorld 写 s3 客户端的人应该不忙
|
4
weixind 2 天前
写都写完了,迁移的收益其实不明显。
分页 + 搜索 或者上拉加载下一页就行了。没太必要传输所有的文件数据。 |
5
layxy 2 天前
虚拟列表的性能并不差,可以用支持虚拟列表的 ui 库试下,比如 vxe-table
|
6
x007xyzabc 2 天前
是我的话,选择自己实现支持 tanstack-virtualizer 的表格
|
7
iugo 2 天前
Web 的生态非常丰富, 迁移到 Qt 可能有依赖相关的问题.
|
8
masterclock 2 天前
QML 这种神经病还是算了吧
|
9
liaohongxing 2 天前
Web 大数据可以虚拟列表,但是看你会 c++ ,建议转 QT
|
10
zhzy 2 天前
涉及到远程目录感觉问题应该不在 Electron ,QML 也没什么生态,建议不要改了,重新设计一下 UI 吧
|
11
liuliuliuliu PRO QT 也是个坑啊,桌面 UI 这块还是 .net 吧,跨平台,原生编译,没啥缺点了
|
12
abc0123xyz 2 天前
.net 吧,简单
|
13
wobuhuicode 2 天前
这是技术设计问题,又不是性能问题。直接渲染长列表,大 Table ,换谁来都卡。要说 QTableView 本身有虚拟化,但 delegate 写得不好也是卡。
|
14
colourfulsai 2 天前
不跨平台考虑下 WPF 吧。现有的 C++代码也可以用 C++/CLI 快速复用。
|
15
vfs OP @NoNewWorld 啊,虽然是个人业余的小项目,但是时间还没多到在 UI 上花费那么多功夫来尝试,还是算了,继续用 Electron 吧,找找解决方案。
|
17
vfs OP @masterclock 赞成,之前再另外的项目中尝试过,确实不是很理想。 这里提这样的问题还有一点考虑是:Qt QML 更接近 c++, 不需要 napi wrapper ,调试也更方便一些,但是短板很明显,没有现成可用的 UI 库。
|
19
vfs OP @wobuhuicode qml 中应该最后还是有一层和 web 相同的 js 引擎,之前已经修复了一个 c++ 到 js 传递数据导致性能低下的问题。 这方面来说,应该两者面临的问题是一样的
|
20
BingoXuan 1 天前
用 ai 做虚拟 table 应该很容易。最近我用 Gemini 3 Pro 就写了 WEBGL2 加速的绘图库。每秒刷新 1.5M 数据点都能保持 60fps (但 WEBGL 真的性能差,WebGPU 又不成气候)
用了 c++,不如尝试一下 c 的 webview 。可以直接 bind c function |
21
drymonfidelia 1 天前
谁告诉你.NET 不能开箱即用的,别说 standalone 现在 AOT 都可以了,缺点要说的话就是跨平台框架没有很成熟的都是一堆 Bug ,所有 LLM 都会混淆各种 XAML 方言、和 3D 有关的功能疯狂胡编 Unity API 出来
|
22
liyafe1997 1 天前
QML 还能跨跨平台,.net 用什么? WinForm/WPF ?直接绑死在 Windows 上了。
也许还能看看 Flutter 。 |
23
cugljd 1 天前
@liyafe1997 #22 .net 跨平台有 Avalonia ,https://github.com/avaloniaui/avalonia
|
24
a33291 1 天前
|
25
guiyumin 1 天前
@liuliuliuliu 有个 avalonia ui, 那个咋样?
|
26
vfs OP @BingoXuan "用了 c++,不如尝试一下 c 的 webview 。可以直接 bind c function" 这倒是个不错的想法。 但是个人真的不是想在这里太折腾了,太小众的方案总让人不放心
|
28
nilaoda 1 天前
avalonia + native aot 可以实现跨平台/秒开/无需运行时,不过也有一些坑要踩。
还是基于现有的 web 改吧~ |
29
liuliuliuliu PRO @guiyumin 嗯我说的就是这个,.net 平台下的 ui 框架很多,官方的、非官方的、跨平台的、不跨平台的,最终还是推荐这个 avalonia ui
|
30
susunus 1 天前
你用 flutter 或者 kotlin native 写都比你用 qml 写合适
|
33
Al0rid4l 1 天前
"一则 .NET 依赖于额外的 dotnet 或者 .net framework, 应用不能开箱即用" 不, 有 selfcontained 打包, 你可以说你不喜欢, 但说要依赖额外的运行时那就尬黑了
|
34
liuliuliuliu PRO |
35
liuliuliuliu PRO @liuliuliuliu #34 还有 20m 的压缩包体积
|
36
wazggcd 1 天前
不能加个分页吗?
|
37
vfs OP @liuliuliuliu 感谢分享,很惊艳。
|
39
vfs OP @Al0rid4l 并没有尬黑。 在我的上述表述之前,我只做过 windows 上 winform 的 .net GUI ,没试过其他的方案,属于是自己凭空想象的,是我表述不对。
|
40
colourfulsai 1 天前
.NET 可以让可执行文件 开箱即用 的,编译程序设置 --self-contained true 就可以。没有喜欢的 UI 框架这个就没办法了。
|
41
jamesjammy061 1 天前
搞着搞着就会变成 c++➕skia ,再搞搞就变成 flutter 了
|
42
dford 1 天前
Gemini 连 10 几行的 shell 脚本都写不对,就别拿来做论据了,至少试过 Claude sonnet4.5 再说
|
43
play78 1 天前
@vfs #38 参考手机 app 的瀑布流方式。 滚动时,再分页加载。
一般预加载 3-5 页数据,每次只渲染当前页,+2 页、-2 页 然后根据总页数,显示虚拟的滚动条。 其实就是虚拟列表的原理。你会 C++,这对你来说实现应该很简单才对。 |
44
cnbatch 21 小时 27 分钟前
跨平台?还有另一个选择:wxwidgets
100%操作系统原生控件,可能美观度是差了点,不过性能方面无须怀疑,就是原生的响应速度 |
45
wanmyome 14 小时 31 分钟前
wxwidgets 优点是许可宽松,允许闭源,qt 生态好,b 上有一堆初级教程,我干了几个月 wxwidgets 换 qt 的
|
46
DonaidTrump 13 小时 2 分钟前
用 GPUI Component ,他们介绍里就有关于大量数据渲染的
High Performance: Virtualized Table and List components for smooth large-data rendering. |
47
dosmlp 12 小时 48 分钟前
如果时间比较多可以试试,但是 qml 也有很多 bug ,我 6 月份提了一个现在还没解决
|
48
mayli 12 小时 35 分钟前
@liuliuliuliu avalonia ui 看起来的确还行,就是没看到 Android 和 ios 生态
|
49
Vaspike 12 小时 10 分钟前
跨平台? 来人把 Java/Kotlin 端上来, 你敢给内存资源我绝对不让你卡
|
50
liuliuliuliu PRO @mayli
可以看他自己的这个纸牌接龙的 demo https://github.com/AvaloniaUI/Solitaire 横跨 6 个端 ( windows/linux/macos/浏览器/ios/android ),这是他浏览器 webassembly 的地址 https://solitaire.xaml.live/ 个人感觉 ios/android 生态可能确实不太好,当然我也没实际拿他开发过 ios/android |
51
Mithril 11 小时 30 分钟前
.NET 也可以做到开箱即用的,UI 框架也很成熟,但没有 Web 技术这么成熟。真想做个业余项目,想要个好点的 UI ,但又不想花太多精力在上面,那最好还是各种套壳的 Web 框架。
觉得 Electron 太重,也可以试试 WebView 。但本质上也是一样的 Web 。 |
52
ZztGqk 11 小时 7 分钟前 via iPhone
我印象里 table 都没别的依赖参与,又不是 data table ,virtualize 很好做吧
|
53
vfs OP @dford 我其实已经说明了这里主要不是讨论是否能解决 web 端虚拟列表的问题(虽然我现在也已经做好了)。 至于说哪个 ai 能解决这个问题,我也不想争辩。 顺便提一下,昨天试了一下 claude ,它告诉我说它无法生成 tanstack 相关的代码
|
55
vfs OP @cnbatch 哈哈,这个我真用过。 放弃了,主要是太丑了。。。但是真的轻量,内存占用小,打包大小也小,还有一个 designer 可以直接拖拽设计 UI 。
|
57
vfs OP @DonaidTrump 呀,这个看着太高级了,我就一菜鸟,想找一个直接能用的:(
|
60
vfs OP @Mithril 是的,我觉得我需要的仅仅是一个不难看的 ui ,我可以在 c++ 做所有其他逻辑。 选择 Electron 的主要出发点是考虑用的人多,应该奇怪的问题比较少。 其他方案担心比较小众,出问题不好解决
|
61
vfs OP @ZztGqk 是的,最普通的 ai 也能直接生成可用的代码。 麻烦在我用了 shadcn ui 的 table ,然后想要继承其他的,ai 一直改不对。(当然,我用的 ai 没那么优秀)
|