C++ 和 C# 哪个容易开发出用户体验好(占用资源小&好看&稳定&反应快)的跨 macOS/Windows 平台的桌面程序?

2022-03-20 00:15:46 +08:00
 rv54ntjwfm3ug8

Electron 不考虑,没见过用 Electron 写的用户体验好的程序,公认优化好的 VS Code 启动也很慢,剩余内存一不够就卡得要死。

目前是有一点 C++ Qt 和 C# WinForm 开发经验。想写一个桌面程序,因为比较喜欢 C#(很多功能都不用自己实现,而且我更熟悉一点),而且听说 C# 的 Avalonia 框架可以用来非常方便地开发好看的跨平台 GUI 程序,于是打算用 C#来写。但 Google 了一下,很多人说 Avalonia 在 macOS 上有很多 non-native 行为,例如复制键变成了 Control-C 而不是 macOS 默认的 Command-C ,而且不是很稳定,经常崩溃,也没有什么知名开源项目在用,资料不好找。想问问 C++ 和 C# 哪个容易开发出用户体验好(好看&稳定&反应快&占用资源小)的跨 macOS/Windows 平台的桌面程序?或是还有什么更好的方案?

好看很重要,最好能方便地实现一些过渡动画。

13412 次点击
所在节点    程序员
131 条回复
nieyujiang
2022-03-20 14:34:44 +08:00
我司已经打算换掉 electron 了。天天被用户投诉内存占用。和下载慢的问题。摊手.webp
FrankHB
2022-03-20 15:20:00 +08:00
挺尬的,半斤八两,尬的意义不一样……
如果你要开发体验的话,那么原则上是 C#,毕竟 Qt 你想用舒服基础姿势水平不低……C#的应用效果其实吃亏,但强在你能用更短的时间折腾出更多不同的方案试错。当然,前提是能实现。
.NET 在框架的意义上吹亏的就是定制起来没 Qt 那么容易折腾(或者说 Windows 以外基本就没稳定实现能用),Avalonia 这种比较新的,具体坑有多少没试过不好说。
Qt 虽然开发效率是个槽点,但是还有 Python 绑定能用(好歹没那么啰嗦),所以也算不上决定性的缺陷(用不用得惯 py 就另说了)。
如果你说做商业项目,要考虑让人接手,那么还是 Qt 忍忍吧。个人项目就随便了。
用不用 QML 看口味。我是不想用,主要是不喜欢各种 ML 那套(有这功夫还不如折腾 SGML+DSSSL 去了)。

Flutter 响应慢和资源占用糟烂是预料之中的,毕竟底层的开发者自己都缺根筋: https://github.com/dart-lang/language/issues/490
这类方案的开发者看上去的共同点是没有一个严肃的桌面客户端应用开发背景,整个技术栈的根本设计上就不用指望能解决此类问题,只能“优化”变通。
JS/Electron 之类的软肋也就是这个,而 Dart/Flutter 么,怎么说也不用指望有更好的资源来(各种意义上的)优化了。
大多数玩具也有类似的问题。Rust 实现的算是少数的例外,问题是 Rust 的这类项目都没多少存在感也活不大长,怕是所有第三方方案中最不靠谱的那类,支持就更加看脸了。

@duke807 wx 基本就是个跨平台 MFC ,除了用纯 C++而不需要 Qt 这种 moc 以及性能稍微(在 C++的意义上)更好以外,没什么技术上的优势。工具和开发者社区更不用指望了。
我见过有长期维护的项目从 wx 切换到 Qt 的,比如 TortoiseHg 早期用的 wxPy 后来就切成 pyQt 了。
虽然开发应用未必需要很在意,wx 这类“原生”方案有个致命的架构扩展性弱点:不是所谓的 direct UI 。(依赖 Win32 的 MFC 和 WinForms 也有类似问题,但大部分正常的都没有。)
参考 https://v2ex.com/t/831456#r_11329552

@neoblackcap 自己写一个当然是终极方案,不过就只是自己的项目用,太浪费了。
我就糊过能跨 NDS 和 Win32 的,上边 C++能做到都完全看不出是什么平台的(反正比 QtWidgets/QPA 那坨彻底得多),不过自己糊的开发体验嘛……mac 工作量不好估计,反正 Linux 的后端我是坑快十周年了。
imgui 这种 immediate mode 的半残基本也就算图形库了,都不算正经 GUI 库(撑死就是“画界面”外加输入套皮),GUI metaphor 基本都没在 API 体现,要在严肃项目里用还不如自己造轮子。
比起上面说过 wx 是缺乏可扩展性,imgui 这种就差不多没什么架构能被扩展。要从里面拆代码复用,那还不如自己照搬目的纯粹一点的图形库( Cairo 、skia 之类)自己从头搭框架。

