作者cjcat2266 (CJ Cat)
看板GameDesign
标题[心得] 游戏的"缩水" 与 TLOUR的平行运算技术
时间Mon Jun 8 09:01:40 2015
不少游戏初期公布的实机技术demo与最终成品有明显画质落差,为什麽?
本文将藉由说明在初期技术展示与最终成品阶段的技术差别,来回答这个问题
顺便介绍一些The Last of Us Remastered (PS4)压榨硬体资源的技术
简而言之:游戏最终成品,通常所需运算资源种类与量,会比初期技术展示多
一个AAA游戏成品在实机执行的时候,运算资源大致分配给以下几项作业
1. 游戏机制(CPU)
2. AI(CPU)
3. 物理(CPU and/or GPU)
4. 动画(CPU)
5. 粒子(CPU and/or GPU)
6. 绘图逻辑(CPU)
7. 绘图执行(GPU)
初期实机技术demo,通常不会有多少1/2,可能会有3
4不会像最终成品消耗CPU与记忆体
所以大部分的运算资源都可以用在5/6/7
不要小看1/2/3消耗的资源量
这几项在最终成品的资源消耗可以占到CPU的50%以上
所以4/5/6/7能够使用的硬体资源(粗估)只剩下初期技术demo的50%
如果在制作初期实机技术demo的时候
把100%硬体资源拿来展现4/5/6/7
那麽後来新加入1/2/3的资源消耗,势必会产生"视觉上缩水"的情况
为了初期吸引观众目光,这几乎是必然的结果
这样是否表示AAA游戏开发者不诚实? 见仁见智
不管是初期技术展示还是游戏成品,硬体资源一定是几乎被榨光的
制作初期demo的时候是否可以估计到之後会额外用到的资源? 非常难
不管是哪家工作室,应该都不想只用50%以下的硬体资源做技术展示demo吧
我个人是有了以上的认知之後
看到初期技术demo与最终成品的画质落差
虽然会失望,但觉得比较可以接受这个事实了
接下来介绍TLOUR的一些压榨硬体资源的技术
之前有提到,Naughty Dog为了从PS3跨到PS4
重新设计了一个平行运算的系统
负责人Christian Gyrling於今年GDC有个专题讲座
强烈推荐给有兴趣的资工领域朋友
影片连结
http://bit.ly/1eX5mb1
投影片连结
http://bit.ly/1HgtGQ9
TLOUR的硬体资源配置,可分为以下三种
1. 游戏逻辑(CPU) 包含:游戏机制、AI、物理、动画、粒子
2. 绘图逻辑(CPU) 生成绘图指令,丢给GPU执行
3. 绘图执行(GPU) 执行2生成的绘图指令
一个单执行序的游戏
1/2/3是串在一起,在同一个frame内线性依序执行的
如果要达到60fps,那1/2/3总共的运算时间就不可以超过16ms
<A方案>
CPU 游戏逻辑 -> 绘图逻辑
GPU -> 绘图执行
|------------------------------|
16ms
PS4有八个CPU核心,有六个是给游戏使用的
把1/2平行化,拆给不同CPU核心执行
如此一来,1/2如果需要总共48ms执行时间,理论上只会用到8ms
<B方案>
CPU1 游戏逻辑1 -> 绘图逻辑1
CPU2 游戏逻辑2 -> 绘图逻辑2
CPU3 游戏逻辑3 -> 绘图逻辑3
CPU4 游戏逻辑4 -> 绘图逻辑4
CPU5 游戏逻辑5 -> 绘图逻辑5
CPU6 游戏逻辑6 -> 绘图逻辑6
GPU -> 绘图执行
|--------------------------------|
16ms
但这还是不够理想,CPU忙的时候GPU闲着,GPU忙的时候CPU闲着
开发AAA游戏的精随就是要最大幅度使用硬体资源啊!
那如果把游戏逻辑在frame0生成的资料,暂存在记忆体
绘图逻辑在frame1的时候用这些资料生成绘图指令,交给GPU绘图执行呢?
把游戏逻辑和绘图逻辑切成小块,交互执行
所以感觉上游戏逻辑和绘图逻辑"同时"在一个CPU核心上执行
<C方案>
CPUn 游戏逻辑n (生成frame1资料)
绘图逻辑n (使用frame0资料)
GPU -> 绘图执行
|-------------------|
16ms
嗯,光是视觉看来,就已经能够更有效率地使用硬体资源了
但是CPU和GPU还是各有自己的闲暇时间,不行!
那如果更进一步,绘图执行使用的资料,是绘图逻辑上一个frame产生的呢?
<D方案>
CPUn 游戏逻辑n (生成frame2资料)
绘图逻辑n (使用frame1资料,生成frame0资料)
GPU 绘图执行 (使用frame0资料)
|-------|
16ms
好了,CPU和GPU已经最大幅度使用,闲不下来啦
这个D方案就是TLOUR使用的技术
缺点就是,画面是GPU使用两个frame以前的旧资料呈现出来的"老画面"
所以TLOUR是有两个frame的延迟时间的
当玩家看到画面上,准心瞄准敌人的头时
从游戏逻辑的观点来看,敌人的头可能已经不在准心下了
TLOUR弹药普遍稀少,为了补偿玩家,在射击的时候
只要在过去两个frame中有瞄准到目标,就算是判定击中
D方案不是唯一解或最佳解,一切端看开发者考量
The Order: 1886采取的方式类似B方案(有将作业切小块和生产线处理)
因为Ready at Dawn工作室明确表态,说不想要让游戏有任何延迟
所以如果他们愿意采用D方案,The Order: 1886可以冲到60fps也不一定?
--
Web
http://AllenChou.net
Twitter
http://twitter.com/TheAllenChou
LinkedIn
http://linkedin.com/in/MingLunChou
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 45.50.175.11
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1433725304.A.F8C.html
※ 编辑: cjcat2266 (45.50.175.11), 06/08/2015 09:17:31
1F:推 yearnway: 谢谢分享~~又学到一些东西了~~ 06/08 09:53
2F:推 yhn0tgb60: 过去2个frame有击中都算 所以逻辑资料会保留2个frame罗 06/08 10:12
3F:→ yhn0tgb60: 这样会对记忆体造成负担吗 或是其实资料量很少 没影响 06/08 10:13
4F:→ cjcat2266: 既然游戏生得出来,就表示记忆体可以负担吧XD 06/08 10:14
5F:→ cowbaying: 如果GPU的时脉拉到2GHz以上我推测可以用来算AI 06/08 10:24
6F:→ cowbaying: 游戏这种hard real time运算 对於平行後的资料蒐集 06/08 10:25
7F:→ yhn0tgb60: 我的想法是 通常这个frame的资料出来时 06/08 10:25
8F:→ cowbaying: 是相当严苛的... 06/08 10:25
9F:→ yhn0tgb60: 上个frame的资料应该就丢了 甚至释放了 06/08 10:26
10F:→ yhn0tgb60: 所以这作法 必须保留3个frame 的资料 06/08 10:26
11F:→ cowbaying: 或许是硬体特性的问题 目前开发的HSA项目 06/08 10:28
12F:→ cjcat2266: 当然不是所有资料全保留啊,只保留绘图相关资料而已 06/08 10:28
13F:→ cowbaying: 在GPU时脉800Mhz下 简易四则运算的回应时间是 06/08 10:29
14F:→ cjcat2266: 我们已经三个人在平行发言了XD 06/08 10:29
15F:推 cowbaying: 1000~5000ns 比CPU慢了约100倍 06/08 10:29
16F:推 cowbaying: XDDDDDD 06/08 10:30
17F:→ cowbaying: 这就是没有ordered的关系 06/08 10:30
18F:推 cowbaying: 但是两个frame的延迟我认为算很严重了 至少竞技类 06/08 10:32
19F:→ cowbaying: 的游戏应用起来很困难 06/08 10:32
20F:→ cjcat2266: 顽皮狗做的游戏都是单人线性剧情走向,所以没问题的XD 06/08 10:33
21F:推 akilight: 不过TLOU和uncharted不是都有多人对战吗? 06/08 12:07
22F:→ akilight: 对人对战的部份也是用这种2 frame方式处理,还是改以反应 06/08 12:07
23F:→ akilight: 速度为优先考量呢? 06/08 12:07
24F:→ cjcat2266: 是使用同一套系统,毕竟射击游戏的被攻方错误容许度高 06/08 12:45
25F:→ cjcat2266: 攻方如果发现有瞄准到的敌人没有攻击判定,会很明显 06/08 12:46
26F:→ cjcat2266: 而被攻方受到攻击判定,也就只能认了 06/08 12:46
27F:→ cjcat2266: 一般也不会觉得 "明明自己躲过瞄准了,怎麽还被打到?" 06/08 12:47
28F:→ cjcat2266: 因为被攻方也看不到攻方的准星是否有瞄到自己 06/08 12:47
29F:推 akilight: 了解XD 06/08 13:55
30F:推 wyvernlee: 专业文! 06/08 14:43
31F:推 holymars: 试着回答记忆体的问题:通常逻辑部份并不占多少记忆体 06/08 16:22
32F:→ holymars: 理论上,多存两个frame的逻辑状态并不会增加多少记忆体 06/08 16:23
33F:→ holymars: 需求,至少和texture/audio之类动不动就上百MB比起来是 06/08 16:23
34F:→ holymars: 很小的问题 06/08 16:23
35F:→ cjcat2266: 也不用存逻辑状态,只要存绘图需要的transform就好 06/08 16:32
36F:推 azureblaze: 记忆体几乎就是texture的意思了 其他比起来都是渣XD 06/08 19:26
37F:推 lemmii: 推好文 06/08 23:27
※ 编辑: cjcat2266 (160.33.43.15), 06/09/2015 01:01:44
38F:推 wangm4a1: 推 06/09 02:16
39F:推 yoyoleo0505: 推 06/09 08:51
40F:→ yhn0tgb60: 逻辑资料的记忆体 的确是非常小没错 06/09 13:24
41F:→ yhn0tgb60: 只是想到 videogame的记忆体也是寸土寸金 XD 06/09 14:33