最新消息:2008-2023,十五年。青青子吟,悠悠我心。但为君故,沉吟至今。

【业界】开发者和你谈——PS Vita专题

游戏业界类 Lafirel 3638浏览 0评论

psvzj

前言

西方人常说:你比较这两个东西,是拿苹果和橘子比。我认为,这是他们文化里中庸的一面,而我自己则不是这种风格。我在这里清楚的给Vita的机能定性:PS Vita很能打!(PS Vita机能很强!)

具体来说,《神秘海域2》这样的720P游戏,在降低一些三角形数量的情况下,Vita发挥极限机能在544P下应该也能毫无折扣的做到。

不过,Vita能打归能打,可是连几个能打的游戏都没有,这确实是现状。Vita跟所有其它的主机一样,不会用或者不认真用,也就不能发挥出应有的性能。

迄今为止,最接近我说的极限机能的游戏是《杀戮地带:佣兵》。但它使用了动态分辨率,并不能保持544P/30fps,理应还有提升的余地。

而其它一干游戏,都是以408P的分辨率为主流,甚至是368P的AAA游戏也是有的。帧数方面更是如此,除了几个格斗游戏,60fps的AAA游戏几乎是没有的。它们都没有发挥出Vita应有的性能。

在众多AAA游戏表现不济的情况下,我开始心里很没数。因此,当初我给我自己设定的目标是30fps,分辨率也可以动态。现在优化结束了,我却发现自己做到了无妥协的544P+60fps。

我猜很多人会想,如果是画面不好技术落后的小游戏,达到544P+60fps也不是什么难事吧?

拿一个橘子来比一比我的苹果吧。我用的技术超越了PSV版的COD,这个自信我还是有的。我家游戏比COD强的地方有:

1. 分辨率更高。544P vs 408P。

2. 帧数高。60fps vs 30fps。

3. 更好的光照,动态光源数多,每个人物和物体接受6个动态光源。COD应该没有那么多。

4. 所有物体都有法线贴图 vs 部分物体有

5. 所有物体都有镜面高光(Specular Highlight) vs 部分物体有

6. 各类纹理和法线图质量非常高,很多素材甚至直接用PS4版的1080P素材。非常锐利 vs 非常模糊

7. 多了好几倍的粒子效果和血迹特效。

与此同时,也有一些不如COD的地方:

1. 同屏三角形数量目测要少一点。

2. 没有Bloom特效。

总体来说,应该是更胜一筹吧。

=======================================================

现在的60fps,也是从最开始的5fps一步一步的优化得到的。期间优化了多少轮,数都数不清了。我会在接下来的几篇中整理清楚。

我一年前总结过,游戏程序的性能一共三方面:

1. CPU性能

2. GPU性能

3. 带宽

万变不离其宗。

有的同学曾经问过我,像《龙之皇冠》这样的纯2d游戏,为什么也没做到60帧?下一篇我们将会聊Vita的CPU,之后大家就都能回答这个问题了。

第一天 CPU

Vita的技术参数在Wikipedia可以查到:http://en.wikipedia.org/wiki/PlayStation_Vita

我们今天说的是CPU。

曾经不下有五个人问过我,Vita用的ARM Cortex-A9的主频是多少?说实话,很多细节的技术指标我是记不太清楚的。只是这主频是多少,却压根不是记不记得的问题,而是我根本就不知道。

很多人肯定要问,怎么可能不知道主频呢?不知道主频你怎么用呢?

其实我自己也好奇,我钻研了三年的机器,主频到底设在哪里?

不过从实践的角度来看,既然给了我一个固定的CPU,那它的极限性能就是固定的。与其去空想它的极限性能在哪里,不如把它的用好,用好了之后自然就知道极限了。

实践证明它的极限性能在这里:我对这个CPU的利用率已经到了90%,在这个前提下,它的计算能力跟PS3的主处理器PPU基本持平。

对这个性能水平,我需要做跟严格的定义。首先,这个CPU是一个四核的CPU,其中游戏只能直接控制三核,另外一核是预留给系统以及后台服务的。

虽然游戏的程序并不能直接控制第四核,但是不代表第四核的运算跟游戏完全无关。很多游戏必须依赖的服务,例如存档、文件解压缩等服务,都在第四核中自动进行。另外,跟游戏无关的系统功能,例如后台下载、推送通知等也在这个CPU核上进行。

因此,无论游戏优化的多好,第四核的CPU利用率都是不可控制的。

我说我现在的CPU利用率已经到了90%,指的是我可以有直接控制的那三个核心的利用率已经到了90%。

与此同时,第四核的利用率通常是50%左右,这50%我完全不知道有多少是用在存档、解压缩等服务上,有多少是用在系统上。

我上面说的跟CELL的PPU基本持平,也是假设只有三核完全利用好的情形,而不是四核的情形。

========================================================================

一个题外话。PS4是八核的CPU,其中游戏可以用六核。每个核的实际性能也恰好大致跟CELL的PPU持平。

