shin(日本男主播):最讨厌这个闷葫芦了。
总是多管我的闲事,话也不多,麻烦,讨厌。
烂好人,容易被骗,讨厌。
总是操心个不停,像个老妈妈一样,
麻烦死了,讨厌。
冲他乱发火也不会生气,自作多情,
最讨厌了。
讨厌讨厌讨厌,最讨厌了。
但在我心情不好的时候又会温柔的安慰我,
在我遇到困难的时候总是来帮我,
有一点点喜欢呢。
保护我的时候却又那么帅气,
关心我的时候又那么温柔,
无理取闹也不会生气。
喜欢你啊!八嘎!
为什么察觉不到啊,八嘎八嘎八嘎,
最讨人厌啦。
但又是那么喜欢你,
suki, suki,daisiki。
笨蛋,再多看看我啊!
毕竟人家,最喜欢你了啊。
魈开始时的设定可能是为了迎合乙女的,但是b站弹幕里一堆叫老婆就是没几个叫老公的,最后吸引的是男的多还是女的多还用说吗?
在米哈游的游戏里,你可以不相信这个游戏有乙女,但你可以永远相信这个游戏里一定有男同。
我觉得代入魈的官方塑造,他和旅行者的感情发展还蛮自然的。
(这里的感情是广义概念,不一定是爱情)
提起魈,不少人认为他是个高冷的死傲娇,而且和隔壁的影妹有诸多相似之处—打架专精这点尤其像。
但喜欢抠细节的剧情党不难发现,魈的性格其实非常成熟务实。而他的塑造关键词与其说是 “单纯的武人”,更像是“孤独的守护者”。
与稻妻悲伤逆流成河的主基调不同——摩拉克斯,归终,马克修斯,移霄导天,铜雀,层岩的无名夜叉,留云借风,萍姥姥….璃月“非人之物”的故事,几乎都与“爱” 有关。这种爱不是凡俗情爱—而是无愧于仙人之名,对璃月苍生的大爱。
岩王帝君用3700年的时间—将勤劳,坚毅与家国情感铭刻在了璃月人的血脉里。薪火不灭,美德世代相传。千千万万响应岩神号召的子民,最终筑成了璃月的重峦叠嶂。
魈便是其中一位传承者。
他是岩王帝君的战士,为护法而杀生;亦是黑夜中的守护神,人们在生死关头呼喊的名字。小愿护佑荒野遭难的百姓—大可斩妖除魔,将此身化为构筑繁荣的基石,撑起璃月的万家灯火。
如遇失道旷野之难,路遭贼人之难,水火刀兵之难,鬼神药毒之难,恶兽毒虫之难,便呼我命。三眼五显仙人——魈,听召前来守护。
魔神战争期间,一位纯真的夜叉被魔神奴役,听凭指令犯下诸多杀业,吞噬败者的美梦,痛苦地苟活于世,直至他的主人在与摩拉克斯的对决中落败。岩王帝君将夜叉从奴役中解放,赋予了他新名字“魈”—异邦传说中饱经磨难的鬼怪。魈从此开始了璃月守护者的一生。
岩王帝君与众仙荡涤四方,将无数败者斩落于岩枪之下。战败魔神残躯腐烂,憎恨与怨怒却永世不灭,化为妖邪灾祸殃及人间。骁勇善战的夜叉一族听从帝君的召唤,成为了与妖邪战斗的主力军。
与魔神的灵魂碎片作战,必将受到魔神遗恨的侵蚀污染。背负起难以泯灭的业障,日日夜夜忍受灼心噬骨之苦。仿若魈的设计原型—吞食毒龙,任由剧毒渗入血肉的大鹏金翅鸟—不可避免地堕入毒性发作,于金刚山顶自焚而亡的末路。
在这场没有尽头的血战中:绝大多数夜叉和铜雀一样陨落在黎明的前夜;护法夜叉们在精神折磨下自相残杀,走火入魔;魈也曾濒临崩溃边缘,却在风神的清丽笛声中,幸运地寻回了自我。
两千余年后,璃月港灯火辉煌,魔神坟场孤云阁风浪渐息。曾经与魈并肩作战的友人或魂归高天—或不见踪迹—或被世人遗忘—迈入人治时代的浪潮,悄无声息地隐入尘海。
归终,浮舍,应达,伐难,弥怒,铜雀,若陀.....最终连帝君也退下了神位。可是魈依然没有停止战斗。哪怕得知帝君“死讯”,他的决心也未曾动摇过分毫。为了报答君恩,为了向过往赎罪,为了继续履行守护璃月的职责—他提起长枪,宛如殉道者一般杀向末路。
难能可贵的是—尽管选择了最痛苦的活法,背负着如此沉重的责任—魈却没有如自己所言,变成一台无情的战斗机器。
他会主动帮小女孩拿回被丘丘人抢走的布娃娃。
有一天我在林子里,遇上了一个帅气的仙人哥哥,长得和故事书里一模一样!我对他笑,可是他却不对我笑...只是把我被丘丘人抢走的娃娃还给了我....
他会替假冒仙人骗敛财的人类收拾烂摊子。秉承着不伤害凡人的信条,召来其魂魄作为惩罚,当面告诫他别再惹事。
他拯救了许多野外遇难的凡人,却从不留名。
他言语冷淡,却会对旅行者和派蒙礼貌地道谢,耐心地倾听并解答疑惑。
会在试吃香菱的菜品后,直言夸赞她和言笑都是好厨师。给出建议后,还叫她不必介怀。
从许多情节都能看出,魈并没有表面上那样不近人情,也不是个特别典型的傲娇角色。他的个性和外貌一样充满了仙气。既有岁月磨砺而成的老成淡然,言谈举止好似参透世事的长者。
力量的尽头是自我毁灭。回答我,为何如此执着呢?
也留有一颗温热的赤子之心,仿佛定格在过去的时光里,没有沾染半点红尘。
而他拒人于千里之外的孤僻,更不是因为装酷,而是源于他无法化解的心结。与其他璃月仙人不同,魈一直背负着沉重的思想包袱。他坚冰般的外壳下,封存着深入骨髓的负罪感与自我厌恶。
了解魈的过去,与业障对人类的危害后—你会发现,魈的许多台词其实都在说着三个字:“我不配”
曾经身为魔神奴隶犯下累累杀业,吞噬了无数美梦的自己—不配得到幸福。
被帝君赋予新生,签订契约守护璃月的自己—不配停下赎罪的脚步。
在数千年的杀戮中,满手鲜血,业障缠身的自己—不配接近人间烟火。
面对长眠于九泉之下的夜叉同胞们,苟活至今的自己—不配过上安逸的生活。
在魈看来—他是罪人,是杀戮机器,是携带致命“病毒”的传染源,是在死亡边缘起舞的夜叉—是历经苦难,饱受淬炼的鬼怪—唯独不是值得万人称颂的英雄。
他的功绩无人知晓,他的哭嚎与嘶吼亦无人听闻,埋没在无数个血战的黑夜里—魈却平静地接受了一切苦难,仿佛这是他与生俱来的宿命。
他近乎偏执地惩罚着自己—为自己戴上枷锁,剥夺了自己与他人亲近的权利。也许这就是魈爱吃杏仁豆腐的原因之一。这寻常的点心,是魈允许自己拥有的唯一一点甜头。
作为魔神战争时期便与帝君签订契约的元老之一,魈在仙家饱受尊重。但是魈跟其他仙人都只保持着疏离的点头之交。面对魈的心墙,哪怕是甘雨这样能够理解他的人,也只好望而止步。
甘雨的孤独,是游离于两界之间的寂寞。因为她并非孤单一人:在仙界有老妈子留云,凡间有境遇相似的半仙烟绯,师妹申鹤,朝夕相处的人类朋友们。于是她将最温柔的牵挂留在了红尘里,细数着海港的日升日落,陪着一代又一代的璃月人慢慢变老。
而魈的孤独,是自我流放于孤岛的孤独。他站在高崖之上,眼前是仿若触手可及的人间灯火,脚下是自己用长枪劈出的万丈深渊。他独自守望了太久,早已忘记如何融入尘嚣。于是他藏起憧憬的目光,背朝光明而去。漫漫长夜中,唯有痛苦与鲜血为伴。
他可曾怀念同生共死的夜叉同伴?是否还想拥有愿意与他并肩同行,跨过血海拥抱他的人?魈可能从未奢望过。因为在他的眼中,自己早就失去了被人所爱的资格。
他不值得。
魈眼中的旅行者是个什么样的人呢?(题主问乙女,因此代入莹妹)
从望舒客栈初遇到璃月港危机平定,旅行者与他在漫长生命中拯救过的其他人并无区别。只不过更胆儿大更能打,会做杏仁豆腐,还不知道从哪嘎哒蹦出来的。
在魈的传说任务中,旅行者与魈再次相遇。两人一同解救被业障影响的凡人,在秘境中清理妖邪。旅行者受魈所托前往夜叉铜雀的庙宇,见到了铜雀的弥留残魂,最后与魈主持了“假仙人”王平安的招魂仪式。
此时此刻,旅行者的好感度等级就比言笑高了。因为魈发现这个人类点满了业障魔抗,还一点都不怕自己。她不求回报地热心帮忙,甚至把魈当成朋友对待。
尽管关系拉近了些,魈和旅行者依然不算亲近,顶多是“这个人类挺有意思“的程度。所以他在故事结尾选择了主动“遣散”旅行者,自己一个人缅怀故友铜雀。
直到限时剧情海灯节—两人的关系才迎来了转折点。
海灯节是璃月人纪念英雄的传统节日。人们张灯结彩阖家团圆,在年末的夜晚放飞明灯,引导过往的英魂归乡。
可对魈而言,海灯节是魔神怨念在年末大规模爆发的时日,比平时的战斗更为凶险。在数千个海灯节的夜晚—璃月港灯火通明,人们在欢声笑语中庆祝佳节;魈却在无人知晓的黑暗中鏖战,直至天光破晓。
哪怕战斗结束—魈也只会回到望舒客栈,远远地眺望璃月港的满天霄灯。年年岁岁皆是如此。
这次海灯节在璃月港碰见旅行者,是因为魈感知到异常,以为城中有妖邪作乱才过来调查。发现只是盗宝团在搞鬼后,他就收了手。
然而—魈刚准备离开,以一如既往的方式度过这个节日—就被旅行者叫住了。
金发金瞳的女孩认真地对他说:“我们下次见面的地方,希望是能看到明霄灯的地方。”
魈愣了一下,随即冷冷地拒绝了邀请。在此之后,旅行者毫不气馁地邀请了许多次,魈也毫不意外地奉上了拒绝n连。
绝大多数人都会识趣地放弃。可这位姑娘却毫不灰心,直接在望舒客栈上演了霸道总裁经典情节。你不想去城里过节?好,那我就把海灯节给你搬过来。她召集客栈的老熟人们,共同为魈置办了一个迷你版海灯节。
于是当魈被旅行者叫到客栈底层时,他看到了完全出乎意料的场景:亲手编制的霄灯,几个温馨的节庆小吃摊,一大桌子为魈精心准备的美餐。远离城中的人烟与喧嚣,唯有二三住客的闲谈与饭菜的香味,挟着荻花洲的晚风拂过耳畔。
魈困惑不解,从来没有人为他做过这样古怪的事。明明被拒绝过那么多次,为何仍要为了自己大费周折呢?
而忙活了一整天,灰头土脸的女孩笑着回答道:因为这是属于你,属于璃月英雄,也是属于所有璃月人的节日。
(所以我想让你和大家一起,开开心心地度过海灯节,享受你应有的快乐。)
一顿饱餐过后,旅行者依旧没有放弃带魈去璃月港看灯的心愿。不惜撒娇耍赖,也要把魈拽过去。而实际上脾气很好,还被哄高兴了的护法夜叉大人,则无奈地应允了她。
最后的最后,魈也没有答应旅行者一起去城中看灯的请求。
可他站在距离璃月港咫尺之遥的山坡上,真情流露,向旅行者道出了自己 “讨厌人群”真正原因。在两千余年的苦行中—他早已忘记了如何融入人群,唯恐满手鲜血的自己,会玷污这烟花般脆弱而灿烂的盛世。
这是魈的真心话。无数个海灯节的夜晚,他一直深藏心底,没有向任何人吐露过的悲哀与孤独。
“一起去城里看灯”在璃月人看来只是再寻常不过的事情。对旅行者而言也只是一个友好的邀请。但对于魈而言,却是足以让他铭记一生的珍重回忆。
仙众时代落幕,夜叉一族销声匿迹,魈的终生信仰也退下了王座。魈是被新时代遗弃的罪人,他固执地坚守着过去的职责,继续着一场孤独的赎罪之旅。这是他应得的命运,他早已做好了死无葬身之地的觉悟。
所以他从未想过会遇到旅行者这样的人。
人们畏惧他,敬重他,信任他,怜悯他,有求于他....但从来没有谁像旅行者一样主动接近他,关心他,做了如此多的傻事—只为了让他开心,与他共度过一段美好的时光。
于是他给出了玩家津津乐道的承诺 “如遇危险,便呼我名”。这是魈是作为护法夜叉,对璃月众生的承诺。也是魈对旅行者无声的感谢。
除了一身的战斗本领,魈一无所有。他选择用最真挚最郑重的方式,来报答女孩的善意与热忱。
虽然表面不露声色,魈其实已经被旅行者打动了。
所以他没有离开,而是悄悄来到了不远处的山坡上。在海灯节的夜晚,第一次走近守护两千余年的海港,望着承载感恩与祝福的万家灯火照亮夜空,汇成了人间最美的星河。
这位饱经风霜的战士,像孩子一样睁大了眼睛。 脸上浮现的温暖笑意,融化了眉宇间的霜雪。
今年的海灯节与往年截然不同。因为他孤独的世界里,从此多了一团自星海而来的小小莹火。每当看到那微弱的光芒,魈便会想起海灯节之夜,旅行者被灯火点亮的温暖笑容。
她仿佛在对他说:你所经历的痛苦与煎熬都没有白费。你们所做的一切,都铭刻在了璃月的山河间,在万千岁月中永垂不朽。
哪怕罪孽深重,业障缠身—这世上依然有着愿意跨过血海拥抱你,只为了让你展露笑颜的人。
所以挺起胸膛,活的更加快乐一些吧。
因为你值得。
如果够肝够氪,你可以把所有喜欢的角色都塞进壶里,个个培养到好感度爆表。
但是从故事的角度—旅行者在旅途中遇到的所有人,都只是生命中的过客。终会成为回忆,随着时光慢慢褪色。
魈也没什么不同。只不过在目前的暧昧角色中,他是格外让人心疼,也是救赎意味最浓重的一个。
但是总体而言,魈和旅行者的关系停留在开放状态。以生日信件举例:可以理解为暧昧情愫—也可以理解为魈好久没见你,觉得你的黄脑壳上插晶蝶很好看,就抓了几只当礼物。
生日信件和家园好感语音嘛,基本每个角色都要发糖。这是角色养成系游戏的正常操作,当是回馈玩家看个乐呵就好。
顺带一提,原神的男玩家占多数。收到这封信的直男玩家比直女玩家多。所以说,这波应该是乙女BL双厨狂喜?
直男玩家们有何感想欢迎评论留言。
综上所述:我觉得不带恋爱滤镜,魈和旅行者的故事也挺动人的。异世的旅人与折翼的金翅鹏鸟相遇相知。惊艳了余生的漫长岁月,亦短暂如划破天际的流星。于是魈目送着你离开,振翅飞向他无法触及的天际。
当然如果你不喜欢,觉得这种情节侮辱了你心目中的魈也正常。角色理解这个东西仁者见仁智者见智。不过在官方没有盖章定论之前,一切暧昧情节只是在耍流氓,大可不必担心魈会因此成为恋爱脑。
这都第二年海灯节了,他不还是没有答应旅行者一起去城里看灯嘛。
我们的生命中都会遇见某位良人。他/她没有改变你的命运,也没能照亮你的整个世界。但是与其相遇后,你的世界似乎变得美好了一点。
从魈厨的角度看:魈能遇到更多喜欢他的人,不也挺好的吗?
很少有人不基于框架直接写GUI界面啦,我这个回答就从GUI框架反过来推什么语言做GUI合适。(只聊桌面端GUI编程框架)
几乎是C++领域最流行的跨平台桌面端软件开发框架了,这个框架是两个挪威人在1995年创建的,发展至今可以说历史相当悠久,稳定性也很有保障。很多大公司都在用它做界面比如金山的WPS。
它内置了自绘引擎,也就是说界面上的一个按钮,一个文本框,都是Qt的引擎自己画的,这保证了基于Qt开发的软件界面在不同操作系统上看起来是一模一样的。
它提供了大量的与界面无关但与软件开发息息相关的API,比如、网络、文件系统、剪切板等,而且让这些API在不同的操作系统下都有效,这极大的节省了开发人员的时间。
但它也有一些缺点,比如在处理一些特殊需求上很不方便,比如:目前Qt有没有比较好解决高分屏下缩放显示的方案?,Qt没有真正完美的无边框解决方案吗?等,在一些组件的渲染上也会出一些隐藏的较深的问题(QListItem),一旦遇到,就很难解决。
Qt近年来不太专一,qml,qtquick等,搞了很多,而且这些新玩意儿一直不温不火,有些模块做了又废弃了,比如:qt script,搞来搞去,搞的模块繁多且复杂,用起来不是很舒服。
Qt有界面描述语言(XML描述界面),可以通过设计器拖拽空间设计界面,编译期界面描述语言被转义成C++代码,性能上没啥损失。
Qt商业授权不太友好,开发商业应用一定要谨慎,之前听说有公司为此付出了高额的版权费。个人开发者可以免费使用。Qt的免费版本不允许静态链接,会有版权上的限制,但开发者还是可以通过一些特殊的编译方法静态连接Qt的库的。
除了使用C++开发Qt应用外,开发者还可以使用其他语言开发Qt应用,最流行的就是使用Python基于PyQt做Qt应用了,其他语言的绑定不是很成熟,但PyQt仍然有版权的问题。
GTK是1997年创建的,也非常成熟稳定,是C语言开发的,但有很多语言的绑定,比如官方支持的JavaScript、Rust等,当然用C++语言操作GTK也很方便,它也有自绘引擎(Cairo),也提供了大量系统相关的API,商业授权也非常友好,基于GTK开发商业软件不用担心收到律师函的问题,虽然它是一个跨平台桌面软件,但它似乎只在Linux操作系统领域流行,有非常多的Linux桌面软件都是基于GTK开发的。
这也直接导致GTK的维护者很重视Linux领域的发展,而忽视Windows和Mac领域。这个框架提供的很多API,只在Linux下有,Windows和Mac下没有。这样的API数量众多。甚至在Windows下编译一下GTK的源码都要比Linux下难很多。而且GTK的渲染引擎在Windows下性能表现也不如在Linux下好。
GTK在Windows上也没办法静态连接,它到不是因为版权的问题,而是它依赖MSYS2的一些库,这个库用于在Windows上模拟Linux环境,这也是为什么GTK在Windows上表现不佳的原因之一。
另外,由于GTK是C语言开发的,所以开发风格也很C语言化,这对于部分开发者来说可能觉得繁琐。
wxWidgets是1992年英国的一个大学教授开创的跨平台GUI软件,也非常成熟稳定,商业授权非常友好。它没有自绘引擎,而是对不同平台下的界面API做了整合和封装,这样开发者在Windows下开发的软件看起来就是Windows窗口风格、Linux开发的软件看起来就是Linux窗口风格,这对于某些软件来说,正是他们想要的,但要想搞一些花哨的特效就没那么容易了。它同样也提供了大量的系统相关的API供开发者使用。
它是C++开发的,所以对C++开发者非常友好,除此之外它还支持静态连接,也就是说开发个应用不用分发给用户一大堆dll,当然Qt也支持静态连接,但是你得自己编译Qt的源码(不是很方便),而且Qt的授权规则也不允许普通开发者这么做。
它会有些小问题,比如我之前提的:wxEVT_NOTIFICATION_MESSAGE_DISMISSED event emit twice,但总体来说还是非常稳的。除了开发的界面比较死板外,没啥大的问题。目前使用这个框架开发软件的人越来越少了。
fltk是1998年创建的跨平台开源GUI框架,历史悠久,商业授权友好,而且C++之父也用它,它非常轻量级,支持静态连接,一个简单的应用编译后只有500K左右,非常赞,
它有自己的自绘引擎,没记错的话用的是OpenGL,但它的重绘机制是按区域重绘的,如果组件A所在的区域上存在组件B,那么A组件重绘时,会把B组件的给重回掉,开发者必须自己写代码处理这种情况。想象一下,如果你想实现一个A组件fade out的同时B组件fade in的效果,就会非常麻烦。
FLTK提供的一些组件样式都比较刻板,绘图API也比较少,你想实现一个漂亮一点的圆角按钮(它内置圆角按钮的圆角大小是不能改的),必须自己画,而且还得借助一些非常奇葩的手段才行(如果你想知道,可以联系我)
它是C++开发的,但API不够现代,用起来总体还算舒服的,它有Rust绑定:fltk-rs。它的用户比前面三个都少。它提供了一些与界面无关的操作系统API,但非常少,几乎可以忽略。
Duilib
是2010年国内一个开发者开发的GUI开发框架,因为底层基于DirectUI开发,所以只支持Windows平台,不支持跨平台,开源协议友好,商用没有任何问题(需要附加Lincence文件),国内有很多大厂基于这个技术做桌面端应用,比如网易、腾讯、百度,这个框架是基于C++开发的,对C++开发者友好。但框架本身还有一些问题,比如对高分屏支持不佳、特殊控件绘制上也有一些小问题,除了界面相关的API外,几乎没有提供系统级的API,作者纯粹是用爱发电来开发这个框架,所以更新不是很及时。
相对来说网易基于Duilib开发的分支更完善一些:NIM_Duilib_Framework,添加了高分屏支持、多国语言、整合了多线程处理的支持,但环境搭建相对比较麻烦。如果开发者要用这个框架,一定要用develop分支下的代码,master分支下的代码问题很多,这个框架看上去也是作者一个人努力的成果。
Sciter是2006年创建的跨平台闭源GUI框架,足够稳定,商业授权不友好,但个人开发者可以随便用(只能用动态链接库),一旦公司规模超过3人,就得买版权了(有权静态连接)。
它内部封了一个浏览器核心,让开发者使用HTML,CSS,JS来创建界面,但对这个浏览器核心做了大量的精简,不像Electron和NW.js动辄上百兆的体积,它只要6M就够了。当然这也意味着有些浏览器特性它是不支持的,比如CSS3的flex布局,它就不支持(但它提供了自己的flex布局实现方式)。以前它使用自研的一个脚本语言(和JavaScript很像),自从集成了Fabrice Bellard大神的QuickJs之后,就全面支持JavaScript了。它还对一些特殊的场景做了内置的支持,比如渲染大列表。
它使用C++开发,对C++开发者很友好,有Rust、go、Python等语言的绑定,但都是社区提供的,质量堪忧。有很多知名厂商都用这个库做界面,比如360、teamviewer、赛门铁克等。
RmlUi和Sciter很像,可以看成Sciter的替代框架,但RmlUi这个项目有三界作者,一个一个的弃坑不知道新任作者会不会弃坑,目前还不是很成熟,比如我正在尝试帮作者解决的CJK输入法的问题,目前还不推荐大家使用这个框架。
CEF是2008年创立的,基于Chromium的跨平台GUI框架,稳定且商业授权友好,国内很多大厂都用的CEF:比如微信桌面端、网易云音乐桌面端、QQ桌面端、微信桌面端、MATLAB、FoxMail、OBS Studio,装机量破亿。
由于它几乎封了一个完整的Chromium,所以体积非常大,但支持所有的HTMLCSSJS特性,它几乎不提供任何与操作系统相关的API,创建个托盘图标、读写个文件啥的,都要开发者自己完成,它是C/C++开发完成的,对C++用户非常友好,它有gopythonjava等语言的绑定,但都是社区提供的,质量值得担忧。
它对Chromium封装的很好,避免了开发者直接与Blink、V8、Chromium等复杂的代码打交道,很多功能都有默认实现方式,遵从约定由于配置原则,有经验的C++开发者可以很轻松的驾驭CEF框架。
由于Chromium是版本弟,所以CEF版本发布也非常频繁,很多被标记为稳定的版本,还是会出一些莫名其妙的问题,选一个好的版本非常重要。
与Electron一样,它也是分主进程和渲染进程的,所以开发者要非常娴熟的运用跨进程通信的技术,虽然CEF提供了跨进程相关的API,但复杂度还是有点高的,使用的时候要认真细心。
这是微软的跨平台GUI框架,不仅仅支持桌面端,还支持移动端,但官方并不支持Linux的桌面端(黑人问号,感觉与微软近些年向开放、开源的大方针相悖),这个框架新的狠,至今还没发布稳定版。目前还没什么人用。而且不知道将来会不会被微软放弃。
它是.NET平台下的GUI框架,有自绘引擎,对C#开发者很友好,界面依然是用XAML描述的,可能很多人一听到XAML就直接弃坑了。XAML表现力确实弱一些,我觉得WPF没火起来跟XAML有直接关系。
使用这个框架开发桌面应用得封一个.NET框架给用户,当然有了.NET框架应用程序访问一般的系统级API也就不成问题了。
这是JetBrains搞的跨平台GUI框架,也非常新,前段时间刚刚推出1.0.0版本,但这个版本还不是很稳,至少比Flutter Desktop的第一个稳定版要差很多。同样也几乎没什么人用。
它的自绘引擎用的是Google的skia,这个自绘引擎稳的很,Chrome和Flutter都是用的它,所以排版、绘制、渲染之类的工作不太会出问题。比Java生态圈里的Swing和JavaFx要好很多。
JetBrains的东西当然对Kotlin开发者友好啦,Java生态下的很多东西你都能用,访问系统级API也没啥大问题,同样也得考虑封一个JRE给用户。
这是谷歌的跨平台开发框架,开源、免费、文档齐全、投入力度大且持久,同样也新的很,Windows版本刚刚发稳定版,Mac版本还没稳定。
如果你完全没搞过移动端的flutter,想用这个框架开发桌面应用,那么意味着你要学的东西还挺多的。好在dart和flutter入门都不是很难,学习曲线比较平缓。
由于flutter在移动端积累了很多年,所以界面上的一些东西在desktop端都比较稳(skia自绘引擎),与操作系统相关的东西还不成熟,生态也不太好,比如你想订制一下窗口的标题栏,想访问一下注册表这类工作可能得自己想办法。不过它有类似FFI的支持,跟C/C++语言打交道很方便。
开发者直接使用Dart语言描述界面,这会导致众多大括号嵌套在一起的问题,可能很多开发者不习惯。
这是微软Edge浏览器团队推出的跨平台GUI引擎,是闭源的,目前只支持Windows,对C#和C++开发者友好,如果使用C#开发,就得考虑把.NET运行时分发给用户,如果使用C++开发,就得自己处理系统级API的操作,webview2本身是不对系统级API做封装的。
这个框架推出也没多久,很多API也还不稳定,更值得担忧的是这个团队,他们前不久刚刚放弃了自己的浏览器核心转而使用Chromium浏览器核心,不知道他们会不会放弃webview2这个框架。
它的优势是可以复用系统当中已存在的webview2二进制资源,也就是说它虽然封了一个Chromium浏览器核心,但如果你可以确定客户电脑已经存在了基于webview2开发的应用,你的安装包体积可以足够小。
它也是多进程架构,甚至比Electron还要多一个进程(为了复用二进制资源),资源占用比较多。
这个库使用操作系统的浏览器引擎来达到减小安装包体积的问题,Mac上使用Cocoa/WebKit,Linux上使用gtk-webkit2,Windows 10上使用Edge(也就是上一个小节里提到的webview2),它应该是不支持Win7的。开发者要考虑前端代码浏览器兼容的问题。
开源且免费(MIT)有go、Rust、Python等语言的绑定,不过官方支持的是go语言,C和C++,操作浏览器的API非常少,不支持自定义scheme,更别提系统级API了。
采用的技术方案与webview类似,所以安装包也足够小,非常新,还没发布稳定版,开源免费。webview框架碰到的问题TAURI都有,
使用Rust开发,将来会支持Deno,作者说将来会直接使用webview的技术来支持多平台,
NW.js最早把Chromium和Node绑定到一起,用前端知识做界面,用Node技术访问操作系统,最早叫node-webkit,在2012年创建。NW.js基于MIT开源,可以无忧使用。没记错的话,微信小程序开发工具是用NW.js开发的。作者是英特尔的员工,英特尔的一些工具也是用NW.js开发的。
除了Chromium和Node的能力外,NW.js自己也封装了一些系统级API,类似托盘图标、剪切板、系统菜单这种,但数量明显比Electron要少。
NW.js可以在多个窗口间共享同一个Node.js上下文,而且还可以通过配置让Node的上下文和Dom上下文混合,这给开发者带来了很多便利。心智负担减少很多。不像Electron要时刻想着进程间通信,哪些模块当前进程不能用这类问题。
NW.js虽然起步早,但奈何没有杀手级应用,周边的生态和工具链没发展起来。用的人越来越少,维护的投入也不如Electron大,再加上Chromium更新非常频繁,导致NW.js的有些API也不是很稳,恶性循环加剧。
Electron的作者曾经在NW.js团队工作过(NW.js项目贡献第二多的人就是Electron的作者),后来辗转到了github公司,于2013年在创建了Electron,也是个开源免费的产品。由于VSCode、slak等国际型产品都选择了Electron,所以从者甚众,生态和周边工具链也完善的多。虽然开发方式上有点蹩脚的地方(多进程架构及模块归属进程),但瑕不掩瑜。
Electron每创建一个窗口都会多一个进程,这使Electron创建窗口的效率不高(秒级),NW.js有复用进程的机制,即使新窗口加载完全不同域的页面也不会创建新的进程(毫秒级)。这也是为什么很多基于Electron开发的应用都使用Dom模拟弹窗的原因。
无论是浏览器相关的API,还是系统级API,Electron提供的都比NW.js多。
--------2022-02-25更新--------
这些框架除了对开发者使用的编程语言有要求外,还有一个重要的差异就是有没有独立的界面描述语言(也就是UI DSL),这非常重要,涉及到一个框架表达业务的重要能力。
类似XAML、qt的ui文件、HTML+CSS都是界面描述语言,下面这种也可以算界面描述语言,但我感觉它不够纯粹(flutter、qml和Compose Multiplatform都是类似这样的):
panel { row { checkBox(...) row { textField(...) // indented relatively to the checkbox above } } }
但无论如何,显而易见的是,没有任何一个界面描述语言能比的上HTML+CSS组合。想想看:HTML里各种花里胡哨的语义化标签和Dom操作技巧,CSS里的布局方式、伪元素、动画描述...,对比之下你就会觉得XAML、qml直流都是弟弟。
除此之外,一个优秀的GUI框架还有两个重要的需求,这里我简单聊聊:
强大的事件处理机制必不可少。
想想这些:鼠标事件、键盘事件、触屏事件...界面加载完成、媒体播放结束、元素大小改变...网络状态变更、数据段传输完成...另外,还得处理事件冒泡、事件捕获、事件分发吧...
qt的开发者曾经说过qt的SIGNAL和SLOT机制是有性能问题的(但影响很小)
强大的异步处理机制必不可少
你不能在用户处理业务逻辑的时候,让界面渲染工作阻塞,这就需要一个强大的异步处理机制,让开发者自己去开线程去完成业务处理,无疑是又麻烦又会增加开发者的心智负担。
我记得很早之前在C# WinForm应用中,点击一个按钮,如果不用Invoke执行逻辑处理的话,界面就会卡死。
这么看来,在你的GUI应用里包一个浏览器核心还是挺有必要的,这样你就可以用HTML+CSS强大的能力来描述你的界面,用JavaScript强大的事件处理机制和异步处理机制来完成用户交互。
可能有人会想,这会带来很多问题呀,比如应用体积会增大的100M以上、会占用更多的CPU和内存资源,还会更耗电等等。
确实,目前来看这些都是问题,但仔细想想,这些问题应该不会持续太久,网络会变的更快,用户的磁盘和内存会变得更大,CPU处理能力也会更好,耗电的问题当然会持续存在,甚至会愈发耗电,但电的供应会持续增长呀。
web相关的技术之所以胜出,并不是这些技术的设计者有多厉害,而是这20多年间,有大量的人涌入了这个领域,前赴后继的推动着它前进。其他任何一个领域都没有这么热火朝天的景象。推荐大家看看我的另一个回答:
------------2022-02-27更新----------
用Web相关的技术做GUI应用的优势是,让开发者可以把大部分精力投注在业务本身上,而不是处理与GUI相关的技术细节。
实际上所有的框架,都应该是这个目的,比如ORM框架,目的应该是让开发者把大部分精力投注在业务与数据之间的关系上,而不是管理关系型数据的技术细节。
当然这肯定是有损耗的,在性能、稳定性、资源消耗上,都会有所削减。而且,因为有框架的存在,开发者很难深入到框架内部做一些特殊的事情。比如,我们该如何修改HTML的排版渲染机制呢?
所以,有些框架注重性能,有些框架注重开发效率,开发者做选择题的时候也应该衡量这两个问题,你的应用对哪些方面要求多一些呢?
你如果要开发一个视频监控系统,没多少业务功能,但要24小时不间断的记录视频数据,随时调取某一段时间的视频数据,这种应用可能Qt是最好的选择。
你如果要开发一个类似飞书的团队协作应用,业务逻辑复杂的一塌糊涂,而且要在短时间内满足更多用户的需求,占领更多的市场,那么Electron可能是更好的选择(目前飞书已经不再用Electron了,他们自己编译了Chromium核心,自己封了一个类似CEF的框架)
目前微软、谷歌、JetBrains等公司都非常重视桌面端开发框架,也在推各自的框架产品,说明桌面应用领域并没有没落,反而应该更加受到重视。
虽然移动端应用大行其道,但我认为,只有生活、社交、轻娱乐等方向上的应用在移动端有较好的发展。文档协作、大型游戏、开发工具、专业管控软件等应用还是在PC端发展的更好一些,毕竟PC端有更多样的输入输出设备、更广阔的显示和交互的空间,更强的存储和计算能力。
希望桌面软件开发领域的从业者都能获得幸福。
满屏荒唐言,一把辛酸泪,一把辛酸泪,一把辛酸泪...