这里尝试将工作中遇到的一些用于CPU计算消耗优化的技术手段汇总到一起,方便需要的时候查询使用。
0. 数据规格
在优化之前,需要明白当前场景中的数据是否是合理的,即drawcall、面数等在目标机型上是否超标等。
对于Drawcall,可以简单基于Nvidia在GDC上的分析给出:
25K batchs/sec 会吃满 1GHz 的 CPU,100%的使用率
按照这个数据,也就是说,1GHz的CPU,如果按照帧率30来算,每帧提交25k/30=830个drawcall就跑满了,基本干不了别的,而我们按照当前Steam的主流硬件配置来看,当前主流的PC为4核,频率在3GHz左右,按照这个配置,全跑满,也就是830x3x4=9960个drawcall,假设两个核用于提交Draw Call,那就是接近5000个Drawcall,虽然这个数字跟实际数字可能并不完全匹配,但是数量级应该是数千这个级别。移动端的数据通过网上的一些文档大致了解,比如参考2020年的一个回答,大概drawcall在数百到一千之间(奇怪的是,这个数据跟当前移动端高端机的CPU配置[8核,2~3GHz]并不十分匹配,不清楚其中有什么样的隐秘),面数在数十万到百万之间。另外,这里也给出PS4的推荐drawcall数为2000,面数约为百万级别。
对于面数,由于每个面的绘制消耗取决于面片的位置(是否存在overwrite)以及面片的尺寸(fillrate)和渲染shader复杂度(PS消耗),因此并没有一个简单的公式可以给出具体的数据,只有一些偏经验的参考数字,具体数字在前面已经给出,实际使用中可以通过demo进行确认,什么级别的面数才是适合自己游戏的。
1. ISPC
ISPC是Implicit SPMD(single program multiple data) Program Compiler的缩写,可以看成是CPU版本的Shader(SIMD特点),相对于传统的手动实现的sse、avx而言,这种技术可以使得代码编写更加具有可读性(通过C语言完成,之后交由编译器翻译成对应的SIMD代码),能够支持目前所需要支持的绝大多数平台(部分平台如arm支持还存在一定的问题),目前在UE的众多离线特性如贴图压缩、lightmass的embree以及运行时计算特性如chaos & animation上都有尝试应用,具体参考文献[1][2]。
2. 移动端大小核架构
移动端CPU设计的两大目标是高性能与低消耗,在这个目标下,ARM提出了大小核的CPU架构,这是一种由两种不同的核组成的异构CPU架构,其中大核具有较强性能,但是也会导致较高消耗,通常用于处理一些重度计算工作,小核性能较弱,同时消耗也较低,通常用于处理一些轻度计算工作,大小核架构中的两种核共享的是同一套指令集架构,详细的信息可以参考[3]。
未完待续
参考文献
[1] [gdc20]ISPC in UnrealEngine4
[2] ISPC In Unreal Engine 4: A Peek Behind The Curtain
[3] big.LITTLE Technology: The Future of Mobile