这告诉我们一个道理:知道主频一点用都没有。PPU的主频正好是PS4单核主频的两倍。

========================================================================

相对于GPU方面的优化,我对CPU方面的优化工作做的相对没有那么多。其中最主要的原因是,单看这个CPU的一个核心,它的特性很普通,没有什么可以特别加以利用的地方。

所以按照一般思路优化好的代码,在Vita上跑也就没什么问题。Cache用好,算法没有太蠢,基本上我只做到了这个程度。

这跟传统意思上的CPU优化有很大的区别。

我是科班出身,自然知道传统意义上的优化要搞汇编,要榨取每一个运算周期。

说实话,我在GPU那边是时时刻刻跟汇编打交道的,但是CPU这边确实没有必要。

这就要从Mark Cerny设计这个硬件时的思路说起了。

我一直觉得Vita就是个微型的PS4,因为它们的设计思路实在是一样的。我理解的这套思路就是:
1. 不盲目堆砌运算能力。
2. 强调对称的多核处理(Symmetric multiprocessing)。(PS4有部分例外)
3. 鼓励聪明的使用硬件。

盲目堆砌运算能力,这个显然是针对PS2和PS3做的拨乱反正。

强调对称的多核架构,这个也是针对PS3做出的调整。Vita的CPU每个核都一样,这叫做对称的多核处理。PS3的PPU和SPU用起来完全不一样,这叫不对称的多核处理(Asymmetric multiprocessing)。

(PS4的CPU是完全对称的。但是PS4同时也鼓励GPU辅助CPU计算,这却是不对称的。)

鼓励聪明的使用硬件,这个解释起来非常复杂。我试图深入浅出的说一下。

跟PS3的硬件比较,Vita的各部分硬件都有一个显著的特点:处理能力不如PS3,但是避免计算的能力却高于PS3。在这种情况下,硬件用的聪明不聪明,区别就非常明显了。

很多人说PS3难用,但其实用好PS3的思路不多,最重要的就一个:用好协处理器SPU。

用好Vita的硬件却不是这么直接的事情,必须对硬件的各部分以及它们之间协同工作的原理有深刻的理解,之后才谈得上真正的优化。

========================================================================

最后回到CPU优化的话题。因为Vita强调的是对称的多核处理,所以最有效的优化就是建立一个高效的并行处理模型。

具体来说,首先要把游戏的任务分解好:AI、动画、物理、粒子、渲染、音频等等。这是最难的一步,因为牵涉的代码修改最大。

接下来,能同时处理的任务,一定都要利用好三个核心进行并行处理。一定不能同时处理的任务,必须也要协同好它们的关系。

比如说,如果动画还没计算完就进行渲染的任务, 就会出现人物的一半显示的是上一帧,另一半是当前帧的情况。这种情况是一定要避免的。

像这种一个任务等待另一个任务的情况,是CPU优化最大的敌人。

我CPU利用率能达到90%的关键,就是有些看似不能并行处理的任务,经过巧妙的处理之后,就能够并行处理了。这样才能保证三核一直满负荷工作。

我家游戏在创作阶段是以PS4的硬件为基础的,每个人物的骨骼数是前作的4-5倍,动画的复杂程度是前作的10倍都不止。要想在Vita上跑出60fps,只有三核心一直满负荷工作,才能计算更多的同屏人数和更多的物理效果。

========================================================================

总结来说,Vita的CPU优化的关键,在于设计一个高效的并行处理模型,而不是拘泥于传统的对CPU运算周期的榨取。

我看到回帖里有很多质量很高的问题,我后面一定会全部都讨论到的。

今天先讨论一下《龙之皇冠》的掉帧问题。作为一个纯2D游戏,没有光照阴影,没有复杂的后期处理,理应没有GPU方面的瓶颈。

这个游戏的PS3是没有掉帧的。我之前说过,Vita的三核用满了,基本能和CELL的PPU持平。如果用不满,掉帧也就没法避免了。

下一篇要不要直接来高能的,要不要讲解GPU,我还没想好。但是可以肯定的是,光是想象一下GPU篇就足以让我亢奋了。敬请期待~

第二天 留言集中回复

我发现这次大家回帖留言的质量非常高,因此很多有趣的内容可以再铺开来讲。

========================================================================

有大大回帖说”为啥PSV从游戏中途退出切换其他任务比PS3还快呢? 是第四个核的关系吗?“

简单的回答,是这样的。

PS3游戏运行的时候,XMB系统的运行就会被PPU交给单个SPU(思考题:windows单核也能跑多任务,为什么ps3要这么麻烦的去弄?)。SPU的性能肯定不如PPU,这就是为什么在游戏运行时操作XMB,它会有严重的拖慢。

当PS3玩家选择退出游戏的时候,XMB系统的运行会被交还给PPU。这个工作基本等于是把系统重启了一遍,所以耗时很长。

