无人岛屿颈
发表于 2021-2-26 11:43
能够多线程优化的工作都做了。不做的就是太不稳定,难度太大,不划算,还有引擎代码就写成那样了,要不重写?重写原来的问题还是那样,那么,重写个屁。
有些给出了demo,但实际游戏中这类demo没啥用,你要交互啊,你的需求不是按照demo来做的啊。
举个形象的例子:3d游戏引擎的工作方式最像什么。
外科手术。
一个主刀医生,配一大群医生护士在旁边,擦擦汗,递个刀,术前麻醉,术后缝合之类的。
但大部分时候,周围的人都是在参观。精细活只能自己来,别人插手就添乱。
前后端的处理方式真不一样,前端就这个鸟样子。
我爱霍启刚掖
发表于 2021-2-26 11:50
打个比方。
你可能有三个任务要完成。
一个是烧水。
一个是洗碗。
一个是煮饭。
于是你买了个电水壶,买了个洗碗机,买了个电饭煲。
回家水一放插头一插,开始烧水了。
碗一塞,粉一倒,电源一开,洗碗了。
米一洗,电饭煲一通电,煮饭了。
于是你管这个叫多线程。
而这个时候,
我们假设,你家一共只有一个电源插头。
好了,你多线程给我看。
这就是游戏做多核优化的难点。
有可能你有很多任务要做,为了做这些任务,你写了很多代码。
但是有各种各样的原因,导致你写的代码无法/难以同时工作。
比如:使用相同的一块资源(世界地图之类的)
比如:耦合性过大有严格的先后顺序(比如你得先洗电水壶才能烧水)
等等。
多线程的基本原则是:只有当他们互相之间不怎么干涉的时候,才是很优秀的解决方案。
而当这些任务之间互有牵制的时候……
一不小心就负优化了。
毕竟用刚才那个例子,你可能需要非常精通电路电器,
然后才能设计出来一种让三中电器同时工作的方法。
也许你说花钱买个接线板就行了,但是让你自己设计一个接线板,你还行吗?
幸福341
发表于 2021-2-26 12:00
有些东西多核运行会速度开倒车的
除了cpu运算,显卡渲染,中间还有大量时间用在io传输上了,多核处理那么核心之间也必须通信,这也需要io时间
通俗点讲,我有两道选择题要做,我一个人做要10秒一道,总计20秒,现在假设我有个女朋友(实际并没有),她也可以10秒一道,于是我给了她一道,给她题目我用了3秒,然后她找个位置坐下花了8秒,10秒后她做完了,又花了3秒走过来把答案告诉我,总计用时24秒...比我自己做完两道还特么慢了4秒
所以在排除部分程序员智力残疾的情况下,一些游戏它不适合多核负优化,没必要开这种倒车,它单线程速度更快,挺好的。
比如游戏中的血量计算,玩家受到伤害20,原血量80,游戏进程会执行80-20的计算,取返回值,置入血量这个变量。这个过程,只能单核,你总不可能拆成俩40-10给俩核心算吧。
但是游戏中也有一些可以多核计算的东西,比如解压/解密资源包,可以多核并行处理。又比如说一些游戏需要热更新资源的时候多线程下载可以cpu多核工作避免性能不足限制下载速度。
当然一些游戏也有自己的多核优化思路,那就是分离出多个进程,本体一条,反作弊一条,账户管理一条,游戏内氪金的webview进程再一条等等,然后一个游戏同时好几条进程(堡垒之夜就是这么干的),而避免全部寄生在主进程上运行。而一些进程在不需要时可以standby,不消耗cpu,比如webview虽然一般会预载入,但是正常情况都在standby,需要时再召唤出来,这样就减少读盘时间同时节约cpu资源。通俗讲就是工地上最多需要200人,但是我现在要打桩只需要20人,剩下180人过半小时就会用到,让他们回去睡觉(退出进程)肯定不合适,于是我就让它们站在边上待命,这样可以尽可能减少等待时间。
123456825
发表于 2021-2-26 12:04
因为说白了游戏做多核优化都是被逼的。
游戏这种类型的程序就是极度依赖单线程性能,这是因为蓝星的科技加点就是这么点的(别的回答说得很好了我不赘述)。为什么费劲做多核优化是因为CPU这边单线程性能到头了瓶颈了,不做多核优化满足不了玩家需求会被骂娘的。在这种前提下如果还是感觉游戏有卡顿其实就两种情况:
1、没咋做。2、做过了。
说没咋做而不是没做是因为毕竟有部分容易分离的工作可以扔到别的线程去,现实情况是部分制作组实力确实有限更进一步的并行化做不了了,或者小游戏跑300帧都吃不满一个线程的情况去做多核优化也是吃饱了撑的。
而做过了的原因也不复杂,简单来说就是“能跑就行了,哪有那么多时间和成本给你继续优化??”本代游戏主机,单核残废多核勉强的局面下,主流大作能做到现在这个多线程优化水平堪堪稳30帧已经算是极限,继续优化下去是吃力不讨好的事情,时间和预算都不允许,公司毕竟要盈利,搞跳票了谁担着?PC上的逻辑更简单,保证一个主流配置能玩,想更好那你玩家就花大价钱堆硬件吧。实话说要不是因为本代游戏主机CPU性能确实太差,游戏都不会进步这么快到现在的4-8线程优化。
AMD给出的DX12理想状况下的线程优化如图:
DX11线程
DX12线程
可以见到,理想状况下,也仅仅是尽量把能够从主线程分离出来的工作交给副线程罢了,主线程占用依然最高,如果出现了瓶颈,依然会是主线程先瓶颈。
目前来看,如果下代游戏主机用上了AMD ZEN架构,开发者们应该会一片欢呼的,费尽心思并行化有卵用?高性能单线程碾压过去不就完了?游戏多核优化卒。
DirectX 12 Technology | AMD
AMD谈Win10的DX12:多核CPU的救星 - Win10系统,DirectX 12,DX12 - IT之家
PS4 和 Xbox One 性能大概多久会满足不了主流游戏要求?
为什么有的游戏在 Xbox one X 上不提供 1080P 60 帧的选项?
luly靓
发表于 2021-2-26 12:08
一个人跑步跟两人三脚甚至4人5脚你觉得谁容易跑第一?
勇敢的树袋熊1
发表于 2021-2-26 12:17
你能问这问题,说明你不了解并行优化是怎么回事。
很难。但是并不是你想象中的完全没有优化。事实上绝大部分游戏都做了这样几种优化,1,图形渲染线程与逻辑线程并行。(没有办法完全并行)2,IO线程与其他线程并行(存档与网络通信。少数没做这个优化的,可能是因为实时性非常重要
但是即使做了这些,大部分情况下还是一核有难多核围观的结果。
大部分是卡顿的原因逻辑线程太繁忙了。比如监狱设计师这种游戏,一个逻辑周期里面可能要检查几千几万个对象的状态,其中几千个可能存在寻路,碰撞,交互,随机事件等。监狱设计师的实际体验来看,一秒钟不会少于20个逻辑周期。
这些逻辑是严格实时,强交互的,根本没有一种通用的框架可以并行化。
并行化的方法当然会有,但是得针对实际逻辑单独开发,对大多数游戏厂商来说都负担不起这样的时间成本和开发成本。
米老鼠和蓝精鼠v
发表于 2021-2-26 12:24
因为状态多,交互多,错综复杂。
不适合多线程,因为要考虑线程安全。
而一种很舒服的(如果能用)多线程程序,是不咋需要考虑线程安全问题的,因为每个线程都是独立的,相互隔离的。
不妨再推广到单服架构和分布式。
为啥游戏用分布式的比较少,也因此很多人觉得游戏服务器技术落后,很多新技术没用。
问题是能用么?合适用么?
就是因为状态!服务器之间交互会非常频繁,而且要考虑事务。
(所以分布式游戏服务器,大多数还是将系统独立化,拆分不能太细)
(互联网那点分布式,说直白点,就是多个微服务搭配个人分布式数据库)
寒郁轩良
发表于 2021-2-26 12:31
多线程并不是你想象中的那么简单,能把运算放到子线程,减少主线程的压力,听起来很容易,其实实际情况往往比复杂。
每个线程的运行是独立的,可是又要它们有交互,例如我主线程需要子线程的结果来做运算,可子线程还没运算完,那我主线程就只能卡在那等子线程,效率也没有提升,反而令原本简单的程序变复杂。
再例如你提到钢铁雄心,各种运算很多,特别是资源的变化,AI的策略。AI需要根据资源的变化进行决策,可资源的变化还没运算完,那AI应该怎么干?干等?
至于有没有用多线程?应该是有的,只是在你不知道的地方用了,例如粒子计算之类的。
核心逻辑计算部分为了降低复杂度,应该是没有用到。
poney
发表于 2021-2-26 12:41
干了十多年游戏开发,优化是做的最多的工作,被同事戏称为老中医,专门负责疑难杂症。简单说几点:
1、大部分优化都是在后期,因为前期你也不知道哪些要优化对吧。等你想加多线程的时候,代码已经复杂到很难控制了,什么回调,什么静态变量,冷不丁就被访问一下,都不知道哪里该加锁,敢加锁。难道把代码重新设计,重新写一遍,那制作人会疯掉。曾经经历过一个项目后期加多线程计算动画,结果无数崩溃。多线程的崩溃查起来很痛苦,很多堆栈乱的一塌糊涂。最后实在没办法,只能帮他们把上层实现的多线程代码都去掉。在最底层最安全的地方,稍稍并行了一点点。凑合用吧,有比没有强。 这是时机上的困难。
2、IO什么的,这些容易加多线程的地方,一般都是会加的,任务界限清晰,算法容易并行。但是很多不太好加。遇到过一次,多线程是加了,好像也有用,但就是有卡顿。查了好久,才发现是因为底层的内存分配。底层运行库的多线程分配的锁太厉害了。好吧,换内存分配库,慢慢调库里面的参数,比如粒度什么的。这不像GPU,对大规模数据的并行计算模型很一致,一旦某个算法被发明或者近似公式推导出来,很容易推广,就像对某种疾病有特效药。而CPU要处理的问题太多样,工程上复杂,就像癌症,可能是几千几万种疾病都叫癌症,医生要对症下药的。
3、硬件虽然是多核,但是锁和互斥,更装逼一点说,比如缓存命中和失效,也都很考验工程师的功底,写好不容易。国外情况不清楚。但是国内的情况并不太好,大家压力大, 能忙着赶活挣钱养家糊口。面试很多人,能把什么是线程说清楚搞明白就算挺不错了。虽然工作都很忙,经常996,但大部分都是if else写业务,能写个A*就算挺有成就感了。这还谈什么写多线程啊。除非能把底层结构设计到大部分开发人员完全不需要考虑锁的存在,否则还是算了吧。
最重要的放到最后:如果发现程序慢,应该先查IO和冗余计算。再查IO和冗余计算。第三遍查IO和冗余计算。
什么大师特
发表于 2021-2-26 12:48
确实很难。
多核涉及到了多线程。尤其是涉及到游戏逻辑的多线程,非常复杂,bug非常难找。不搞多线程支持可能后期没法玩,搞这种逻辑多线程的后果可能是从头到尾都没法玩。