@ZSeptember 说 Qt 资源占用多,对也不对。
比起大多数其它 C++方案 Qt 往往因为不必要的运行时元数据访问而确实经常更拉胯,但一般同等经验的开发者写起来不会比用 C#实现的更慢。也就 QtCreator 这样规模的应用比较容易暴露出瓶颈。
更重要的是这里可是把 Electron 都拉上场一起遛了,正经写想更慢实在不大容易。

@wdhwg001 这只是相对其它成熟方案来说的,如果是相对自己糊界面库,这类问题就算不了什么问题,毕竟自己实现也得把这种东西折腾对,还是挺花资源的。
根本让 Flutter 无可救药的是上面说过的 Dart 的思路(同时也适用于 Electron )。
nicebird
2022-03-20 15:20:16 +08:00
肯定 C++啊,看看经典的软件都什么开发的就知道。
duke807
2022-03-20 15:42:08 +08:00
@FrankHB 你說的 wxWidgets 缺陷我不太了解,貌似是 windows 系統本身的問題。據我所知,wx 是通過不同的適配層支持不同的系統,等需要時候再給 windows 增加一個現代化一點的適配層應該就可以了,並不是 wx 本身的架構有問題。
至於 TortoiseHg ,我看了一下,大概知道是什麼樣的作者和用戶群。深入融入開源世界的人,基本是不會使用第三方圖形 git 工具的,git 自帶的 gitk 就夠用了。
開源界的軟件都是 linux 優先,其它系統的體驗肯定要稍微差一點,kicad 這麼重量級的軟件在 windows 和 mac 下的表現已經非常好,所以用 wx 應該沒有什麼問題。
FrankHB
2022-03-20 16:02:25 +08:00
@duke807 抛开具体项目的选型来讲,你的一部分观点值得我单独点名反对。

(才不是看漏了呢,哼、、、)

v2ex.com/t/831456#r_11329552 分析的,所谓“原生”基本只是包袱,而不会是普遍意义上的优势。
首先,没什么最终用户就纠结真的 bug-to-bug compat 程度的“原生”。至少 GUI 用户是感知不到一个动作的响应是不是用 WM_SH*T 还是 signal 还是 std::function 来实现的。
所以,只要实现得了用户不需要分出差异的效果,这里的差别基本就只是对开发者有意义。但这个意义仍然是决定性的,存在高下之分。
根本上,就软件工程的一般方法论来看,实现用户需求的过程的正常方向是自顶向下的:了解主要需求,分解需求然后确定实现方案。
这个意义上,任何软件理想情况下理应都是所谓的跨平台软件,因为凭空依赖平台并不是一般用户的主要需求(用户只是“有啥用啥”而已)。这也跟这里分析的任何 GUI 都天然是所谓的 direct UI 一样。
只有为了照顾可实现性,开发者便宜行事,才添加实现细节而形成路径依赖,导致潜在的方案切换成本。这本质上是一种妥协,是一种 artefact 而不是 intent 。
是否使用所谓原生或者所谓的 HWND 都是这类细节的例子。把这种实现细节泄露到上层的方案中造成混乱的状况乃至坑到开发者自己,是到底,全体开发者的无能或者说失职。
具体来讲,现在需要纠结这方面的选型,直接原因就是 GUI 历史上的实现就很碎片化,导致能产品化的方案也很碎片化;而后来的开发者并没有能力把不同的方案统合起来(加上像 mac 阵营和早年 Windows 开发者都很多刻意搞封闭制造技术兼容性壁垒的),事实上根本没一般意义上跨平台的方案能用( Web 也跨不了资源受限的一些嵌入式设备),所以才不得不去对照具体方案比较优劣计较得失(因为做不到面面俱到)。
想比较彻底地解决这种问题,专业搞 GUI 框架的都搞不定,作为应用开发者自然更加搞不定,这情有可原;但是不正面认识到这只是一种妥协,反过来以退为进,给碎片化继续火上浇油,不说技术上是否绝对正确,那起码算是个自私的方向。

