http://t.cn/A6Z83hIa?m=4489984440606723&u=5634781030
1、确定当前程序基线:
CPU game thread 91ms
CPU render thread 260ms (gpu wait include)
GPU frame time 200ms
Used memory >5Gb
Build size 46Gb
2、通用做法
减少mip等级
减少LODs层级
调整LOD各级距离
调整到720p
降低音频质量
将事务分帧完成:流式加载、quest system、animation、AI、pathfinding.
3、应该检测的地方:
fps时间构成
内存占用构成
逻辑对象数量构成
渲染对象数量构成
4、CPU优化:抛弃busy-wait
wrong: while(task_left) {yeild;}
right: if(acquire.Exchange(false)) s.acquire();
方法:用 Exchange代替 while check.
原理: yield 实际上生成了基于mutex的实现.
(个人感觉就是遇到一个不太常见的语法糖坑)
5、CPU优化:ps4的线程(划分)
主要是线程角色分类、优先级: 主线程-渲染线程-任务线程1234
在下列时机做了spin lock保护
创建Task
task从queue中 push/pop
6、CPU优化:平衡各个核的性能负载
两个关键字 lock-free stack 和 CAS。
为了达成CAS条件,建立了 task的指针列表,通过它来控制task的执行顺序。
7、CPU优化:布料模拟
布料模拟是基于 Apex/PhysX 的解决方案。
Switch上从默认的8次迭代计算改成了1次。
并且在一些关键的性能情景(比如战斗)直接全关了。
这肯定会有些BUG,人工处理这些地方。
图例中布料穿模了俩模型。
8、CPU优化:GPU运算布料模拟(布料模拟的代价)
GPU模拟只支持PC,从Nvidia获得的源码(???)
总的内存开销:42Mb
9、CPU优化:Switch上的共享内存的技巧
Switch L2 被所有core共享,然后没看懂了。。
感觉就是减少一些不必要的数据拷贝。
10、CPU优化:音频解码
核心就是使用不同的音频解码方案
Opus decoder for BGM
ADPCM for others
stereo来代替multichannel
11、Cache-friendly 的内存访问方式
重要的工具:structure lahout analyzer tool.
12、CPU优化:LTO
13、CPU优化:LTO+PGO
14、CPU优化:Apex object的构造
构造和析构需要替换掉,能快50倍
15、内存优化:压缩格式
要关注解压速度和压缩比,并根据不同的资源类型和大小做测试,选用最合适的。
解压用的缓存是没法自动cache的,自己做个临时buffer.
16、内存优化:动画里的scale干掉
17、内存优化:用 PadAnalyzer检查全局变量的size.
发现了16Mb的变量字段开销。
18、内存优化:减少重复的成员变量
19、内存优化:选用合适的贴图压缩格式,建议astc. 不过astc6x6实测比dxt1要大一点
20、内存优化:
直接砍掉最细节的lod模型,不过保留头部和头发,胡子
这节省了120Mb 顶点,16Mb 贴图
用utf8代替wchar_t
这省了50Mb
当ApexObjects的顶点数量小于64K时,用int16作为index buffer的数据类型
这节省了>16Mb
21、内存优化:音频流式加载
内存中声音总共占120Mb
用 Cyberpunk 流式加载(还是分包?) , 这省了80Mb
22、包体优化:
语音包语种从4个变成3个
每个语种4.5Gb资源,压缩一下,省了2.2Gb
音频压缩比 PS4/Xbox 11:1 , Switch 20:1 (switch:我不要面子的咯)
23、包体优化:语音包技巧
Novigrad 可以移除 2Gb的streaming cache.
DLC 有 1.9Gb的cache.
移除临时缓存,省了82Mb,
24、结束语
优化花了15个月
关键因素:这是一个巨大的挑战,工程师们喜欢挑战!
固定的硬件条件给了优化巨大的发挥空间
调性能是艺术!(我更愿称之为手艺)
黑科技一堆
Switch屏幕潜藏了大量图形方面的问题(官方吐槽)
....
....
衍生知识点:
semaphore 信号量
spin lock 自旋锁
cache-friendly
PadAnalyzer
-------------------------------------------
其实干货量很少,毕竟只有20分钟,如何去聊得完15个月的事情呢。
关于优化,我的心得就是
1、真机测试、数据说话
2、在一切方向上(硬件、软件、资源、代码、运行时、静态期、磁盘文件、开发中间文件、游戏逻辑、视野距离、屏幕占比、CPU、GPU、Core、OS System以及一切你游戏用到的各种形态的资源)排查哪些东西占着茅坑不拉S,衡量它的贡献度,保大头。
3、异步+分帧是利器,多核任务调度是大势,cache-firendly是还债(这些年硬件快速提升带来的计算红利到头了)