找回密码
 立即注册
查看: 609|回复: 5

Unity引擎有哪些设计上的缺陷?

[复制链接]
发表于 2023-5-21 14:18 | 显示全部楼层 |阅读模式
Unity引擎有哪些设计上的缺陷?
发表于 2023-5-21 14:19 | 显示全部楼层
Unity确实有很多“特点”,说成是“缺陷”有点不公平,不过问题肯定还是有。
其它答主说到很多重点,这里也来随便说说。
1、很多API和Editor代码只能主线程执行,这可能不是缺点,主要是需求限制

Unity在刚推出时只是个小不点,能和UE、CryEngine等等引擎硬刚,还是凭借它的简洁、高效、架构新颖。
Unity的逻辑架构几个词就能概括——场景,物体,组件,父子关系;相比之下,UE不把那一堆继承关系搞清楚是说不清的。
“只能主线程”这个问题也是类似的。Unity在渲染、物理、加载等方面一直在积极做多线程改造,到目前已经是相当成熟了。
但在很多可以自定义的地方,一旦兼容多线程,潜在的BUG会呈指数级增加。传统的Editor脚本设计也是状态强相关的,必须按顺序执行,想改只能大改。
这就是易用性和高性能的矛盾了。Unity是靠简洁性起家的,战略上不可能捡了性能丢了易用性。步子迈太大,导致一大堆成熟的插件不兼容,就很难收场了。
2、使用插件做扩展的思路很好,问题是做出好插件太难

Unity的资源商店(Asset Store)一直被认为是一步好棋,都是当优点介绍的。
新版本的Unity功能不断增多,为了保持核心系统的苗条,Unity把核心系统与周边系统拆开,把周边系统做成Package,可以由用户自己选择导入或不导入。
这样,第三方插件与第一方功能都可以作为Package进行管理。其实这一设计没错,也是好棋。
问题在于,使用插件必须经历 调查研究——购买——改进 的过程。
每个开发者自行选购插件,带来的结果是大家用的插件可能都不统一。无论再优秀的插件,用的人少,测试量不够、维护量不够,都很难成熟起来。
举个实际的例子,“角色控制器”Charactor Controller。大家知道,写出好用、通用的3D角色控制器很难,因为游戏类型太多,需求差异很大。
UE的做法是提供内置的标准角色控制器,不管好不好用,反正默认大家都会用。然后在测试、迭代中不断添加新功能,改进原有功能。
几年后,角色控制器这玩意已经变成了一个非常复杂的庞然大物,几乎能满足99%的常规需求,拿来就能用,但想改也不好改。
相比之下,Unity至今也没有什么特别好用、特别普遍的角色控制器。好在你去资源商店里可以找到适合特定用途的控制器,自己改起来也不难。
这就是两种设计理念带来的不同的结果。其实与技术关系不大。
还有很多类似的情况——比如Unity常用的输入系统目前是 传统Input Manager、新的Input System、以及商用插件Rewired三足鼎立的状态。



著名输入系统插件Rewired,使用简单,对次世代游戏主机支持良好

再比如2D骨骼动画,有人在用新的2d Animation,但商业游戏还是Spine靠谱。
至于热更新资源管理Addressable Assets、快速建模插件Probuilder等等,也无一例外,都是90%好用,总有那么10%的缺陷。
3、序列化采用YAML是个大问题(meta、prefab、scene文件都是YAML)

很多新的开发者没有注意到一个问题——其实文本形式的配置文件,分析加载是很慢的。包括JSON和Unity采用的YAML。
Unity生成的所有配置文件,包括scene、prefab、scriptable object、anim等等,都是采用同一种配置文件格式。
这样做的好处是与Unity Editor兼容,方便在界面上编辑。
但当你的配置文件总量达到几十兆,而且游戏又在手机上运行时,那单纯加载scene、prefab、Scriptable Object文件的时间可能会占几秒、十几秒。
Unity在开发者的压力之下提供了二进制的配置文件,可以在工程设置->Editor里修改Asset Seriallization(资产序列化方式)->Mode = Force Binary


但如果你分析一下二进制配置的结构,会发现其实它仅仅是对YAML的小改动,加载会略快,但总体结构并没变,总体性能还是快不到哪里去。
在保存关卡数据时,如果你采用自定义序列化、或者C#序列化的方式,能极大改进数据加载、存储的性能,远超Scriptable Object。但这些需要额外写代码,而且不能被Unity的编辑器识别。
我们团队曾经接手过一个优秀的Steam游戏,它的大量地形数据就是用Scriptable Object保存的,在电脑上加载就挺慢,在手机上就更无法忍受了。
总结:是问题,也是机遇

以上只是挑了几个常规的方面来谈。
如果涉及到渲染流程、着色器管理等方面,等展开说的问题就更多了。
总的来说,Unity依然是一门普及、易上手、上限也很高的游戏引擎,很难说它不优秀。包括即将大规模流行的便携式VR(Pico等等),与Unity也是天生一对。
Unity的缺点并不影响你做出优秀的作品。如果你能了解到Unity的优缺点,扬长避短,弥补它的缺点,那么你就能在市场竞争中获得一定优势。
这一点对所有人都是公平的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-5-21 14:20 | 显示全部楼层
开了很多坑,但是填坑的人跑了
发表于 2023-5-21 14:20 | 显示全部楼层
Unity加载很慢估计底层加载线程只有一个,各种api操作只能在主线程,有时候遇到一个bug无法解决等时候,去看Unity新版本发布日志居然可能会解决。遇到过一天一次搞激活的烦心事,Unity基本能用,但是深入一点又很麻烦,搞大制作时候就显得很鸡肋
发表于 2023-5-21 14:20 | 显示全部楼层
所有API只能主线程访问,无论你自己的代码多线程做的多好,最终落地还是GameObject,还是那堆组件类,还是得主线程处理这些玩意的创建,还贼慢,结果就是Unity游戏往往很吃CPU,这也是为什么Unity游戏在高端机上帧率表现不佳,因为都卡在一个CPU核心上了。
尝试过完全脱离GameObject那套,但是最终渲染落地仍然需要走Renderer组件,否则DrawCall的提交单靠Graphics接口和CommandBuffer接口效率奇差,ComputeShader去发起DrawCall的MultiDraw相关接口到现在还没支持,所以这条路也断了。
----更新---
评论区有大佬指出DOTS快要出正式版了(2022LTS),关心这块性能问题的可以关注官方的roadmap,如果后续出了之后有机会用这个做大型项目,我也会更新一下这里。
DOTS Roadmap
发表于 2023-5-21 14:21 | 显示全部楼层
不开源。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 22:53 , Processed in 0.106743 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表