末落无声吧 关注:217贴子:4,996
  • 10回复贴,共1

转贴:关于移动GPU,总结下_高通吧

只看楼主收藏回复

技术的炮炮

关于移动GPU,总结下_高通吧_百度贴吧

转自:http://tieba.baidu.com/p/2051609744#0-tieba-1-63017-7eff13ea8df1a334a227e1223f8d0dd3



IP属地:河南1楼2013-01-01 13:08回复
    前言:
    现在移动设备的核战越来越激烈,已经从CPU引发到了GPU上,于是“16“8管线“MP4”“三角形生成率”“填充率各种吸引眼球的宣传铺天盖地而来。一直很希望能有些文章来介绍科普下,但或许是专业人士都觉得这些太基础,最后忍不住,只能由我这个半桶水的非专业人士来写点啥了。本文参考和引用了网上的一些资料,篇幅有限恕不一一列举。内容尽可能的科普浅显,但限于个人的知识层次、理解能力和表达能力,如果有不确切或者错误的地方,还请多多指正。
    基本的3D流水线
    首先我们来简单的介绍下3D的画面是如何生成的,一个基本的3D流水线如下图所示:

    首先,运行在CPU上游戏引擎根据游戏中的一些参数,产生一系列的图元,将它们的顶点数据发送给GPU
    第二步,顶点处理器(Vertex
    Processor
    )对顶点数据进行一系列的变换和光照处理。简单的想想,游戏中的各个物体的坐标都是参照游戏中的世界坐标系的,而实际显示的画面是玩家视角或者摄像机视角,这中间就有许多坐标系的转换。这些活就需要顶点处理器来做,最终我们得到了我们所需要视角的画面。
    但是,到这一步,画面还只是一些多边形,而实际显示在屏幕上的是一个个像素,这里就需要Rasterizer进行光栅化(Rasterization3),从而将画面变成一个像素图。
    第四步,对这些像素进行上色,Fragment
    Processor
    中的像素着色器(Pixel Shader)按照程序规定的算法,计算出画面中每个像素的颜色,之后第五步就是把结果输出到内存中,全部完成后拿去显示。当然在这整个过程中,还跟纹理贴图6有关系。所谓贴图就是把纹理(一个二维的静态图片)按照一定的算法给贴到游戏里的三角形表面上去。



    IP属地:河南本楼含有高级字体2楼2013-01-01 13:09
    回复
      参数,究竟靠谱吗?
      终端厂商在宣传他们手机芯片的GPU如何强劲时,往往会提到一些参数,最常见的就是三角形生成率和填充率。但实际上,不同公司的GPU,他们的这些理论参数,并不具有直接的可比性。我们也可以发现,有些GPU可能给出的理论参数很高,但实际表现却很一般,甚至不如一些参数低的GPU。这是因为,各个GPU的供应商,比如IMGtecPowerVR SGX),高通(Adreno),VivanteGC系列),ARMMali),nVIDIAGeForce),他们给出这些理论数据的测试方式,可能不太一样。

      比如三角形生成率,本身就受到很多测试因素的影响。例如,有些三角形在一开始就会被剔除掉(比如在屏幕外,或者太小了根本覆盖不到一个像素),不会被显示也不会需要执行太多的运算,那么这部分三角形到底应该算吗?如果算进去的话,三角形生成率自然就高了。或者,测试程序把一些已经计算好的坐标提交给GPU,那么GPUVertex Shader就不需要进行复杂的计算,数值自然就高了。再或者,并非生成一个三角形就一定需要处理三个顶点。如果有三角形共享顶点,用indexed的办法绘制,顶点的数目就可以减少。就像下图,2个三角形只需要处理4个顶点。如果测试的时候大量使用这种方式,也可以提高三角形生成率的数值。


      IP属地:河南本楼含有高级字体3楼2013-01-01 13:09
      回复
        同样,填充率反映了GPU的像素输出能力。但是厂家给出的理论值,很多都是没有贴图,没有Shader计算,仅仅是生成无色点的能力,跟实际使用的情况有较大的差距。又比如Imagination Technologies PowerVR SGX系列给出的填充率,并不是实际值,而是实际值乘以了一个2.5x的系数。这是由于PVR GPU架构的特殊性,可以剔除画面中被遮蔽的部分,不作渲染,减少了无用功。200MHzSGX540,原生的填充率是400M,而由于这种技术的存在,IMG认为其等效填充率相当于1000M。在实际的场景中,如果遮蔽的部分较多,这个系数可能远超过2.5x。当然,如果场景中遮蔽较少,这个系数相应的也会变小。
        事实上三角形生成率和像素填充率作为衡量GPU性能的参数,在PC平台上,几年前就已经被淘汰了。由于从DX8开始,现代GPU都已经由可编程的Shader来代替固定功能的单元实现各种特效,所以Shader的计算能力成为很重要的一点,在移动平台也是一样的。


        IP属地:河南4楼2013-01-01 13:09
        回复
          因此,移动平台的GPU相对于PC平台,也会有一些不同。我们回过头来看一下移动平台的GPU的一些架构。
          首先是传统的IMRImmediate Mode Rendering)架构

          目前几乎左右的桌面GPUnVIDIAAMD)都是IMR架构,在移动领域,nVIDIAGeForce ULPVivanteGC系列GPU都是属于IMR架构。IMR架构的GPU渲染完物体后,都会把结果写到系统内存中的帧缓存里,因此就可能出现GPU花了大量的时间渲染了一个被遮挡的看不见的物体,而最后这些结果在渲染完遮挡物后被覆盖,做了无用功。这个问题称之为Overdraw。虽然现代的IMR架构GPU在一定程度上可以避免这个问题,但要求应用程序将场景里的三角形按照严格的从前往后的顺序提交给GPU,要完全避免Overdraw还是很困难的。
          另一方面,由于IMR架构的GPU频繁的读写和修改帧缓存,因此对带宽的要求比较高,同时也增加了电力的消耗。
          所以,大部分的移动GPU都采用TBRTile Based Rendering)的架构


          IP属地:河南6楼2013-01-01 13:09
          回复
            在移动平台的OpenGL ES里,可以指定高、中、低三种不同的精度。对不同的GPU来说,高、中、低精度的实际值略有差别。如下图所示:

            对于AdrenoGC系列,无论何种选择何种精度,都会按照FP32精度进行计算。而Mali-400TegraULP GeForcePixel Shader部分不支持高精度,最高只支持中等的FP16精度。绝大部分游戏的Pixel Shader计算都采用中等(FP16)的精度,而Vertex Shader的计算一般是FP32的精度。
            其次,关于统一渲染架构(Unified Shader)和分离的渲染架构(Discrete
            Shader
            )。前者的Shader既能进行Vertex的计算,也能进行Pixel的计算,例如PowerVRAdrenoGC系列。后者的Vertex ShaderPixel Shader是分开的,典型的比如Mali-400ULP GeForce。相对来说,统一渲染架构的Shader利用率会高些,在遇到三角形特别多像素特别少,或者相反的情况下,Shader的计算能力不容易被浪费。


            IP属地:河南8楼2013-01-01 13:10
            回复
              GPU“兼容性”
              现在还有个经常被提到的是GPU的“兼容性”问题,这里就要涉及到各个GPU支持的纹理格式了。
              首先是ETC1,这个是OPENGL ES 2.0支持的纹理格式,大家都得支持。但这个纹理的一个缺点是不支持alpha通道,所以对于有alpha通道的纹理,就要拆成2个纹理去读取,效率低,浪费了带宽。
              PVRTCPowerVR自家的纹理格式,同样ATITC是高通Adreno的纹理格式,此外S3TC就是桌面很常见的DXT,微软DirectX 3D的纹理格式,这些都是支持alpha通道的。
              PowerVR GPU支持自家的PVRTC和通用的ETC1iOS下的PVR GPU只支持PVRTC),Adreno支持自家的ATITC和通用的ETC1NVGeForceVivanteGC系列支持DXTETC1,剩下Mali-400只支持ETC1。所以,对应不同的GPU,会有不同的游戏数据包。通用数据包,一般都会采用ETC1,虽然通用,但由于不支持alpha通道要贴图2次,对于非MaliGPU其实都算是吃亏了。如果用自己支持的其他格式,就不用受这个苦了。对于贴图单元(TMUTexture Mapping Unit)数目相对较少的Adreno 2xx系列,恐怕更是吃亏。
              当然,纹理的支持度只是兼容性的一方面,并不是兼容性问题的全部。


              IP属地:河南本楼含有高级字体9楼2013-01-01 13:10
              回复


                IP属地:河南10楼2013-01-01 13:10
                回复
                  各家的多核
                  GPU硬件的部分基本说完了,这里总结一个表格,同时给出了GPU厂商官方定义的一个的内容,谁的核里料多,谁比较不厚道,应该也是一目了然了吧。面对各种“16”“8管线的宣传,大家也应该能比较清楚的辨别了吧。


                  IP属地:河南本楼含有高级字体11楼2013-01-01 13:11
                  回复
                    跑分跟实际表现不一样?优化很重要!
                    最后,规格只是GPU的一个方面,实际表现跟架构也有很大的关系。更进一步的,就算是Benchmark中跑分差不多的GPU,在不同的游戏中,实际表现也会有差别。
                    首先,Benchmark程序,大部分都是公平的,所以本质上,Benchmark都是“零优化”程序,公平起见,他们的纹理会用RGBAPNGTGA,或者ETC1纹理,不会用到各个GPU自家的格式。
                    但是游戏不一样,游戏可以做相应的优化。例如PVRGPU,可以用4bpp甚至2bppPVRTC纹理,相比于未压缩的贴图就可以节省8倍甚至16倍的带宽。而没有被优化到的情况下,可能只能跟着Mali用不支持alpha通道的ETC1,做2次贴图,浪费带宽。部分厂商甚至在通用数据包里放了一些未压缩贴图,那差距就更大了。同款游戏,跑分接近的GPUiOS上的特效更好,流畅度更佳,就有优化的原因。
                    其次,Benchmark在一定程度上都是相对超前的。大部分GPUBenchmark的帧率,都不会到流畅的级别(要是满帧了还怎么测出区别)。早期的Benchmark可能更加侧重贴图和像素部分。新一代的Benchmark则提升了场景复杂度,对多边形和Shader计算的压力进一步增大,例如GLBenchmark 2.12.5的提升。因此,一些三角形生成能力和原生Shader计算能力高的GPU,比如Adreno 220/225,得分提升就会比较明显。


                    IP属地:河南本楼含有高级字体12楼2013-01-01 13:11
                    回复
                      Mali-400则在2.5中遇到三角形生成的瓶颈,得分表现不如之前。
                      而游戏是给人玩的,终端厂商或是SOC厂商可以跟游戏厂商合作,针对GPU的特点进行相应的优化。不同GPU侧重很不一样,比如Mali-400,三角形很弱,像素部分,填充率强。高通Adreno 2xxVivanteGPU,多边形很强,Shader计算强,但填充率较弱。如果场景对Mali优化,游戏商可以减少画面中多边形的量,用贴图和像素部分实现更多的特效。这样对Adreno 2xx系列不利。如果对Adreno优化,则可以增加场景复杂度,用更多的三角形进行更精细的建模,但这样对Mali则不利。这只是一方面,在一些细节上,还可以进行更深层次的优化,各家的GPU也都会提供相应的工具。

                      最后,GPU的跑分在一定程度上能反映GPU的实际性能,但最终在游戏中的表现还是很看厂商优化的。所以也不要一味的盯着跑分,多问问玩过的朋友,多看看实测,会更有帮助。


                      IP属地:河南13楼2013-01-01 13:11
                      回复