@g00001 这里有个和上面相关的我需要批判的观点。
既然“桌面软件”这么个大概念的实现方案混乱如此,都快要指望全人类命运共同体都不见得能收拾得好了,那么纠结“一拖源码就可以导出来”就不应该强调。
或者说,为了实现刻意藏源码这种不是来自用户而是开发者自己的需求,增加另一个维度上的问题复杂度,这是唯恐天下不乱。
倒并不是说混淆源码的需求就一定是错的。而是说,即便藏起来源码开发者天然有权自决,实现成什么样的效果也是开发者自己负责,但一旦开发者行使这种权利,道义上就有必要需要理解这算得上是在薅市场羊毛,耗费本来就捉急的能系统性解决这类历史问题的公共开发资源。
这方面更应该鼓励的是把商业价值和源代码的可见性脱钩:在商业模式上做到即便随便让人扒源码也不会泄露商业秘密和损害销售,而不是道高一尺魔高一丈搞这种老实的最终用户只会凭空付出开销的军备竞赛。这样对谁都好。
如果能收拾好跨平台弱鸡可移植困难的局面,份额多少也会成为大多数开发者不用再操心的历史问题。

顺带说一下另一个问题:安装包体积和开发体积完全是两码事。安装包大是因为二进制依赖,这些依赖不需要应用开发者修改。而且只要系统自带就看不出来了。这个方面至少.NET 其实相当大,并不比 Electron 省地方。
KoMAsS121
2022-03-20 16:14:19 +08:00
@g00001 商业软件,公司写的加壳就是了(公司总不会像 VMP 的钱都出不起吧),不加壳,C++写的,别人也能一样分析呢。
KoMAsS121
2022-03-20 16:16:10 +08:00
@daokedao C#可以搞 AOT 的,像完全走 AOT 的 UWP ,他启动速度可真不差
Hanggi
2022-03-20 16:19:17 +08:00
vs code 启动慢? vs code 优化好?

楼主怕是对用户体验有什么误解?
jjx
2022-03-20 16:41:30 +08:00
c# 要性能 自然, windows forms , 而且只用系统的组件, 至于什么 wpf ,winui 的,难

第三方组件不能用, 如 devexpress 之类, 性能杀手

而且以前用机械硬盘时, c#/clr 这种东西因为加载东西太多, 速度快不起来, 现在都用 ssd 的, 就没有问题


用 html 又要性能,自然是使用 sciter, 国内有个 miniblink 也可参考
FrankHB
2022-03-20 16:44:28 +08:00
@duke807 臆造“开源世界”把用户群体割裂是你的另一个明显的技术错误。
开源世界从来都不会整体认为 GUI 不重要。也没有显著的个体支持这种调调,相反的倒有不少。例如,Linus Torvalds 显然算是你所谓开源世界的一员;你可以参照一下他是否认为 GUI 的缺失对开源世界产品的用户更友好。
所以是否来自开源世界,用户对 GUI 的需求很大程度是共通的。要有差别也只是行业习惯上的问题(许多逻辑用 GUI 只会降低效率);我举例的不属此例。

另一方面,你的说法暴露出你对你所说问题的很大程度的不熟悉。
首先一个事实错误就是 TortoiseHg 并不是所谓的“第三方 gui”,而是 Windows 上默认官方图形客户端。它很早(十多年前)就是随着 Mercurial 官方源一起提供下载的,甚至基本同时发布,只是早年版本号不统一罢了。这和 git/gitk 没本质差异,无非是 gitk 简单到之后直接整合到 git 的 repo 的子目录下一起管理了。
第二,你没看到不同 GUI 的差异。即使是同类的 GUI ,hg 和 git 差异也不小。不管是不是开源世界的,用过不同 DVCS 的用户,不少都认为 git 功能强大,但是命令行设计糟烂。有的用户会自己写脚本包装命令,而 GUI 就是另一种对更多新手用户解脱的方向。(虽说 hg 也有 amend 和 graft 都得 log --debug 才能看的笑话,但总体还是比 git 那么让人火大。)
遗憾的是,不少其它 GUI 也设计得很初级(特别是 git ,命令行的功能多得多,GUI 很多都没实现)。而同样叫做 Tortoise ,TortoiseHg 的 workbench 就吊打 TortoiseSVN 和 TortoiseGit (基本就只是复用了 troitoise 系的图标),功能覆盖度相对也很高,根本就不是一个档次上的产品。抛开 stash/mq 这种底层机制,像 diff/patch/shelves 编辑上的体验就不是一个等级上的,这完全是 GUI 自己设计的差异。
( Atlanssian 的 SourceTree 就照搬了不少设计,和 TortoiseHg 主界面布局相差远不如 TortoiseHg 和 TortoiseGit/TortoiseSVN 差得多。)
至于 gitk ,说白了主要就只是 git log 的 wrapper ,就别提了。真要说的话,界面布局倒是也更接近 TortoiseHg 而不是 TortoiseGit 。

