《戴森球计划》:游戏性能优化(前篇)

《戴森球计划》:游戏性能优化(前篇)

题图:戴森球与行星级生产基地


目前这个存档的游戏时间是118小时。

游戏玩到后期卡吗?这也许是大家最关心的问题之一。

数千艘运输机在忙碌,数千座设施在运作,数万个太阳帆在环绕,数十万货物在运送,斗转星移,地面上所有太阳能板都面朝着太阳… 这计算量可不是闹着玩的!而以上还只是这一个星球。


本篇我将主要介绍为了保证游戏的流畅性,我们是如何实现游戏性能优化的。由于该话题涉及的内容与技术细节实在太多,所以我打算将优化系列分为三篇开发日志,粗略的谈一下我们所用的方法与技术。

游戏的帧率机制

游戏中的帧率分为渲染帧和物理帧:

渲染帧主要负责渲染游戏画面;

物理帧主要负责运行游戏逻辑。

《戴森球计划》:游戏性能优化(前篇)

我们在游戏中制作了帧率计数器以监控实时性能,其中左边的数字是渲染帧,右边的数字是物理帧。也可以在设置面板中设定渲染帧的帧速率。当开启垂直同步时,渲染帧速率会和显示器刷新率一致。

《戴森球计划》:游戏性能优化(前篇)


帧速率越高,GPU 的使用率也就越高,当使用率接近100%时,就会自动降低画面帧率。


在游戏的生产系统中,我们需要一套能精确量化,服从“决定论”的逻辑,即同样的操作只能导致同样的结果。要抛开帧率带来的影响,首先是游戏中所有的时间必须按物理帧计数,例如制造时间为3秒的“电弧熔炉”,其实在内部逻辑里就是180个物理帧。再例如360kW的工作功率,在内部逻辑里其实是每个物理帧消耗6kJ的能量,颇有一种“量子化”的感觉。

《戴森球计划》:游戏性能优化(前篇)


根据以上的逻辑,负责游戏逻辑的物理帧必须相对稳定,不能被渲染帧率所影响,否则玩起来就会感觉时间一会快,一会慢,所以我们将物理帧率锁定为60帧,只有当渲染帧率太低时,才会折减物理帧率,以免塞帧。

使用 DOP 来代替 OOP

DOPOOP分别指“面向数据编程”和“面向对象编程”。具体的比较可以写好长一篇文章,而且前人已充分讨论,所以这里就不赘述了。简单来讲,在面对游戏中大量物件的情况下,面向对象会造成许多不必要的开销,造成性能低下,而面向数据编程则将对象中的属性逐一拆分出来,形成紧密排列的数组,使得相关逻辑能够更快速的进行遍历,甚至一些数据还能直接传给 GPU 来处理。

那么为什么大家不都用DOP来代替OOP呢?这是因为“面向对象”更符合人们的认知和代码书写习惯,也便于项目管理,而“面向数据”的代码写起来有一些反人类,有时甚至相似的结构写好几遍,不方便管理,但实际运行效率却极高。所以为了游戏的优化,我们还是选择了“面向数据”来作为该项目的编程核心思想与框架。


读起来太晦涩了吗?那实在不行的话我们就这样吧!

《戴森球计划》:游戏性能优化(前篇)


不开玩笑了,回到正题

物理帧的大部分工作是由 CPU 来完成的,要维持60的帧率,一个物理帧允许的 CPU 处理时间不能超过16ms(毫秒),除开提交DrawCall渲染的时间和其他必须的开销,只有大约11ms可用于一帧的游戏核心逻辑。

单核游戏?多核游戏?都不是,这是一个 GPU 游戏!

目前 CPU 的性能发展遇到了瓶颈,已经没办法再大规模提升单核性能,只能靠提升核心数量。而在很多实际应用的情况下,对核心数量的提升,远不如增加一点点单核频率提升的性能多。

虽然我们在星系的随机生成及模拟、星球地形动态生成、无缝加载等逻辑中使用了多线程来缓解主线程的压力,但是对于游戏逻辑中如此庞大的计算量,就算有100个核火力全开多线程完美配合也未必驾驭得了!