前一天我们说过,PSV的设计提倡对称的并行处理。在四核的CPU上,系统一直是在CPU的第四个核心上跑,游戏只能用到三个核。基于这样的设计,无论是进入还是退出游戏,系统软件都不会受影响。

这个设计跟xbox 360是很像的。但是不同的是,360有三核,三核都可以跑游戏,系统能用的CPU资源有时多、有时少。有无运行Kinect也会有影响。这就是为什么玩Halo4的时候,Dashboard反应速度慢,而玩小游戏的时候,Dashboard反应速度就很快。

到这里,相信PS Vita,PS3,PS4和Xbox 360的系统运行问题,大家就都知道了。举一反三的话,Xbox One和WiiU也是清楚的。

========================================================================

很多大大都担心说,你CPU的利用率(占用率)那么高,肯定会影响续航时间吧!

答案是,CPU利用率高肯定是会多耗点电,可是这个量没有那么夸张,影响续航的事情是不存在的。

换句话说,省电绝对不是不做优化的理由。

另一位大大又问了,那为什么我待机和下载东西的续航时间差别这么大呢?

因为这根本是不同的情况。网络通讯是非常耗电的,是耗电之王。而纯待机的时候,Vita会使用启动智能模式来利用网卡。在大多数时间里,网卡并不在工作,自然就是省电了。

无论是网卡,还是CPU,还是GPU,都是一个道理。开启与关闭有天壤之别,但是用10%与用90%则区别不大。

具体到CPU,假设我的并行处理模型很没有效率,很多任务之间相互等待、颇多掣肘,这样就会有很多CPU时间因为等待而空下来,一旦等待结束就可以继续运行了。

从用户的角度看,CPU确实是停下来了,但是实际上还是有firmware在不断的跑,否则它怎么知道什么时候等结束了?

打个比方,以2k的速度下载东西,和以2M的速度下载东西,哪个更耗电?其实是半斤八两。

========================================================================

Q: “以前是知道在软件层面,开发套件上,对PS4/V有打通的设计,看来Mark Cerny在硬件层面也确实是把PS4和PSV作为整体来考量的。这对PS4/V跨平台开发带来了什么样的影响?如果能具体说说跨平台的优 势,问题或效率,成本这些是最好~”

之前我们说了,PS4和PSV的CPU都是对称的多核架构,每个核都是完全相同的。

这倒不是说代码可以直接通用,而是你设计的并行处理的模型可以通用。只要模型设计的好,在这两个平台上实现之后就一定都是优化的。

PS3则要麻烦一点,因为你针对SPU进行的优化,没有办法用到别的硬件上。

不过,PS4/V这两个平台的性能差距很大。同样的程序,就算在Vita上跑到极限,在PS4上还是会有很多CPU资源的闲置。反之,如果PS4跑到了极限,那Vita必定是跑不动的。

要想完美解决这个问题,这就需要你设计的模型有很好的可扩展性(Scalability)。

这其实又是一个翻译的不太好的术语。这里的Scalability指的是,你的游戏能够很方便的根据实际情况提升效果或者减少效果,而不需要重新写程序。所以我更推荐台湾的译法:可扩缩性。

比如我家的游戏,严格说来,PSV版肯定是比PS4缩水了,但是我相信我做到了两点:

1. 在大多数情况下,几乎是没有区别的。
2. 在有区别的情况下,多数人也看不出来区别。

所以,优化不仅是技术上的工作,更是设计上的工作。

GPU那边的情况也是一样的,以后我会讲到。

明天我来开GPU的坑~(撸袖子)

=======================================================

小更新

我今天加班之余,还跟几个人交流了一番。

首先是跟SCE ATG(高级技术组)的研究员切磋了一下,对PSV的GPU又有了新的理解,也发现了一些新的思路。我觉得需要先整理消化一下,再写出来。

然后,我跟A9的切尔西大大聊了很久,他说他想看一些更细节的东西。而这次也有回帖说我写的不够生动,我觉得都很有道理。这次虽然实际内容比较多,但确实在表现的方法上没有以前好。

这两个原因让我觉得自己需要再酝酿一下。

好多人反应说,想知道GPU的型号后面那个加号是什么意思,到底加了些什么内容?下一篇中我会认真回答。但是这个牵涉到非常细节的编程问题,所以表达起来有点难,我再想想怎么写的深入浅出。

另外,我觉得我还是应该结合实例来讲解,这样才比较有趣。我决定挑神秘海域为实例来讲解GPU,之前我回帖分析忍龙2的内容,也会整合到正文里。

今天凌晨1点我已经更新过了,明天晚些时候再更新~

=======================================================

第三天 GPU篇1

很多人一定很好奇,PS Vita和智能手机、平板的硬件架构很接近。论绝对性能的话,还会超过Vita很多,但为什么手机游戏的画面却很落后?

相信看完了这篇,大家心里就会有答案了!

=======================================================

首先,我们先复习一下关于GPU的知识。虽然这些知识在本文的第一期已经讲解过了,但是这里我又融入了一些新的注解和推论。

GPU是一个专业的大批量处理图形数据的芯片。输入它的数据是几何数据(包括顶点,索引,法线,tangent等等),以及材质(包括纹理,光照,反射参数等等),GPU将这些数据计算之后,进行栅格化,计算每个像素的颜色,最后输出特定分辨率的像素**,最终形成我们屏幕上看到的图像。

CPU和GPU之间的合作方式是这样的:CPU准备好数据,然后提交任务给GPU。(这个任务叫做Draw Call。)

因此我们有一个重要的推论:无论CPU的性能如何,无论用什么效率的api(opengl、DirectX还是ps系专用的api)来提交任务,任务一旦提交了,GPU运行起来都是一样的。

如果画面不好,则必然是如下几个原因之一:
a. 给gpu的任务建立的不合理
b. gpu要处理的数据不友好
c. 因为不了解gpu内部的原理,对gpu的编程不好,导致资源闲置。

那么,怎样建立GPU任务才比较合理?怎样保证数据让GPU处理的得心应手?怎样才可以提升GPU的利用率呢?

现代的GPU有几个发展趋势:

1. 大批量数据的处理能力非常高,小批量数据的处理会慢很多。
2. 数据处理的多线程化程度越来越高,线程调度的方式越来越复杂。
3. GPU内部的处理和调度单元越来越多,可编程化越来越高。

Vita的GPU就是一个很现代的GPU,它具有以上全部的特点。

这些特点到底意味着什么呢?对于游戏开发者来说,应该如何聪明的利用呢?

我们一个一个来以实例讲解。

这里的内容比较专业,如果觉得晦涩是很正常的,希望大家不会产生厌倦感~

怎样建立GPU任务才比较合理?

Vita的GPU有很多有趣的特点,这里举两个例子:
a. Vita有scene的概念,切换scene非常昂贵。所谓scene,可以简单理解为一个批次的数据处理。一个scene可以包含好几个draw call,但是如果要切换render target的话,就必须终结当前scene,再开启一个新的scene。
b. z buffer在没有必要的情况下,并不会同步到显存里,而是直接在芯片的高速缓存里进行操作。

也就是说,很多对ps3/ps4来说最优化的draw call,到vita这里就可能会有更优化的建立方法。

举例来说,ps3的神秘海域大量运用了deferred lighting和post effects,这就必须建立非常多的render target和小任务,每个任务都很便宜,把它们串起来执行,在算法上是最有效率的。

psv的神海也照搬了这一模式。但是要注意到,在psv上切换render target就必须切换scene,而切换scene的代价非常高。实际上psv神海未经修改就直接套用ps3版的光照模型,导致了很多不必要的资源浪费!

而psv的杀戮地带就吸取了这个教训,所以的光照都改成forward lighting,使scene的数量最小化,这是杀戮的画面比神海好最重要的原因。

我自己也在这方面做了最大的努力。其实,这就是在程序中贯彻“大批量数据的处理能力更高”的现代GPU理念。

z buffer那个特性也很重要。只要保证不去清空、读取或者非正常修改z buffer,就不会导致多余的内存操作。

(注:这段内容是经过回帖讨论之后额外加上去的,感谢gzfrozen)
所谓非正常的修改z buffer需要定义一下。GPU在渲染不透明物体的时候,我们通常会让GPU改写z buffer,这是自N64以来的GPU最基础的工作原理。除此之外的手动修改z buffer的手段,在vita上可能会造成额外的内存读取。例如,渲染完场景和人物,清空z buffer,再渲染UI和HUD,这种情况就是。

如果有可能的话,psv游戏务必要调整gpu任务建立的方式,保证z buffer一直在高速缓存里不出来!

怎样保证数据让GPU处理的得心应手?

举例来说,想做HDR tone mapping的话,有一个很重要的gpu特性就是gamma correction。

看起来好像很高大上的样子,其实原理很简单:GPU在读取纹理像素的时候,会套用一个固定的公式做修改。其修改的结果就是调整图像的gamma。

psv的GPU支持这个特性,但是处理的成本比较昂贵,所以我们为了优化,需要另辟蹊径。

优化的方法就更加简单了,只要对纹理做预处理就好了。用俗话说:先ps一下~

不过这个方法背后是需要做严格的数学推导的。预处理过后的纹理也不能直接用,而是需要shader套用一个稍微简单点的公式来达到应有的效果。

再举一个例子。

既然是大批量的数据处理,那么一个批次的数据中,它们排列的顺序对GPU性能有没有影响呢?

答案是:对ps3/4没有,对vita却有很大的影响。Vita需要对顶点数据进行排序,才能达到更高的效率。

事实上,绝大多数vita游戏都做了顶点排序的优化。手游方面就没有这么乐观了。

=======================================================

运用上面的知识,我们已经可以回答“手机游戏画面落后”的一部分原因了。

