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是还债(这些年硬件快速提升带来的计算红利到头了)
GTC 2020:开发者谈NS版《巫师3》移植相关推荐
- 程序员看过来!JS、Java、C 依然强势,Go、Kotlin、Python 潜力股,2020 开发者生态系统报告
编译 | 屠敏 头图 | CSDN 下载自东方 IC 出品 | CSDN(ID:CSDNnews) 一切过往,皆为序章. 2019 年,走出舒适区的技术圈迎来消费互联网向产业互联网的转型,也开始了数字 ...
- 罗永浩宣布进军电商直播;微博回应用户数据泄露;Android 11 开发者预览版 2 发布 | 极客头条...
整理 | 屠敏 头图 | CSDN 下载自视觉中国 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦, ...
- iPhone 9或于4月3日发布;复制粘贴之父Larry Tesler去世;Android 11开发者预览版来了!| 极客头条...
整理 | 郭芮 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注 ...
- Android 12 首个开发者预览版到来
作者 / Dave Burke,工程副总裁 从手机和笔记本电脑,再到平板电脑.电视甚至汽车,Android 应用每天都在各种设备上支持着数十亿人的工作.娱乐.交流和创造.当越来越多的人开始依赖您所构建 ...
- 微软 Build 2020 开发者大会邀请开源社,共赴线上新旅程
点击上方"开源社"关注我们 | 转载自:微软中国MSDN | 编辑:Corrie | 设计:叶修缘. 微软热爱的开发者,开发者热爱的新技术 微软Build 2020开发者大会大幕将 ...
- TensorFlow 2.0开发者预览版发布
整理 | Jane 出品 | AI科技大本营 从去年 8 月 Google 公开发布消息正在研发 TensorFlow 2.0 ,让我们在 12 月 提前看到了一些 高级 API 的变化,今天我们终于 ...
- 发布Wear OS by Google开发者预览版
今天,我们发布新的 Wear OS by Google 的开发者预览版,为 Wear OS 带来 Android P 平台的功能.对 Wear OS by Google 中国版的开发者,我们特别提供了 ...
- 谷歌发布 Android 8.1 首个开发者预览版,优化内存效率
今晨,谷歌推出了 Android 8.1 首个开发者预览版,此次升级涵盖了针对多个功能的提升优化,其中包含对 Android Go (设备运行内存小于等于 1 GB)和加速设备上对机器学习的全新神经网 ...
- pip无法更新_TensorFlow 2.0「开发者预览版」上线,内容每日更新
TensorFlow 2.0 预览版上线了!近日,谷歌 AI 团队成员 Martin Wicke 在社交网络上向大家发布了这一最流行深度学习框架的「开发者预览版」,该版本又被称为「Nightly 版」 ...
最新文章
- 避免到服务器的不必要的往返过程
- ECCV 2020 | 腾讯优图8篇论文入选,涵盖目标跟踪、行人重识别、人脸识别等领域...
- E0070 不允许使用不完整的类型
- Pytorch多进程最佳实践
- eclipse生成java项目出错,Java项目使用了HttpClients相关包,用eclipse导出jar包就不能正常运行Error: A JNI error has occurred...
- input()与raw_input()
- php数组foreach循环添加键值对_在PHP的foreach循环中插入一个$key作为变量
- matlab时域转换成频域_从时域到频域,你只需要旋转一下!
- 初学Java,LinkedList功能最全的集合类
- 【BZOJ1923】外星千足虫,高斯消元解xor方程组
- 【转载】白话经典算法系列之六 快速排序 快速搞定
- Netty使用kryo序列化传输对象
- 利用Docker快速部署Oracle环境
- Parallels Desktop 17 亮点整理,7 大改进与变化
- Atitit 常用技能点体系树 os win linux android 前后端 gui h5 vue js jquery bootstrap cocos2d Jafavx wpf
- Android从 HttpResponse (或者InputStream) 获取字符串内容的代码
- redis 加载mysql_Mysql Redis PostgreSQL数据库查看客户端连接
- 【OCP题库-12c】最新CUUG OCP 071考试题库(71题)
- 曼昆《经济学原理》-微观经济学-随记(二)
- 十大气势背景音乐(适合战队,广告招商会场用)