当前所在位置: 主页 > 耀世新闻 > 行业动态

为什么现在游戏做个多核优化这么难?

过去十年,cpu单核性能不过增长了一倍

为什么不做好多核优化,是有什么技术壁垒吗

很多时候是逻辑上无法并行。有个笑话很好的描述了这个情况:怀一个孩子要十个月,十个人能一个月把孩子生下来么?

首先,市面上商业引擎Unity和UE都是多线程的,很多任务比如动画,物理等,都是派发到了线程池里面多线程运行,但是为什么大家总看到游戏吃单核主频,原因有挺多方面的:

  1. 游戏逻辑本身无法并行化,即使如上面说的动画物理都是尽可能并行计算了,但是你没法在不等待物理计算结果出来之前使用它来驱动游戏逻辑,这样就客观上导致了虽然任务内部可以做到并行,但是不同类型的任务之间很可能因为依赖关系导致顺序执行。最终导致主线程仍然是有比其他线程大的多的负载。
  2. 玩家对帧率日益增长的需求,以前可能60帧就足够了,现在追求120帧,240帧,我不止一次见过知乎上有人说低于100帧或者xx(远大于60)帧就不能玩的言论,成倍的帧率增长很显然成倍的提升了cpu的压力,倒不如说单核只增长一倍的情况下帧率增长的超过了一倍的话,游戏本身是做了优化努力的。
  3. 多线程开发是真的很考验开发者水平,以至于现在的主流商业引擎上绝大部分API都只能在主线程上调用,不允许多线程访问,一旦涉及到多线程,很多开发者很难搞定。
  4. 一帧时间太短,多线程并行调度本身的开销有可能大于逻辑本身的开销,之前就发现过Unity在对渲染物体做GPU Instance数据整理合并的时候,利用了多线程来整理,渲染线程等待所有线程整理完毕,而多线程任务调度本身就有开销,而且还不小,导致了如果数据量本身不大,这个多线程的做法反而是负优化,关掉GPU Instance反而能提高CPU性能。
  5. 引擎自身设计失误,虽然第3点我提到过因为要降低开发者的开发难度,所以API都基本只能在主线程使用,但是如果无脑的让会重度大量调用的API也只能在主线程调用就是设计失误,我在我的另外一个问题回答里面写到过一个具体案例:
Unity引擎有哪些设计上的缺陷?

总结来说,游戏做了多核优化,但是游戏本身的逻辑特点很难做到平铺负载到每个核心,也就导致了总有一个核心成为瓶颈点。


平台注册入口