当然,这里的问题和 wx 还没太直接的关系。上面提过,这个问题是关于框架自身的,二次开发框架才会集中体现出来(死活都没法把 WinForms 改成 WPF 一样的无力)。应用开发者用 Qt 代替 wx 也经常有其它更显著的理由,比如工具和社区支持。
FrankHB
2022-03-20 16:49:17 +08:00
@FrankHB typo:但总体还是比 git 那么让人火大→但总体还是比不上 git 那么让人火大
( git 让人火大的不只是 CLI 设计,至少还有在一些小版本瞎改文件布局之类。)
anyele
2022-03-20 16:54:09 +08:00
C#的 WinForm
duke807
2022-03-20 17:04:27 +08:00
@FrankHB 我可沒說圖形界面不重要,相反我覺得圖形很重要,gitk 就是圖形界面的,無論是我日常使用 git 還是給小白培訓都嚴重依賴 gitk 圖形。

同時我也反對妖魔化命令行,我認為命令行方便的就用命令行,圖形方便的就用圖形。我寫代碼會用 eclipse 之類的 gui 程序,覺得用 vim emacs 寫代碼的人魔征了。

對於 git ,我一直認為,精通 git 可以提升工作效率,而只會一點皮毛反而降低工作效率,而且總有一天會搞出飛機坑死自己。既然精通 git ,自然使用 git 命令操作 git ,配合 gitk 觀察狀態是最優的方式。
tairan2006
2022-03-20 17:06:09 +08:00
跨平台的话 Qt ,或者 Lazarus

不跨平台就 C#
g00001
2022-03-20 17:11:46 +08:00
@FrankHB 我是说了 C# 一拖源码就可以导出来,但应当没有 “纠结” 这事,源码一拖就出来多好的事!放心没有人想“刻意藏源码”,虽然现在不开源的桌面软件数量远远多于开源软件,但就像你说的人类命运共同体什么的 …… 就这样。

@KoMAsS121 赞同你说的没错,公司不缺钱可以用 C++ 开发,可以用汇编语言开发,不差钱任何问题都不是问题,C# 一拖源码就可以导出来只要有钱就不算缺点,正确得无懈可击。不差钱都没空上网争论哪个语言好。
linghtls
2022-03-20 17:12:12 +08:00
好看是指有配套的 ui 库吗…
agagega
2022-03-20 17:31:33 +08:00
@secondwtq
WASM 有啥问题么?
FrankHB
2022-03-20 17:57:13 +08:00
@g00001 不好意思,我看到的大多数用户提到这个“特性”时都是持反对的立场,所以可能误解了你的原意。
不过,考虑到拖出源码虽然自己看问题不大,拿来改其实就有一些法律风险,相对明确开源也不算很应当被鼓励。
g00001
2022-03-20 17:57:45 +08:00
有些作者可能事先并不知道这事。
前些天还看到有人说用 C# 写的软件写完了才知道别人可以轻松导出源码(包含工程文件),
有一个方法可以试试,用 aardio + C# 开发,操作简单不用花钱,可以阻止 ILSpy 还原代码,可以内存加载 C# 写的 DLL ,生成极小的独立 EXE 文件。

发个例子:


源代码;
import win.ui;
var winform = win.form(text="嵌入 .Net 控件")
winform.add(custom={cls="custom";left=25;top=25;right=736;bottom=274;db=1;dl=1;dr=1;dt=1;z=1})

import System.Data;
import System.Windows.Forms;
var Forms = System.Windows.Forms;

var dataGridView = Forms.CreateEmbed("DataGridView",winform.custom);
var dataTable = System.Data.DataTable("DT");

import System.Type;
dataTable.Columns.Add("名称");
dataTable.Columns.Add("计数",System.Type.GetType("System.Double"));
dataTable.Columns.Add("选择",System.Type.GetType("System.Boolean"));

//绑定数据源到视图
var dataView = System.Data.DataView(dataTable);
dataGridView.DataSource = dataView;
dataGridView.EditMode = 2;

//添加测试数据
var row = dataTable.NewRow();
row.ItemArray = {"王五",123, true}
dataTable.Rows.Add(row);

winform.show();
win.loopMessage();
FrankHB
2022-03-20 17:58:40 +08:00
@g00001 不差钱也可能不行,有的项目进度卡的可能某些方案就是神仙也没法及时开发出来,选型上只能各种抠了……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/841554

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX