作者windkey (揪噜噜)
看板GameDesign
标题Re: [程式] 游戏程式:平行逻辑的时域切割
时间Sun Mar 26 00:34:55 2017
※ 引述《cjcat2266 (CJ Cat)》之铭言:
: timeslicing算是我进入业界第一个学到的技巧之一吧
: 非常实用且几乎每天都会摸到
: 简单来说就是有必须反覆执行的轻量平行逻辑
: 不用每个frame全部执行,可以分多个frame执行,分担负担
: 像是100个NPC不用每个frame都全部执行,每frame处理20个可省下80%决策运算时间
: 反映NPC决策的动画层,因为与决策层中间透过介面沟通
: 这种几个frame决策延迟并不会被玩家注意到
: (除非你在做无法容忍延迟的格斗游戏,那你是要100个NPC干嘛啦XD)
: 时域切割 同步/非同步 的 资料读取输入/储存输出,又有四种排列组合
: 本文有精美动画供参考:)
: 那就废话不多说了(好像已经讲了一堆)
: 连结在此 http://wp.me/p4mzke-14V
: 动画生成原始码在此 https://github.com/TheAllenChou/timeslicing
: 这是游戏程式系列文的一部分 http://allenchou.net/game-programming-series/
: 请多指教 :)
不要每个frame都执行,除了cjcat大分享的timeslicing之外
还有使用timer,设定interval时间每隔一段时间处理的方法
这边想分享一下曾经遇到"失败"的经验
首先我们先回到没有改的状况
版本1:
每个frame要做的事情都写在Update里
版本2:
使用timer
在begin play的时候设定timer,interval可能是5秒,每次作原来Update的事
结果悲剧发生了,如果这个entity被种了10个在同一个场景可能会发生什麽事?
10个同时睡觉,同时起床,於是每5秒游戏就会顿一下
(前提是这Update很花时间,不过如果这个Update很快,你根本不会把版本1改掉)
从profiler分析,版本2的average fps会比1好很多,
可是max fps还是跟版本1一样,游戏体验却比1还要遭。
所以这篇文章除了要说明,
使用timer要小心不要同时触发之外。
profiling时也要拥有全面以及正确的观念,average/max 都要同时注意
在寻找改善的标物建议多花一点时间,确定找到的是目前较重瓶颈
时间要花在刀口上~~
以上就是曾遇到的失败经验~~没踩过雷的人可以趁机知道一下~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.116.41.55
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/GameDesign/M.1490459698.A.90E.html
1F:推 cowbaying: 你这是把同样把全部要做的事情都塞进update里面吧 03/26 00:50
2F:→ cowbaying: 这样有没有延迟5秒执行没有差别阿 03/26 00:51
3F:→ windkey: 的确只是单纯的把呼叫次数降低而已 03/26 01:16
4F:推 Frostx: 在开头的时候把timer的第一次周期随机分散 03/26 09:25
5F:推 cjcat2266: 我自己是不太喜欢用timer,因为有不确定因素 03/26 10:03
6F:→ cjcat2266: 因为用frame数来决定是否update的话,控制比较精确 03/26 10:04
7F:→ cjcat2266: 一开始我会推荐最简单的 (object index + frame#) % n 03/26 10:06
8F:→ cjcat2266: 来决定是否update,不够的话再看有没有其他地方可以切 03/26 10:07
9F:→ cjcat2266: 也可以试试看lazy update,有需要的时候才触发update 03/26 10:08
10F:→ cjcat2266: 下个frame再给结果,太多query的话就排队timeslice 03/26 10:09
11F:→ cjcat2266: Uncharted 4的就是用这种request-based lazy update 03/26 10:10
12F:→ cjcat2266: 来算出NPC的最佳移动目的地,NPC有reqeust才开始update 03/26 10:11
13F:→ cjcat2266: 要算的东西太多,就timeslice,过几个frame再给结果 03/26 10:11
14F:→ cjcat2266: 反正是决定层,慢个0.1秒才反映在动画层也看不出来 03/26 10:12
15F:推 softpak: 我的方法跟cj是一样的 03/26 12:13
16F:→ softpak: 用更新率来切step 03/26 12:14
17F:→ softpak: 或者说就是最简单的一招吧 XD 03/26 12:15
18F:推 softpak: 这样做是不用另开执行绪 03/26 12:17
19F:→ softpak: 效能不足再开就好 03/26 12:17
20F:推 cjcat2266: 如果平台支援fiber的话,可以在低overhead的状况达到 03/26 15:07
21F:→ cjcat2266: 多执行绪的效果,一开始开跟CPU core数量一样的执行绪 03/26 15:08
22F:→ cjcat2266: 然後用core affinity绑定CPU core,再用job system分配 03/26 15:09
23F:→ cjcat2266: fiber给执行绪处理 03/26 15:09
25F:推 lemmii: push~ 03/27 10:55
26F:推 sakyer: 赞 03/27 14:40
27F:推 breakself: 时域切割正夯 03/28 23:25