为什么大多数游戏都不做多线程/多核优化?难点是什么?

0 条评论


  • 11

    aquarheadMaking EVE Online

    神楽坂伊織none白银第二次机会 等 11人赞同

    CPU 负载高一般是游戏的逻辑处理比较复杂, 这里所谓的「逻辑」基本涵盖了游戏里玩家无法直接"看到"的所有运算, 例如 AI 行为, 伤害计算, 寻路等等...

    这部分确实是比较难"优化"的. 最主要的原因是要保持游戏中所有"对象"的状态一致, 而这种一致性跟「时序」(简单来说就是顺序吧)紧密相关. 例如 A 首先击杀了 B, 那么理论上 B 应当无法再动作了 - 比如说应该就无法再击杀 A - 当然游戏也可以设计成子弹有飞行时间(或者比如是用火箭筒之类的武器) 但是在这种情况下击杀的行为是绑定在这个 projectile 上的, 而非 A 或 B, 那么对于这种情况我们要保证的一致性就是 B 在发出 projectile 的时候还没有死掉.

    还有比如说你可能要维护一个"全局"的 Game Mode 对象, 比如记录每个队伍的得分/抢点模式下各个点的进度等等整盘游戏共享的一些状态, 对于这些状态的更新必须准确及时而且很多时候先后顺序至关重要, 而这些放在多线程里很难正确地实现.

    多核和多线程是不同的概念, 首先单核也可以运行多个进程(多线程亦适用), 也许你听说过「抢占式多任务操作系统」这么个概念, 即系统会根据优先级/时间切片等等条件不停地切换不同的进程运行. 这也是为什么在以前只有单核的 CPU 上我们也可以同时运行多个软件. 多核只是让调度器可以有更多的选择, 即(理论上)可以真正的"同时"运行若干个任务, 例如你玩的游戏和用的聊天软件就可以互不干扰的同时运行了(单核的话例如说各占用 50% 的 CPU 时间). 多线程和多核正好对应了「并发」 (Concurrency) 和 「并行」 (Parallelism) 这两个藕断丝连的概念. 另外这里讨论的进程在多核上并行是比较简单的, 多线程想要真正利用多核还有更多的限制.

    对于开发者来说, 编写多线程的代码本身就不是一个容易的事, 这也是为什么有所谓「线程安全」的库/数据结构等等. 在此之上如何去同步多个线程上产生的状态更新是更大的难题, 想要维持一个有先后顺序, 或有依赖关系的逻辑能正确计算, 最简单最直观的方法就是只用一个线程(这样也是最方便调试的).

    当然以上都是在讨论「逻辑线程」, 其实现在的软件/游戏基本上不存在"单线程"的了. 哪怕是 iPhone 上最简单的 App, 其渲染和逻辑也是在不同的线程里面. (虽然说到底还是要看开发者能不能正确实现多线程的一些行为) 对于游戏来说渲染/动画/声音/UI都可能在不同的线程上, 这也会有同步的问题, 当然一般而言这些不同职责的系统之间依赖会更少/更简单.

    如果谈论「用多线程优化」的话, 我觉得最重要的就是去解决不同线程之间的状态同步问题. 如果某些逻辑能够分割成若干可以同时运算而又互不冲突的部分, 那应该可以相对简单地"优化".

    其实我个人的观点是不妨带着并发/并行的思路去设计游戏, 去考虑游戏里的这些状态能否接受不同步或者能否接受一定程度的不同步等等.

    发布于 2017-06-28 21:50:32 3 条评论 禁止转载


  • 4

    Doom Liang我被折叠的回答,都是精华

    淡观天下和谐小小bleea 等 4人赞同

    技术攻关成本高(中小型团队无能力承担)

    性价比低(民航客机不加降落伞逃生舱)

    消费者关注度低(游戏卡了,肯定是我电脑配置低、装了360TGP什么的)

    多平台适配

    没时间 能把游戏做完就不错了

    发布于 2017-06-27 17:44:29 0 条评论


  • 2

    SniperGhost

    作为一个自学编程的菜逼,说点感受,注意,仅仅是个人感受!

    我觉得多线程编程比单线程要复杂得多,要考虑很多问题,资源共享、同步,防止死锁等等,流程比单线程复杂,更容易出错。

    发布于 2017-07-01 08:09:20 0 条评论


  • 1

    BlackMirror/\__/\

    /\__/\

    更新于 2020-07-30 23:08:20 0 条评论


  • 1

    龙骑士无面者现在是菜鸟工程师,渴望成为专业模型玩家

    Doom Liang 赞同

    看了知乎原题后补充:

    我一开始就搞错了题主想问什么(捂脸)。

    从软件层面上讲,世界上确实没有什么程序是单线程的,因为单线程程序的交互性很差,举个很简单的例子,大家都可以一边打电话一边看电脑,单线程程序就做不到,只能停下打电话的动作去看电脑,或者停下看电脑去打电话,这样的程序肯定是糟糕的。

    关于多进程,线程可以看作是轻量级的进程,一个进程下可以“挂载”多个线程,更多的信息还是参考计算机组成原理之类的书籍吧,我有一年多没看过了,描述上难免不够严谨。

    题主想问的,一部分上是在逻辑上多任务并行。逻辑上多任务并行是个世界性难题,针对不同的逻辑有不同的优化方法,就知乎原题主提到的游戏中,我挑个我还算熟悉的,石炉。石炉应当有主线程不断roll随机事件,有分线程处理每个小人的动作,我甚至认为每个小人的行动都是由一个以上线程决定的,而这么多线程肯定有不同的优先级,优先级调度就是个难题,想在这方面做文章,太难,需要大量的实验和耐心,用开发周期堆出来。

    另一部分是多核CPU均衡负载的问题,这个开发者真做不了优化。游戏开发者一般用开发游戏的引擎的开发者提供的工具(也就是游戏引擎,废话真多),而开发游戏引擎的人用的又是操作系统开发者提供的工具,操作系统开发者想要控制CPU用的又是CPU厂家提供的工具,按照冤有头债有主的观点,多核CPU均衡负载是CPU厂家的问题。

    至于说win10可以自行优化多核CPU的负载,虽然有可能,但这个我真的不信。就算微软财大气粗,搞了一大帮工程师专门搞多核CPU负载优化,那这帮工程师还逮分成好几批人,一部分搞因特尔的酷睿,一部分人搞因特尔的E系列,一部分人搞AMD的,还要有人搞ARM的,难度太大。



    以下是原答案


    首先,你怎么看出对CPU利用效率低的?

    然后,在PS平台我不清楚,但windows平台下,多进程设计是不被鼓励的,证据就是你在运行游戏时,打开任务管理器,和你运行着的那个游戏相关的“任务”一般只有一个,这就是说你正在运行的那个游戏是个“单一进程”。

    关于进程和线程的区别,你只要知道多线程不会在任务管理器里看到,但多进程会就好。详细的信息在windows平台下只有微软的工程师知道,在类Unix环境下进程和线程的区别能写一本好几百页的书。

    在继续之前,我很负责的告诉题主,世界上正二八经单进程又单线程的软件你几乎见不到,就算是代码写的很烂的独立游戏也是这样,游戏引擎,或者说开发工具会自动优化,在一般开发者都看不到的地方就做了多线程处理了。

    如果题主你真的通过某种方式(或某些软件)发现了CPU利用效率低(其实你这句话就是错的),这一定和单线程无关,而和CPU厂家和操作系统厂家有关。更具体的需要题主有一定计算机组成原理的知识,你只要记住,在游戏这种程度的软件开发上,开发者几乎不关心多进程/多线程的问题,他们属于低层问题。现在稍高级一点的开发语言都不支持直接操作内存(一般常说不支持“指针”),多进程/线程更是只和操作系统有关,如果你用的编程语言既没有被操作系统(比如windows)提供的多进程/线程语句,又不支持内嵌其他语言,那你只好认为你所编写的程度都是单线程且单进程的了,实际上如何由编译器决定,你无从知晓。

    至于为什么“CPU利用效率低”,实际上这个问题是出在“多核CPU”身上的。多核CPU具有多个运算核心,这样可以提高速度和多进程/线程能力,但在多个运算核心中均匀负载是个难题。我曾看到过关于intel的多核CPU负载情况和AMD的多核CPU负载情况对比(来自AMD的宣传展会视频,不排除黑幕),intel的多核CPU均匀负载做的比较烂,AMD的好得多。那么多核CPU的均匀负载谁来做?废话,当然是CPU厂家!

    如果要在游戏编程的层面上做多线程/进程优化,第一步就是抛弃市面上几乎全部游戏开发软件,自己从头开始。所以在谈思路前,先学好编程,着手编写或彻底学习一些函数库,然后编写一大堆调用素材的函数,准备一大堆素材,确保你能完全把握你的程序,然后再提多线程/进程的事。

    至于win10的均匀负载的新特性,你要是能在日常使用中看出来,你会被邀请去各大芯片厂家当高级工程师,各类开设计算机专业的大学都会以你去讲课为荣。这话一点都不夸张。

    至于win10这部分优化到底在哪儿,我估计微软自己的工程师都搞不清楚,真的,windows现在的代码量是上千万行,没人能看得完,何况还有各种CPU的手册。在专业且具体的测试结果出来前,你当它是句宣传语就得了。

    更新于 2017-06-28 10:15:01 7 条评论 禁止转载


  • 0

    XenoAmessXenoAmess

    难点是同步。

    更新于 2019-01-24 23:04:07 0 条评论


  • 0

    晓荼Steam 中国鉴赏家同好会 组长

    是钱。。

    发布于 2017-07-02 00:12:57 0 条评论


  • 0

    某达君某个刚入职的小模型师

    小明想装台电脑,爸爸找来4个人帮小明装,爸爸不懂电脑,找来的4个人不会交流,请问这件事的难度在哪?

    当然是怎样装电脑才会让4个无法交流的人不打起来的同时还能提高效率啊。

    如果我是小明我也会选择让一个人来做完而不是让4个人合作装电脑。

    所以说这件事的真正难点其实是你为什么要用4个人来装电脑。

    更新于 2017-06-27 23:15:41 0 条评论

  • 1个回答被折叠 (为什么折叠?)


  • 0

    大城小胖不给自己点赞就是一种犯罪,会被打成小胖

    特意去看了知乎的原题:  https://www.zhihu.com/question/52957429  

    以及一些类似的问题。

    我觉得知乎上的回答已经挺专业 挺全面全了。

    题主在这里也许很难得到更好的回答。

    更新于 2017-06-27 23:48:58 1 条评论

  • 登录奶牛关账号即可参与讨论