当前位置: 首页 > 科技观察

游戏性能优化心得浅谈

时间:2023-03-19 15:17:51 科技观察

优化简介说到游戏优化,在游戏开发中往往分为这几个步骤:首先确定游戏中经常出现的问题是什么-Profile,然后确定从哪个方向进行性能优化-分析***尽量一一解决问题-解决游戏开发必须先做工具,配置文件,再优化。所以,说到优化,又得说说profile。一些常用的工具是内置引擎和IDE有的,比如Unity自带的Profiler,包括CPU、GPU、Memory等多种性能分析工具,其他的比如GPA、XcodeInstrument和VisualStudio,Intel自带的内存管理工具是可以的,也是需要学习和使用的。其他工具需要根据游戏需要自己编写,比如一键关闭所有特效,一键更改分辨率等,一键设置场上NPC数量,开启简单具有快捷键的爸爸三国等游戏有了配置文件功能,更复杂的游戏,如神秘海域,通过游戏控制台进行更详细的配置文件。接下来说一下游戏优化中主要考虑的四大问题:CPU带来的问题:由于短时间内大量的计算,导致画面流畅度降低,俗称跳帧,发热严重,高功耗。常见的优化手段:将计算分成多个逻辑帧进行计算,避免短时间内性能过载,俗称“时间片”。尽量缓存能缓存的数据,避免重复计算,重复分配内存。一个常见的例子是“内存池”。使用合理的算法和数据结构,比如:冒泡排序和直接插入排序在整体数组相对有序的情况下比快速排序效率高很多。用代替快速排序是优化程序排序效率的普遍思路。GPU带来的问题:发热严重、功耗高、FPS降低常用优化手段:优化美术资源,如合理规划图集、约定模型最大三角形数、制定合理的粒子效果规范等。这可以说是游戏优化中最重要的一项。因此,技术美术在游戏开发中扮演着巨大的角色。简化或优化着色器,例如在游戏开始前编译和加载着色器。使用Batching尽量减少DrawCall平台推荐的压缩格式,比如Android平台的ETC1,IOS平台的PVRTC。IO和网络问题:网络延迟甚至加载资源断开导致跳帧和加载时间长。常见的优化方式:使用独立线程加载,Unity等部分引擎也可以使用协程来减少网络包中的冗余数据合并小包,减少请求数据的次数以帧为单位处理返回包限制发送包的频率在一定时间内内存导致的内存问题:死机和卡顿,比如Android的LowMemoryKiller会在内存不足的时候杀掉占用内存过多的程序。常见的优化方式:资源的动态加载和卸载,比如在游戏中,我们可以卸载一些游戏外的UI图集。降低不利于优化的资源质量或屏幕分辨率通常被用作最佳手段。做过项目的一些思考需要关注非功能需求。这个思路是我从《为什么很多看起来不是很复杂的网站,比如Facebook需要大量黑客来开发?》开始的。在这个回答中,正如受访者所说:“其实从我的经验来看,一般来说,很多软件项目和产品的非功能性需求的成本、难度、工作量都超过了功能性需求。在特定的软件领域,比如网站(尤其是淘宝、Facebook等用户量大的网站)、金融(银行证券)、电信领域,其非功能需求实现的重要性、工作量、技术难度远大于功能需求的实现而且,功能需求的实现,其实大部分情况下,更多的是依赖于业务高手(或者好的产品经理)而不是技术高手,而不是功能需求的实现,恰恰是一个重要的挑战技术高手的问题。“我做游戏前端有一段时间了,大家都在抱怨游戏前端技术含量低,只会写业务逻辑,但陷阱是作为前端,你应该尽量少写业务逻辑关注的模块性能:你的游戏有没有profile过,观察上面的参数是否达到目标其他,你的游戏能不能被反编译拦截网络包或者玩家修改内存数据你做更好的工具用于美工和策划,解放生产力?要善于划定范围,缩小问题范围。这几个月,我参与了developmenUnity3D的两个项目,全民突击和崩坏学院2,我也遇到了一些问题。对于性能优化相关的问题,当程序出现问题时,我们往往会用所谓的“经验”来解决问题。这种QuickLink的能力自然是很重要的,但是经验却不是最好的。但从另一个角度来说,就是当我们无法从过去的经验中找到答案时,我们就不得不通过划分范围、缩小问题范围来解决问题。很多人在处理问题时,往往只是坚持自己经验中的一个局部愿景,***的结果一定不尽如人意。综上所述,其实这四个方面的优化总是相互制衡的。如果完成了一个方面的优化,另一个方面的问题又会出现。例如,如果我们使用动态加载和卸载资源,虽然这样减少了内存占用,但会导致IO上加载时间延长的问题。所以,我们在做游戏优化的时候,不要太追求完美,恰到好处才是真的好(GoodEnoughIsFine)。最终,以上四个方面可以得到平衡。不要在一个方面过度优化,而导致其他方面出现问题。当一个退潮另一个退潮时,有时最好不要优化。