IOS 8 Metal 技术总结

     在WWDC(全球开发者大会)上,苹果发布了Metal技术。它是一款全新的图形API,具有低开销、高效率,并针对A7芯片进行了特殊的设计。基于Metal技术,游戏开发者能充分利用iOS硬件的优点,开发的游戏将更加真实、更多细节、交互性也更强。

Metal技术之所以能实现低消耗、更多的性能可预见性和更好的可编程性,是因为Metal中含有如下的关键思想:

  •   尽可能多地创建和验证前期状态

  着色器可以在离线状态下编译和部分优化。所有与渲染管线状态相关的操作都可以先于渲染甚至是开始时被创建和验证,如:着色器,顶点布局,混合模型,渲染目标格式等。这就意味着在每一个drawcall中只需要更少的状态监测,从而节省了大量的CPU。

  •   更多的通用多线程技术

  可以在任何线程中创建资源,并提供了好几种方法在多线程中并行地准备drawcall的提交。

  •   所有的iOS设备上,CPU和GPU是共享内存的

  这就不需要将数据从CPU(内存)中拷贝到GPU(显存)中(这是一个很耗时的操作),只需要修改指针的指向,因为GPU和CPU的内存是共享的。

  •   让用户(引擎)处理同步

  OpenGL ES不得不通过大量的循环操作,来处理各种各样的场景(事实上,对于很多具体的场景,是没有必要的)。在Metal技术中,用户自己负责GPU和CPU中数据同步,这样引擎就可以省去大量的没必要的操作。

  ·iOS设备上的GPU都是基于Tile-BasedDeferred Rendering架构

  这一点明确体现在Metal的API中,尤其是在渲染目标上。所以与缓冲区相关的操作如tile的加载与存储,反锯齿等都已明确地完成了,即API不在需要多余操作。

  以上几点都意味着CPU开销的大幅降低以及性能可预见性的大幅提高

为图形和着色器引进了新的基于C/C++之上的语言。这就意味着iOS可以进行着色器操作,原子操作,以及任意的缓冲区写入操作等。

  在这全新的设计中,MetalAPI非常精简。它还有一个超级有用的可选“调试层”,可以做很多额外的工作,并通知你编程中的所有错误。

  关于Draw Call

  如果你在制作游戏,尤其是手机游戏,你对draw call问题也许会很在意。每一个被绘制的物体都会有CPU开销,对于当下的手机,不能绘制过多物体(大于上百个)。显然,在游戏中,游戏运行逻辑,物理计算,人工智能运算,动画等等都会消耗CPU。所以unity自身采取了一些办法来最小化draw call的数量,如静态&动态批处理,遮挡剔除,采用纹理集来减少材质的数量等。

  为什么渲染物体时会有CPU开销,毕竟渲染物体是GPU做的事情。

  这其中,部分开销来自于“引擎”方面,CPU需要迭代地确定可见物体,指出哪一个着色器的pass需要被渲染,哪一个光源照亮哪一个物体,指定哪一个材质参数等。其中有一些开销是缓存操作的,有一些开销是多线程操作,一般来说都是与平台无关的代码。每一次Unity的发布,我们都在尝试优化这一部分,通常情况下Metal不会对这一部分有任何影响。

  CPU开销的另一方面在“图形API和驱动”。对于不同的游戏,这一部分开销可能会很大。Metal尝试着通过更好地匹配硬件,来减少OpenGLES中的大量多余的操作,进而来去掉这部分开销。预先渲染状态的创建&验证;渲染目标加载&存储的显式操作;API方面无同步操作——这三个操作都有助于降低CPU的开销。

  根据我们目前的测试,API+driver的开销降低到只占CPU时间的几个百分点升甚至更少。和之前的15%-40%比起来,则是相当显着的提高。这就意味着大量的CPU资源可以用在我们自己的代码上面。

  我们正在尝试让Metal进行多线程绘制,当然对于我们而言,这也是一个非常有意思的优化机会。

  Compute Shader(新的着色器)

  有了Metal,GPU可以在典型的Vertex+Fragment Shader外面进行计算(被称为“Compute Shader”).大致上讲,能在GPU中的许多小型处理器上进行各种类型的“并行计算”。Compute Shader有一个“局部存储器”的概念——CPU上一块执行效率非常高的内存,在并行操作时,用来共享数据。这块特殊的内存使GPU可以更加容易显示一些旧的Vertex和Fragment Shader不易于显示的效果。

  Compute Shader可用来做很多有趣的事情:优化后处理效果,粒子系统,阴影和光线剔除等


相关文档:

  • iOS 8 Metal Swift教程 :开始学习
  • 如何评价 Apple 为 iOS 8 推出的 Metal 图形 API?
  • 解析iOS 8中Metal
  • Metal API初次印象
  • 关于Metal API的几点想法
  • Direct3D, OpenGL, Metal, Full Circle
  • 了解更多(官方文档)

你可能感兴趣的:(IOS8,新特性)