从《戴森球计划》的想法诞生之初,就决定了这是一个 GPU 游戏。看那数万颗太阳帆,每一颗的运动都遵循着万有引力定律,每一颗都在计算发电量,每一颗都能被近距离观看。像大规模并行计算这样的工作,使用 GPU 是不二的选择。

《戴森球计划》:游戏性能优化(前篇)


我们将凡是可以并行计算的那部分计算工作,全部交给了 GPU,剩下的那部分计算量,只要 GPU 能在16ms之内按时渲染出来,CPU 就绝不会掉链子!

这同时也意味着,好的 GPU 的确能为《戴森球计划》带来更流畅的体验,而 CPU 的影响则相对较小。

使用 GPU 来渲染大批量动画

在现今主流游戏引擎中,动画大多是靠移动部件或骨骼的位置(Position)、旋转(Rotation)、缩放(Scale)来完成的,如下图:

《戴森球计划》:游戏性能优化(前篇)

该建筑的动画是靠旋转移动部件来完成


就是这样一个建筑,它的动画部件已超过50个,其中还包括父子Transform层级的嵌套,假设我们有1000个这样的建筑,那 CPU 需要同时处理的动画子部件就有超过50000个,这显然是 CPU 驾驭不了的,而这还仅仅只是建筑动画,并不是核心逻辑。

《戴森球计划》:游戏性能优化(前篇)


用 CPU 去逐一计算这50000个部件的 Transform 的确是相当不划算的,这些动画其实可以并行计算,只要在画面帧结束时,所有建筑的动画均就绪即可,这对于具有强大并行计算能力的 GPU 来说简直就是小菜一碟。

我们在编辑器中将这个建筑的所有动画帧中所有的顶点位置、法线等信息按照一定的顺序,事先录制在一个VERTA文件中。

《戴森球计划》:游戏性能优化(前篇)


当游戏加载时,只需要载入这些文件,通过ComputeBuffer将所有信息传递给 GPU,这样 GPU 就拿到了所有建筑动画的预烘焙信息,接下来再将每个建筑的动画状态组成一个数组,传给 GPU。

《戴森球计划》:游戏性能优化(前篇)

每个建筑的动画状态数据


最后,还需要在vertex shader中分析这些数据,逐一还原每个建筑在当前帧的建模。

《戴森球计划》:游戏性能优化(前篇)

vertex shader中还原当前帧建模部分代码

《戴森球计划》:游戏性能优化(前篇)


按照这个思路,我们成功使用GPU Instancing还原了所有建筑的动画,还顺便使用了建筑状态数据来控制建筑贴图上指示灯的开关。在动画和建筑状态更新方面,CPU 被完全解放。而在 GPU 中,仅仅只是多了 150MB 左右的显存数据用于存储所有建筑的动画数据(仅相当于几张4096贴图)与若干在vertex shader中的寻址与插值计算。可以说是一顿免费的午餐了!

粒子特效

为了将特效渲染纳入上面的框架中,所有的建筑特效均无法使用引擎自带的粒子特效,必须将原本是作为粒子来渲染的特效包含在模型网格中,再使用shader来逐一实现各个建筑不同的特效需求。

《戴森球计划》:游戏性能优化(前篇)

特效片元在制作时就包含在模型中


在游戏中,几乎每一个不同的建筑都定制了不同的shader,对于同一个建筑特效的不同片元,我们按照类别涂上不同的顶点色,哪些是辉光,哪些是要拉长的,哪些应该从下至上亮度递增,通过不同的片元顶点色,就能做不同的处理。

《戴森球计划》:游戏性能优化(前篇)

整个建筑的动作与特效在一个 shader 中实现


需要时刻朝向太阳方向的建筑,逻辑不能让 CPU 来处理。我们将建筑模型按照“底座”、“横向转动部分”、“俯仰转动部分”涂上不同的顶点色加以区分,再在shader里面计算这些顶点应该如何旋转,从而朝向目标点。

《戴森球计划》:游戏性能优化(前篇)

朝向太阳的shader代码节选