高端手机和平板的GPU架构和Vita相似,而绝对性能比Vita强。手机游戏画面不好,必然是游戏优化的不好,不得不降低画面来保持可玩性。当然,可能也有一些厂是不知道怎么把画面做好,但是我不做别人能力不济的假设。

假设做手游的人能力很强,为什么游戏还是优化的不好,有几个原因:
1. 手机游戏不针对固定硬件,没法针对固定硬件的特性进行优化。
2. 即便想针对特定的设备做优化,手游的开发模式决定了他们没有深度优化的态度。
3. 即便有深度优化的态度,手游程序也没有权限直接跟硬件打交道,来利用硬件的特性。

其中第三点,将是下一篇讲解的重点。

psv的游戏可以直接控制硬件底层,这对游戏的效率来说,究竟意味着什么?究竟可以甩开手游多大的差距?

psv的GPU型号后面那个加号到底是什么意思?psv究竟有什么独有的特性?

上面提到的现代GPU的特点“ 数据处理的多线程化程度越来越高,线程调度的方式越来越复杂” “GPU内部的处理和调度单元越来越多,可编程化越来越高”究竟怎样在vita上发挥作用?

杀戮地带利用了哪些其它的GPU特性?为什么我一直说神海还有更优化的余地?

下一篇中都将揭晓~

第四天 GPU篇2

今天和明天的内容很高能,因为你没看错,这就是主机游戏技术的极限。ICE Team那些死宅,每天埋头研究的就是这种性质的东西。

当然,现在ICE Team主要是针对PS4做研究。我在这里说的,都是他们玩剩下的,或者是不屑于玩、交给SCE其他技术组研究的东西。性质相同,前沿的程度不同。

=================================================================

我相信,事物的本质一定是简单优雅的。如果你觉得一个东西很复杂,那你一定是没有理解它的本质。

这个信仰在理论物理和计算机科学中都有很多例证。再高深的技术,也一定有一个大家都能理解的突破口。

接着昨天的内容,我们说手游的画面不好,其中第三个原因是:

因为不了解gpu内部的原理,对gpu的编程不好,导致资源闲置。

首先,我们来讲一下什么是“对GPU的编程”。

我们一般说的游戏程序,都是控制CPU的程序。我们用它来计算动画,计算AI,然后准备好数据、提交任务给GPU处理。

针对N64以前的主机,在GPU拿到这些数据之后,就会用使用固定的公式来计算,最后输出像素。

从N64开始,GPU的计算方法就可以自定义了,这就叫做可编程GPU。

从Xbox,对GPU编程的标准开始统一,统一以后的控制GPU的程序,叫做着色器(shader)。

着色器这个翻译,很容易被人误解为它是一个硬件。其实,shader既有软件程序的属性,也有材质的属性,它唯独不是硬件。

为了避免理解上的困惑,我这里统一使用shader这个英文词。

为什么说shader有材质的属性呢?因为shader的本质工作就是定义材质。比如说,如果我要做一个金属的材质,我就需要在shader里定义它是怎么反光的;如果是一个木头的材质,反光的公式可能就不一样了,或者公式所需要的参数就不一样了。

(顺便说一下ps4的一个设计理念,就是提倡compute。所谓compute,就是拿shader来做它的非本职工作,比如反过来帮助CPU做计算等。)

总结一下:自xbox以后,写shader是对GPU编程的唯一方法。

=================================================================

有了以上的知识,我们可以做出一个重要的推论:

对GPU编程做的好不好,就看shader写的好不好。

那么,怎样才能写出充分利用GPU的shader程序呢?

前一天我们讲了,现代GPU有几个特点,其中第二点和第三点是:

2. 数据处理的多线程化程度越来越高,线程调度的方式越来越复杂。
3. GPU内部的处理和调度单元越来越多,可编程化越来越高。

怎么理解这些特点呢?

我们先从多线程开始说起。

CPU的多线程好理解,一边算这个一边算那个呗。那GPU的多线程是怎么样的?是不是一边算人物的头,一边算人物的手?

其实,这还真的有点像真实的情况。不过,不是把物体分成几部分,然后并行处理这么简单。

现在我来拿Vita的GPU来做实例讲解。

Vita的GPU跟CPU一样,是一个四核的架构。因为游戏不需要渲染任何系统界面,所以四个核心都可以全部被利用于游戏,而没有系统来争夺GPU资源的情况。

(Xbox One最早就是因为Kinect会和系统争夺GPU,所以GPU有10%的资源不能被用于游戏。最新的SDK已经没有这个问题了。)

GPU的本职任务分两种,一种是顶点任务(比如第一期讲的World-View-Projection转化),一种是像素任务(计算像素的颜色)。

这两种任务在Vita里,以同等的身份,被调度到四个核心上运行。这就是Xbox 360首创,并从此流行的统一渲染架构。

PS3则不是这样的。顶点有顶点专属的计算单元,像素有像素的计算单元,它们的GPU资源不能共享。(思考题:为什么统一渲染架构比较好?)

这可不是故事的结局,因为Vita GPU的每一个核心里,都有四个主计算单元并行工作。所以,这个GPU其实是一个16线程的GPU。

