cpu bound还是gpu bound
cpu bound:渲染task可能分布在多个线程,叫做多线程渲染。主线程、渲染线程、worker线程。主线程包含一些渲染的任务。渲染线程发送命令给gpu。worker线程执行一些单独的任务,裁剪、mesh skin等。但不同目标也可能不同。
哪个task是瓶颈就优化那个task在的线程。某些平台不支持多线程渲染。
graphics job: player setting里的graphics job决定unity用worker线程展开渲染任务。
(1)发送命令到gpu:一般是在渲染线程执行的,有可能是worker线程执行在某些平台上(如ps4).SetPass call导致发送指令到gpu。目标平台能支持多少setpasscall跟设备有关。减少batch数、更多物体共享渲染状态。较少setpass call数。
较少渲染物体数目(减少数目、剔除、距离、层级剔除、遮挡剔除),较少每个物体呗渲染次数(动态光照、动态阴影、反射probe),必须被渲染在多个批次的物体合成一个(静态合批、动态合批、ui合批、gpu instance、贴图图集、合批会减少很多消耗
因为shadow、light、cull都是逐物体操作的)。
剔除、排序、合批:剔除、收集要渲染物体的信息、排序这些数据到batch、生成gpu指令都可能导致cpu bound。这些任务根据平台不同,可能在主线程、也可能在单独的工作线程。
剔除本身不太可能会造成很高的成本,但是减少不必要的剔除可能会提高性能。所有active场景物体都有逐物体逐相机的开销,即使在不被渲染的layer。我们应该disable掉相机或者不用的renderer。
batch能减小dc开销。但它会增大开销,如果batch导致cpu bound,我们要限制batch操作。
skinMesh:骨骼动画,动画角色。可能会导致cpu bound。能用meshRender就不用SkinnedMeshRenderer。 如果只动一段时间,看来替换mesh或吧skinnedMesh换为meshRenderer. mesh skin开销是逐顶点的。
用更少顶点减少负担。某些平台可用gpu控制skin。
减少主线程上,非渲染任务的消耗。比如脚本。
如果gpu bound:
Fill rate:减小分辨率、后处理。overdraw、屏幕效果、片元着色器、内置shader复杂度、standard shader复杂度。
内存带宽:贴图压缩、miapmap
顶点处理:顶点数、用法线贴图增加细节代替顶点、如果不需要normalmalp,不导入法线、lod、顶点shader、shader复杂度
参考这篇:https://learn.unity.com/tutorial/fixing-performance-problems#5c7f8528edbc2a002053b596