有了这套机制,我们就只需要在主线程中计算好每个建筑当前的状态,形成ComputeBuffer,传递给 GPU 来进行统一渲染,在这个过程中,动画、IK 朝向、特效、自发光变化等等,就统统都有了。

Unity Profiler 性能测试

说了这么多,直接上目前的性能测试图吧!

下面是100小时规模的存档在 Unity Profiler 里面的性能测试图

《戴森球计划》:游戏性能优化(前篇)


《戴森球计划》:游戏性能优化(前篇)

开发机配置


从图中可以看到,游戏主逻辑物理帧 CPU 耗时5.11ms,也就是说理论上每秒可以跑到195个物理帧,所以 CPU 这边肯定是没问题,而最终画面能跑多少帧,就看 GPU 的能力了,我的卡是 660Ti,在畅玩了100小时后,还能跑上40帧,不过我们还将继续不懈的优化,争取将我这张卡的帧率提到60


除了物理帧的优化以外,我们还非常看重 C# 的垃圾回收机制的优化,因为过多的内存垃圾会导致游戏时常卡顿,严重影响游戏体验。

一般来讲,每次触发垃圾回收机制都会出现不同程度的卡顿,卡顿出现的频率取决于GC Alloc的大小,而每次卡顿的时间取决于数据结构的复杂度。


为了尽可能消除游戏卡顿现象,从立项开始,程序在数据结构上就严格把控,能用数组的地方用数组,尽量少的使用DictionaryList,凡是物理帧的逻辑除数组扩容等操作以外,均不能产生GC Alloc,在 UI 逻辑中严格控制字符串的操作,避免不必要的开销。

据测试,目前游戏的GC.Collect卡顿时间已控制在30ms以内,出现频率为几乎没有。

下图为100小时规模下的 GC 性能统计:

《戴森球计划》:游戏性能优化(前篇)


游戏主逻辑在物理帧上的GC Alloc0,只有 UI 上有132字节的开销,加上一些引擎必要的开销,每帧总的GC Alloc5.0KB,目前这个数值处于非常低的水平。


本篇完

在下一篇优化日志中我会介绍物流运输机、戴森云的优化,看看 GPU 是如何轻松达到“数十万”这个数量级!



《戴森球计划》:游戏性能优化(前篇)


《戴森球计划》:游戏性能优化(前篇)《戴森球计划》:游戏性能优化(前篇)

《戴森球计划》:游戏性能优化(前篇)

上一篇:价值288元游戏免费领!CDPR再道歉并免费送!《仙剑7》解锁!《生化危机8》将公布!
下一篇:

相关推荐

云游戏时代,内容与渠道之争可望水落石出

云游戏时代,内容与渠道之争可望水落石出

501 游戏头条

游戏头条微信号:gametoutiao(←长按复制)中国首家顾问式新媒体定制属于您自己的媒体内容导语:优质内容永远是最稀缺的。随着游戏版号收紧,游戏研发门槛日渐提高,拥有优质产品的头部研发商的议价能力也将逐渐提升。在渐行渐近的云游戏时代,开发商、渠道商和用户之间必将出现适应时代发展的游戏新规则。近年来,中国一直是全球游戏发行成本最高的国家。国内安卓渠道50%

英雄体育VSPN收购香蕉游戏 王思聪出任副主席

英雄体育VSPN收购香蕉游戏 王思聪出任副主席

690 网游圈里的那些事

今日(1月15日)英雄体育VSPN官方宣布,已收购香蕉游戏传媒。原香蕉游戏传媒创始人王思聪出任英雄体育VSPN战略委员会副主席。完成收购后,香蕉游戏传媒将作为英雄体育VSPN旗下独立品牌,继续保持独立运营。官方原文:2021年1月15日,英雄体育VSPN宣布收购香蕉游戏传媒。原香蕉游戏传媒创始人王思聪将出任英雄体育VSPN战略委员会副主席。完成收购后,香蕉游

香蕉游戏被收VSPN收购 王思聪从创始人变成副主席

香蕉游戏被收VSPN收购 王思聪从创始人变成副主席

1125 唯电竞

