游戏主机运行效率为何总比 PC 高一些?

这是题主一直以来的一个困惑 刨去有libGCM这种黑科技的PS3不表。 就拿xbox 360,xbox one来说,这二者可是满满的PC血统啊。系统是直接拿的windows,照搬的win32 api,图形api统一是Directx(这是重点),开发环境统一的visual studio。仅仅是多了个eSRAM,然而据国外开发者的讨论,那玩意也并没什么大用。 所以问题来了,PC在CPU普遍富余的情况下,同样的HLSL为啥360上能跑60fps妥妥的带v-sync,而拿到同档GPU的PC上就变30fps还…
关注者
483
被浏览
28819
其实原因只有一个,console硬件固定,pc可以。这一点上,其实移动设备也是这样的。

xbox开发前期,就是拿的"pc"来模拟。比如xbox 360用的是个mac,因为都是powerpc的cpu。xbox one用的就是一个特定配置的pc,因为都是amd的cpu和gpu。即便在这种情况下,性能仍然有几倍的差距。因为os还没完成定制化,各个组件仍然要假设可更换,因此要多一个驱动层,和具体硬件打交道。在这种情况下,app的指令流需要经过几个环节才到达硬件。比如图形部分,需要:

app->D3D runtime->user mode driver->dxg kernel->kernel mode driver->GPU

而到了console的阶段,驱动可以直接合并到系统里,整个调用栈可以变得非常简单,各种对参数的检查也都可以去掉(因为不需要考虑硬件支不支持某个特性)。这样的话就变成:

app->D3D runtime(合并了umd)->dxg kernel(合并了kmd)->GPU

umd和kmd都被合并掉了。

xbox one上再进一步,把D3D runtime从dll变成lib,直接连入app。依靠编译期的link time code generation,还能进一步去掉死代码和深度优化,也就是说变成了:

app->dxg kernel->GPU

通俗来说,就是把原先的积木拼装结构,变成电焊焊死的,自然更结实了。pc上因为随时可能更换硬件,没法这么搞。