那么,每一个核心内的任务是怎么分配和调度的呢?

顶点任务很简单,因为顶点都是独立的,四个计算单元一直算就是了。

像素任务的分配和调度,稍微复杂一点。举例来说,如果GPU有一个计算16X16的像素的任务,它会画一个”田“字,把它分解成4个4X4的小任务。每个主计算单元分别计算一块。

每一个像素任务,都会先被分解为一个很小的像素块(Tile),当它们被分配到某一个GPU核心时,又会以”田“字型的方式一分为四,在四个计算核心上并行计算。

这就是这块GPU16线程的基础调度方式。

是不是很有效率呢?

其实,世上哪有这么好的事情。根据你的用法,它这么调度的效率可高可低。

你想,一个核心内的四个计算单元,它们怎么可能一直都同时工作呢?有的计算单元可能开始的早,有的计算单元可以完成的早,这都会造成资源闲置。

这样的资源闲置,是对GPU编程不够优化最主要的原因,没有之一。

造成这种资源闲置的原因包括:

a. 当一个像素块被分解成四块之后,一定会存在某种程度的负担不均匀。
b. 四个计算单元之间,虽然运算能力互不影响,但是还是会因为寄存器,带宽等共享资源而相互掣肘。

到这里,我们已经可以回答解答很多实际的问题了。

有一个很好的问题:杀戮地带,如果增强建模,但是降低分辨率,行不行?

答案是,不行。如果在那个基础上增强建模,势必会生成更多非常小的三角形。这些小三角形是造成原因a的罪魁祸首。

而要克服原因b,则需要一些编程功底。shader在数学意义上是不是最优的?shader生成的汇编是不是最优的?寄存器和带宽的使用是不是降到最低了?

总而言之,这需要不断的调整shader程序,严密监控GPU时间。

=================================================================

今天我们再多看一个问题。

Q: psv的游戏可以直接控制硬件底层,这对游戏的效率来说,究竟意味着什么?究竟可以甩开手游多大的差距?

A: 从不关注GPU时间,到关注GPU时间,然后有针对性的优化,渲染的性能提升好几倍是很常见的事情。

另外,GPU的线程调度也不是优化的唯一思路。这个16线程的调度,只是PSV GPU工作原理的冰山一角。明天我还会介绍好几种可以让性能翻倍的思路。这些思路都已经被应用在psv游戏里了。

第五天 GPU篇3

话说冰山一角这个词,英文原文有明显的贬义,用来形容问题或者麻烦比看到的还巨大,其背后也有阿基米德定律的科学含义。

但是,这个词的中文版本已经被引申为全面看待事情的意思。

泰坦尼克号这种事故,只在欧美骇人听闻。我们生活在温带和亚热带,历史上也闭关锁国了几百年,可能几辈子都没机会看到冰山,自然不知道冰山就是灾难。而“一角”这个译法,想必是出自没有实际体验过冰山的人的手笔,与“冰山之尖”的字面意思差很多,科学含义也没有了。

今天我们就来看看PS Vita这可爱冰山的另外一角,也看看手游的冰山之尖,并终结GPU篇。

============================================================

昨天的聊了对GPU编程,其手段是写shader。以现代GPU的设计思想来说,shader的运行方式越来越复杂。

当然,这不是没事找事、故意把简单的事情弄复杂。它们背后都是有道理的。

以Vita为例。我最早的时候说过,Vita的运算能力不如PS3,但是Vita避免不必要的运算的能力超过PS3。这完全的得益于较为现代的GPU设计。

四个GPU核心,每个GPU核心里都有很多功能不同的硬件小单元,其数量超过十个,种类大致分为如下三种:

1. 运算类,就好比我这样的民工。这是GPU计算能力的主力单元,是晶体管最集中的地方,比如昨天提到的主运算单元。
2. 调度类,就好比游戏制作人,指挥民工的。这是GPU的中枢神经,负责各个单位的调度和线程调度。
3. 辅助类,就好比工作中给我泡咖啡的人(制作人:你想的美!)。比如说,读取纹理加速器,比如昨天提到的生成像素块(Tile)的单元,又比如下面将要说的特别单元。

这个特别的单元,它以Tile为单位,专门负责去除不需要处理的像素,以保证运算单元尽可能不浪费运算周期。

什么是不需要处理的像素?当然是那些被挡住的像素了。

昨天有人问了一个很好的问题,他说:GPU处理像素的时候,理应不会关注像素与像素之间的逻辑关系,像素都是独立的,和顶点一样,四个计算单元一直算就是了,为什么这里和顶点待遇不一样?

简单的说,像素成块的处理,可以说是GPU的默认标准。

首先,从算法意义和缓存用量上考虑,它非常适合divide and conquer的方法。这比一行一行从左到右的处理方法更有灵活性和优化空间。对于不熟悉算法的同学,这个东西就是古罗马帝国用的“分而治之”。中国人对这个太懂了,无非平衡之术也~