英雄体育VSPN官方宣布,已收购香蕉游戏传媒。原香蕉游戏传媒创始人王思聪出任英雄体育VSPN战略委员会副主席。完成收购后,香蕉游戏传媒将作为英雄体育VSPN旗下独立品牌,继续保持独立运营。官方原文:2021年1月15日,英雄体育VSPN宣布收购香蕉游戏传媒。原香蕉游戏传媒创始人王思聪将出任英雄体育VSPN战略委员会副主席。完成收购后,香蕉游戏传媒将作为英雄体

有生之年通关所有CRPG游戏,他能成功吗?丨触乐

有生之年通关所有CRPG游戏,他能成功吗?丨触乐

391 触乐

“我已经超过10年没有在电脑上玩过其他RPG游戏了。”如果你想尝试游玩某个品类的所有游戏,肯定需要投入大量时间和精力。如果你希望按照游戏发售的先后顺序,通关历史上属于同一品类的所有作品,并用文字记录游玩体验、心得以及对游戏的评价,那更是一项浩大工程。2010年2月15日,网络博客CRPGAddict的作者切斯特·博林布鲁克(ChesterBolingbrok

价值288元游戏免费领!CDPR再道歉并免费送!《仙剑7》解锁!《生化危机8》将公布!

价值288元游戏免费领!CDPR再道歉并免费送!《仙剑7》解锁!《生化危机8》将公布!

879 Steam社区

导读1、喜加一238元《星球大战:前线2》下周《银河文明3》2、喜加一:《轰炸机小队》Steamkey免费领原价50元3、CDPR就《2077》再道歉并奉上免费DLC4、《仙剑奇侠传7》试玩版将于今日中午12:00正式解锁5、《生化危机8:村庄》将于1月22日公布首个实机演示6、重建美利坚建造经营《建造与探索:美国》上架Steam1喜加一:《星球大战:前线2

《游戏王》中的口胡,打牌时真的可以做到吗?

《游戏王》中的口胡,打牌时真的可以做到吗?

969 游戏研究社

在实体卡的努力还原下,其实还是有机会的。从词语本意出发的话,“口胡”源自单字“㗅”,这个在如今汉语体系中并不常用的语气词源于港漫,并在中国早期ACG爱好者群体中逐渐泛化为表达“唬人”“胡说”一类语义的流行语,被广泛活用于2000年代的中文互联网生态中。就是这么一个语义并不太好的,甚至在绝大多数领域都已经过时、少有人再用的词汇,却在《游戏王》圈被人津津乐道,以

赵小棠、杨蓉谈性骚扰经历:那个被她叫“叔叔”的人,说要和她玩个“游戏”......

赵小棠、杨蓉谈性骚扰经历:那个被她叫“叔叔”的人,说要和她玩个“游戏”......

1055 超级育儿师

作者|张图图最新一期的《姐妹们的茶话会》,聊到了一直以来很敏感的性教育问题。日本嘉宾林绘梨华说到日本高中女生,在回家的电车上可能会受到一些骚扰,但更多的时候,她们不敢说出来,而是反过来怀疑自己,是不是自己穿的裙子太短了,认为是自己的错。赵小棠想起自己的经历:坐地铁的时候被别人摸,当时她的第一反应是破口大骂,转头大声问“谁摸我!”赵小棠明白,当你这样大骂一句后

展望游戏音频设计的发展方向

展望游戏音频设计的发展方向

909 GameRes游资网

原文地址https://zhuanlan.zhihu.com/p/336691565作者:希辰XichenNExTStudiosAudioDesigner今年年中的时候,与朋友做了一期名为《2020了,游戏还能给我们带来什么》的播客节目,作为一个坚定的技术派,我在其中表达了一个观点,新体验的产生很大程度上依赖于硬件性能的提升和开发工具的进化。如果把问题具体到

萌宠

小时候是个俊俏小奶猫,过了1年多,这前后差距简直判若两猫!

1927 我和宠物的日常

饲主江小姐这天分享爱猫「阿宝」小时候和现在的对比照片,只见当初它还是个下巴尖尖、长相俊俏的小帅哥,想不到才过了1年多的岁月,就变成一副老神在在的「老头样」,前后差距跟简直判若两猫,让饲主不禁傻眼直呼,「你才1岁半可以不要这么老头吗!」阿宝小时候的可爱模样。江小姐接受访问时表示,以前跟老公养的1猫1狗先后年迈过世,原本并不打算再养宠物,但去年看到原本常去的动物

《黑神话:悟空》仅排第二!《赛博朋克2077》玩家流失远超《巫师3》!《怪猎》大消息!
游戏

《黑神话:悟空》仅排第二!《赛博朋克2077》玩家流失远超《巫师3》!《怪猎》大消息!

583 Steam社区

导读1、IGN2020年观看数最多:《黑神话:悟空》名列第二2、Steam《赛博朋克2077》在线玩家数流失79%3、《怪物猎人:崛起》1月7日晚10点公布大消息4、新华网评拼多多员工猝死事件:拒绝“拿命换钱”5、《仁王2》更新1.22版本一大批武器得到加强6、苏联朋克游戏《原子之心》PC配置公布1IGN2020年观看数最多的预告《黑神话:悟空》名列第二IG

萌宠

这些温柔的大家伙们

1285 猫猫狗狗萌宠物

1.九岁的狗狗和三岁的女儿2.永远的伙伴3.抱在一起4.感受彼此的温柔5.让我高歌一曲吧~6.想见我的主人,先过我这一关再说!7.在一起的猫和兔子,是那么的亲密8.就喜欢坐在主人身上9.它才7个月大10.就喜欢挤在一起11.右边的明显被这大块头吓到了12.你敢信吗,它才八个月大13.大猫咪是普通猫咪的两倍,甚至和家里的小狗一边大14.感受一下这重量15.谁说

做游戏,是躺着还是站着挣钱? | 编辑部年终暴言
游戏

做游戏,是躺着还是站着挣钱? | 编辑部年终暴言

1091 TapTap发现好游戏

纷纷扰扰的2020年,终于过去了。2020年的现实世界行色匆匆,虽因疫情短暂停止运转,但游戏让我们少了几分茫然失措,多了许多欢乐谈资——布置江南古镇,经营动物营地,混迹戏精丛林……游戏让被“隔绝”的玩家们,彼此影形不离。2020年的游戏世界在欢笑与愤怒、期待与失望之中,交织出了分外浓重的色彩。你会选取一段什么样的片段,来为自己这一年的游戏世界做个总结呢?欢迎

【冷兔趣闻】如何说服父母养猫
萌宠

【冷兔趣闻】如何说服父母养猫

667 冷兔

推上有一个账号“whyyoushouldhaveacat”,里面全都是可可爱爱的猫猫图,如果你想让爸妈同意养猫,那就可以直接把这些图片给他们看。不开心的时候看看,嘴角疯狂上扬~内容自@boredpanda

摘帽“页游之都”,中国制造荣耀下的广东游戏业革新之路
游戏

摘帽“页游之都”,中国制造荣耀下的广东游戏业革新之路

692 GameLook

「点击上方"GameLook"↑↑↑,订阅微信」2020年对于游戏行业而言,是充满惊喜的一年,全球游戏收入首次破万亿人民币,国内游戏市场收入保持着高速增长,超过了2700亿元。而作为中国游戏行业重心之一的广东省,广东省游戏协会在本周举办的2020广东游戏产业年会上,发布了《2020年广东游戏产业数据报告》(以下简称为《报告》),向我们展示了广东游戏企业彪悍的

私房话

李一桐金晨同款“失恋后遗症”,原来闺蜜才是渣男照妖镜?

923 爱奇艺

看完上周的《了不起的女孩》小奇只想大喊:“这样的闺蜜哪里领?包分配吗?”无论是妖风不断的职场还是一路冒险的爱情局这姐妹俩称得上是患难与共了一个眼神就能为对方充充电~01:好家伙,这样的闺蜜哪里找?现实里李一桐直接#保护我方金大喜#冲在闺蜜反黑第一线这样的神仙友谊求求老天也赏小奇一份啊喂《了不起的女孩》戏里陆可沈思怡不仅互为对方的“啦啦队”更是绝佳搭档陆可事业