揭秘游戏时CPU闲置率之谜:如何巧妙利用CPU助力显卡性能?

发表时间: 2024-11-03 15:07

简单的说,一个稍微有点规模的游戏,都是会同时使用到cpu和GPU的,但CPU和gpu干得活不同。

cpu适合干有先后顺序的活,比如你控制的角色把一个杂兵往人堆里扔,杂兵A会击倒杂兵B,杂兵C会击倒杂兵D,像多米诺骨牌一样的连锁反应,每个人因为装备属性不同,防御力不同,每个人受到的伤害又受砸他的杂兵的属性影响。这样的话,你要计算这些人在这一击下究竟分别受了多少伤害,就要按顺序挨个儿算。

gpu适合干没有顺序关系的活,还是上面那个例子,你控制的角色把一个杂兵往一堆人里扔,但这次杂兵A一次就同时砸倒了杂兵BCDEF,BCDEF相互之间没有挨着。那么BCDEF受到的伤害就可以同时独立计算。

但为什么实际游戏制作中不这么去分呢,因为在杂兵A砸到其他人之前,你是不知道接下来究竟是上面哪种情况。

那么你会说,那在砸到以后再决定让CPU还是GPU来算不就好了?

这里又有个问题就是,CPU能直接访问的数据是放在内存中的,GPU能直接访问的数据是放在显存中的,这样你又得考虑两种情况:

一种是杂兵数据放在内存中,这时候想让GPU进行计算,那就得花时间把杂兵数据从内存移到显存中,或者反过来。

另一种就是在内存中和显存中同时放杂兵数据,但这样的话,在一份数据被使用的时候,另一份数据就是闲置的,纯浪费空间,并且在算完后,还得同步一下,把算好的数据拷贝一份到另一处。

数据在内存和显存中来回传递的效率相比于CPU和GPU的计算效率,是非常低的,低到什么程度呢?一个1.0G主频的cpu,算一个加法的时间,可以粗略的当成是1ns,但内存和显存之间传递数据的时间呢?是us甚至ms来计的。

这样的结果就是cpu和gpu都很闲,但传递数据的总线却很忙,得不偿失。

所以一般为了平衡cpu和gpu的负载,会把物理计算放在cpu,而把显示运算放在gpu。这两块数据基本互相独立,即便有数据互通的情况,量也非常小,这是游戏制作中最常规的方式。

物理计算可以粗略的认为包含物体碰撞,刚体运动力学,一个游戏世界里有多少物体,花花草草怪物道具等等乱七八糟的东西有多少算多少,碰到了道具,可以拾取,碰到了花草可以踩掉,碰到了怪物会掉血等等,这些由cpu来算。还有重力作用,运动的加速度等等。

显示运算则是,同样是这个世界的这么多物体,哪些应该显示到屏幕上,以什么颜色来显示,显示的远近大小遮挡关系,光照阴影等等。

所以当你发现你的游戏cpu比较闲时,你可以尝试在你的游戏里多加点活动单位,这时候你就会惊喜的发现cpu开始忙起来了,gpu这时候可能更忙,所以你可以降低一下画质比如各种显示效果还有分辨率啥的。这时候你就能发现cpu非常忙,gpu反而变得闲起来了。

例如砍马与砍杀可以设置战场人数,还有一些类似的游戏你都可以拿来试试。