GTC 2020:开发者谈NS版《巫师3》移植

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是还债(这些年硬件快速提升带来的计算红利到头了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值