注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Crayon

只想做自己

 
 
 

日志

 
 
 
 

iOS Metal图形API  

2015-02-27 20:57:19|  分类: 开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
iOS Metal图形API - Crayon - Crayon

iOS8上的图形处理功能迎来了激动人心的时刻!

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

我们将很快支持Metal,在这之前,我们想带你深入了解这门新技术以及Metal技术为何如此重要。

初识Metal

iOS Metal图形API - Crayon - Crayon

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

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

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

·更多的通用多线程技术

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

·所有的iOS设备上,CPUGPU是共享内存的

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

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

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

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

这一点明确体现在MetalAPI中,尤其是在渲染目标上。所以与缓冲区相关的操作如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(新的着色器)

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

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

虽然目前在Unity中还没有大量地使用Compute Shader,但我们正在尝试将它用在越来越多的地方,值得期待!


常见问题

什么时候能使用到Metal

我们已经迫不及待想要发布它,但是目前还无法确定具体的日期。我们已经做了大量的工作,但还有很多方面需要完善。当前的首要计划是,完全整合Metal,以此大幅度提升CPU方面的性能。我们希望在之后的Unity5.0版本中添加对Compute Shader的支持(在我们内部Compute Shader已经某种程度上支持了)


对平台有什么样的要求?

iOS8和含有A7芯片的设备(iPhone 5s, iPadAir, Retina iPad Mini).


我该如何利用好Metal技术中的CPU低开销的优势?

通俗地讲,不需要做任何事情。一旦Unity中支持Metal技术,它的使用将会非常地透明。所有你现有的项目,着色器和图形特效都应该可以一如既往地工作。


因为Metal技术有不同的程序语言,那着色器会不一样吗?

我们会处理这个问题的,当前你用Cg/HLSH书写shaderUnity自动将其转化为GLSL,这一转化对于用户是透明的。对于Metal,我们也会进行相类似的操作。


再问一次,在低CPU开销下,我能做什么?

更好的物理效果,人工智能和复杂的游戏逻辑。在屏幕上显示更多的内容,或者节省更多电量。这一切都取决于你!

  评论这张
 
阅读(968)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017