有了这个考虑,各部件就都需要遵循这个标准。(如果不这样做,很多实际的功能,比如几个3dsmax同时渲染一个图,那叫啥技术来着。。。总之,很多高效的好东西都是不可能的了。)

比如,纹理的存储方式,也是保证可以很方便的被分割成Tile来处理的。

上面说的那个特别的小单元,它输入的数据是Tile内的顶点任务计算结果,然后跟深度缓冲(z buffer)进行运算,一旦发现这个tile被挡住了,就干脆在像素任务开始之前,一次性跳过这个tile。为什么以tile为单位?因为电路就是这样设计的。

这可比PS3要先进。PS3的RSX是先傻算每个tile,然后发现某像素被挡住,然后才跳过。这就多出了很多不必要的像素任务,加重了调度和运算的负担。

==========================================================

我们把话题拉回到民工和泡咖啡那一段。

话说这个调度的单元,它有点神奇。

按照一般的认知,GPU的任务调度是固定在电路里的,我们就算下圣旨,管天管地也管不着机器的运行。

其实,Vita GPU里的主调度单元是可编程的,只是编程的方式很微妙。就算是熟悉GPU编程的人,一开始也会觉得奇怪。

简单的说,在Vita上,shader程序在被编译并转化成GPU指令的时候,会被编译器分成两份程序。(其实是四份,但是为了简化说明,我就当做是两份。)

一份被派送到主运算单元,指挥材质的运算。

另一份被派送到主调度单元,来辅助运算。

辅助运算的内容就那几样,举例来说,读取纹理的像素值,其实不一定要等到像素任务开始的时候再进行,有时候可以提前。主调度单元会根据实际情况,尽早的对纹理进行预读取。

这样做,既可以减轻运算单元的负担,也可以分流带宽的要求。这也是shader优化的重点之一。

这个东西的难点在于,你怎么知道哪些指令会被派送到主调度单元?怎么保证这些指令能够尽早的执行?

这就需要对硬件和编译器的工作原理了如指掌了。

当你看到shader,就能在脑子里编译它,转化成GPU指令,然后在脑子里模拟指令的执行和数据的流动,就可以使用这个特性了。

==========================================================

我们花了三天的时间,来解释为什么Vita的GPU设计更加现代。

因为,不仅GPU自己聪明;如果使用它的方法也聪明,GPU就会变得更强大。相信大家已经都有所体会。

GPU篇就到这里为止。明天是留言集中回复~有几个问题我一拖再拖,明天肯定不会拖了。

第六天 内存显存及其它

先回答一个留言。

Q: PS Vita的显卡型号是SGX543MP4+,这个加号是什么意思?

A:

(打瞌睡时间开始)

我把我觉得可能行比较大的特性列了出来:

1. 部分寄存器和缓存有直接的读写权限。比如shader输出的像素值,是可以直接在下一个shader里读取的。这个看似平常,但用好了十分强大。
2. 支持Macrotile。会用这个,可以大大降低scene的数量。为什么要降低scene的数量,在GPU篇1里面有详细讲到。
3. GPU的调度单元可编程,在GPU篇3里讲解过。
4. Z buffer可以在芯片里不用跟显存同步。这个在GPU1篇里也提到了。
5. 内存可以选用特定的Cache协议,让GPU的高速访问。这几乎等于是变相的统一内存架构。

(打瞌睡时间结束)

这些特性,可能有些不是Mark Cerny的团队给PSV添加的,也可能有添加的特性我没有列出来。

各位大大,如果你能确定哪些不是,请回帖告诉我。

不过,我书读的少,你们不要骗我~

==========================================================

上面说的第五项,我们可以再铺开些,聊一聊PSV的内存管理。

PSV没有使用统一内存架构,即CPU用的内存和GPU用的显存是分开的。

内存的大小是384MB,其中游戏可用的是256MB+26MB。显存的大小是128MB,游戏可以用全部。

很多人肯定已经在打字回帖了,说LZ你到底懂不懂,Wikipedia上都说Vita的内存是512MB,你是索黑!

我在这里明确的告诉大家,Wikipedia写错了。

==========================================================

虽然Vita没有使用统一内存架构,但是几乎可以达到差不多的效果。

这是作何解?

通俗的说,Xbox 360/WiiU/PS4/Xbox One的统一内存架构,就好比你每天有七个苹果。可以早上吃三个,晚上吃四个;也可以早上吃四个,晚上吃三个。是否朝三暮四,皆可自由划拨。

而其余的主机是非统一内存架构,就规定你早上最多能吃三个苹果,晚上最多能吃四个苹果。如果早上吃不下,苹果就会被扔掉,晚上还是四个。

Vita是非统一内存架构,但是又不是典型的非统一内存架构。

打个比方,如果你早上吃不下,剩了一个苹果,你可以把它换成橘子,晚上就多了一个橘子可以吃了。

这个苹果换橘子的方法,就是通过使用不同的Cache协议来达成的。

所谓Cache协议,就是指定处理器和缓存之间的合作方式。它们可以密切合作,也可以相互忽略。

有的Cache协议对CPU友好,有的Cache协议对GPU友好。同一个Cache协议,两个处理器访问起来的速度是大不相同的。

(顺便一提,Cache协议是统一内存架构存在的基础。即便自由划拨,在申请内存的时候,也必须讲清楚,这块内存是对CPU友好呢,还是对GPU友好?)

如果Vita游戏的纹理很大,128MB显存放不下,其实是可以往内存放的。只要指定特定的Cache协议,对性能的损失就会很小了。

所以在内存管理方面,Vita还是比PS3要灵活一点。

==========================================================

既然说到了内存,我再聊一聊游戏容量的问题。

其实游戏的容量有限制,确实是会影响游戏的关卡数量啦,有无语音啦,过场动画多不多等等。其它方面倒是不太会被影响到。

最起码,游戏采用的技术和硬件优化是一定不受影响的。

接下来,建模和纹理的质量通常是受显存的制约,并不太会被4GB的游戏容量所限制。4GB其实很大的,而纹理怎么压缩也是硬件优化的一部分。

说直白一点,游戏的容量和游戏的画质基本没关系。

==========================================================

Q: 每次系统更新都会拿忍龙2说事…
话说能简单说说忍龙2偷懒在哪导致卡得蛋疼么….

A: 我360和ps3版玩的很多,v版至今未拆,但是技术方面了解一些,虽然我不记得是怎么了解的。。。

首先,这游戏其实很吃CPU,要不然ps3版也不会降同屏人数了。V版优化的不好肯定应付不来。

其次,V版的动态分辨率很动态,没人时是408p,人一多基本都是368p了。说明gpu这边也很吃力。

最后,放UT会严重掉帧,这说明粒子方面也不行,带宽也吃力啊。

各方面都很吃力的赶脚。

单纯升级系统是不会改变游戏运行方式的,如果改变了那就危险了!因为游戏是在旧环境下测试的,没有人愿意对游戏运行环境做任何改变。

sdk的升级可能会包含性能提升,但想要使用这些性能提升,必须对游戏做最低限度的编译打包,通过升级补丁的方式放出下载。

忍龙2至今有补丁升级过吗?如果没有的话,就不可能有变化了。

今天就到这里~还有一些问题我们明天讨论~

结语

我们最后来聊聊一个非常难聊的话题:

手游的问题出在哪里?

我之前在技术层面上讲了不少利弊,包括:

手游没法针对固定平台优化。
苹果的移动设备就那固定几个,架构接近,可以缓解这个问题。
手机平台的api不如主机高效,但是在努力赶上。

等等。

今天我要从不同的角度来聊这个问题。

话说国父**,十一次起义,十次失败,如此折腾为哪般?为了建立一个更合理的制度。

这个制度不是文明开化的自我陶醉,而是有实际的用途,有四项记载于《上李鸿章书》:

人能尽其才,地能尽其利,物能尽其用,货能畅其流。

这四项都是对国家和人民有切实的好处,所以是国家需要的,人民欢迎的。

我之前一直说手游的冰山之尖,我自己是这么理解的,也是四项:

人不能尽其才。世界上最好的计算机科学家已经在SCE发挥了巨大的作用;但是对于手游,他们却是无用武之地的。

地不能尽其利。举例说,我国丰富的文化资源同样是无用武之地,反倒是不如洋游戏挖掘的多,挖掘的仔细。几年前欧洲人在PS3上做了一个狄仁杰的侦探游戏,十分精彩,试问国内有哪家手游愿意去潜心研究中国近代侦探小说的?

物不能尽其用。手游挖掘硬件机能的水准,是远远落后的。

货不能畅其流。国父的“货畅其流”说的是商业,我国手游的繁荣恰恰是以不成熟的市场为依托。手游市场过热,资本和货币无法流向更高水平的游戏,扭曲的市场,就是所谓的“货不能畅其流”。

现在的资本可能都流向手游,但是最好的人才是不会流向它的,毕竟这四个原因很好懂。

===============================================================

我原本的打算,是想把PS Vita专题写成短篇。

所谓短篇就是三天甩手,最多混到国庆结束。你们放假,我可是要上班的,不眠不休的能撑几天呢?

可最后竟还是写到了这种篇幅。

说实话,我的文气很不充沛。但这次我能写到根本停不下来的程度,都是因为版友高质量的留言回复。

文章的思路不是我来定,而是大家一起定。只要思路一打开,还愁没得写吗?

这个专题今天就收尾了,但是它还没有结束。留言讨论可以一直继续下去,对于有意义的讨论,我也一定会整理到正文中。

谢谢大家!

转载请注明:No.77 疯人院 - 游戏业界新闻 - 主机游戏资料攻略 » 【业界】开发者和你谈——PS Vita专题

发表我的评论
取消评论
3+3 (必填)

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址