7

游戏性能优化杂谈(七)

 3 years ago
source link: https://zhuanlan.zhihu.com/p/268675261
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

游戏性能优化杂谈(七)

当代的游戏引擎,CPU端的一个主要工作其实就是在进行游戏当中诸多actor的生命周期管理。

游戏相对于其它软件的一个显著特点是,它的执行就是为了呈现。普通软件注重的是功能和业务流,完成既定任务是软件的主要目的;但是游戏软件的目的就是呈现。

因此,“聪明地”对游戏场景以及actor进行管理,对于游戏的整体性能至关重要。游戏引擎不仅仅要知道目前正在画面当中呈现的布景以及正在“表演”的对象,还需要能够在一定程度上预判接下来可能会被展现的内容,提前完成相关的准备工作。

同时,由于对象的创建和销毁一般涉及到内存空间的分配与释放,以及初始化脚本的执行等,通常负荷是比较重的。所以通常应该尽量增加对象的重用,特别上对于诸如重复出现的小怪、子弹和其它场景交互物件等。这往往需要通过对象池来实现。当然着本质上是用空间换时间,需要较为充裕的内存(RAM)空间。

物理演算也是CPU端负担较重的部分,特别是一些基于物理的游戏。比较简单粗暴的优化方法上降低物理演算迭代的频率。一般来说,对于大多数游戏,10-15fps就可以了。但是对于一些物理演算精度要求高的游戏,这种做法可能是不可接受的。

当场景当中有大量物体需要物理仿真计算的时候,首先采用计算负荷较低的broad phase或者别的什么方法特定计算的“热区”,也就是筛选出最重要,对游戏影响最大,或者说正在发生激烈变化的区域,进入narrow phase进行进一步精细计算。比如,对于玩家周边的部分进行精细计算,但是对于其它部分,如NPC和环境的部分则使用粗略计算或者干脆替换成动画等预制作内容。

最后,CPU端一个对性能影响较大但是常常容易被忽略的要素,就是调试用代码。比如一些对于内存分配情况的记录,对于指针合法性的检查,以及对于图形API的校验等等,这些代码往往开销是相当大的。所以当CPU性能是瓶颈的时候,不妨编译一个非调试版本看看有多少变化。大的团队应该每天都有自动化的流水线生成并测试记录非调试版本的性能变化情况。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK