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

永恒的遗失古都-亚特兰蒂斯

一个游戏开发者的个人博客。

 
 
 

日志

 
 

理解OpenGL ES : 多线程渲染  

2015-11-18 16:06:01|  分类: 图形渲染 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

随着移动设备上的CPUGPU都变的更加强大,分辨率越来越高,我们对图形驱动程序的复杂需求也日益增加。接下来,我们讨论一下在移动设备上的多线程渲染,期待这些技术在你的App中有所应用。

什么是多线程渲染?

         传统开发中,OpenGL ES的应用程序只能从一个线程渲染到一个surface。然而,由于3D渲染引擎的复杂度增加了,图形API操作的CPU开销已经逐渐成为了瓶颈 – 尤其是在加载资源的时候,这就使得我们需要进行多线程渲染。

         一个图形context上下文在一个CPU线程中进行渲染处理,这就是一个渲染线程。在默认缺省情况下,每个图形context不允许访问另外一个图形context的资源(包括纹理,shader和顶点缓冲)。因为这个原因,我们建议后台加载线程共享主线程的context。这样进行渲染,有两个好处:

         1:主线程不会被block卡住。

因为调用数据上传类型的图形API时,API被有阻塞,它会等待应用程序和驱动内存之间的数据传输完成。另外,很多图形驱动都会在shader编译时产生阻塞。这些阻塞将导致GPU处于饿死状态。如果我们将所有数据上传操作和shader编译操作放置在后台线程,那么主渲染线程将可以保持很稳定的帧率。

         2:多核CPU可以更有效的并行工作。

在多CPU的处理器上,将任务分割为多个渲染线程可以充分利用多个CPU内核。这样可以比在单渲染线程中处理更快。

什么时候我们该使用多线程渲染?

理解OpenGL ES : 多线程渲染 - 自由骑士笃志 - 永恒的遗失古都-亚特兰蒂斯

 

         多线程渲染最适合那些进行shader编译以及提交数据到图形驱动block住的程序,它们都受到了CPU限制。此时进行多线程渲染可以更好的分配驱动程序工作,同时可以保证App程序保持稳定的帧率。

         在上面的简单示例中,从Level1Level2需要大量纹理,VBO以及shader需要上传。假设我们不允许使用loading过渡,必须Level1Level2之间做无缝过渡,那么我们将不得不在Level1渲染的同时,将新资源上传给图形驱动。

         在开始我们未优化情况下,调用图形API的每一帧间隔时间是不稳定的,因为上传数据/编译数据有大量开销。如果我们开启垂直同步,我们会发现游戏帧率很低,非常卡顿。

         在优化了之后,一个辅助线程用于在后台进行资源提交和编译,而主线程依然进行正常的帧更新,我们将得到一个很平稳的帧率。

 

         为获得最佳的性能,应该在程序启动时创建辅助渲染线程。主线程用来处理全部的帧渲染,而辅助渲染线程(两者拥有共享的context)只用于shader编译和缓冲区的数据上传。后台辅助渲染线程应当保持在最低限度(例如,一个CPU核心一个渲染线程)。创建渲染线程过多的话,会导致代码难以维护和调试。

        

         尽可能少调用 eglMakeCurrent() ,因为EGL规定,在context绑定到一个新线程之前,必须刷新全部未完成的操作。该API开销很高。

什么时候我们不该用多线程渲染?

当你没有受到CPU限制或者加载时间不是问题时,不需要使用多线程渲染。

         如果你的CPU没有受到显卡驱动的限制,你应该避免多线程渲染。它会增加你的渲染引擎的负责度,如果实现的不好,甚至可能会降低性能。

当你试图简化渲染引擎时,不需要使用多线程渲染。

         最糟糕的情况是你经常在不同线程中绑定一个图形context(使用eglMakeCurrent()

         1Context绑定有代价。如上文所述,调用eglMakeCurrent()将强制驱动程序踢掉所有未完成的操作。

         2API调用序列化。一个图形context只能实时被绑到一个CPU线程中,所有的API调用将被顺序提交。

所以API调用和单渲染线程耗时是一样的(因为API调用提交是串行的),而进行context又有额外开销,这意味着仅在API调用开销部分,单线程调用更好。

而且,多渲染将使代码更加混乱复杂,难以理解,而且更加难以调试。

 

多线程渲染调试工具推荐

         PowerVR Graphics 3.2 SDK中,PVRTrace( OpenGL ES的采集分析工具 )可以支持这种复杂的图形驱动程序。支持每个线程中的渲染状态检查,每个线程中的Call调用查看,帧状态,以及每单个线程的时间使用图。所有这些功能,都会使你的多线程OpenGL ES项目更加容易调试。另外在PVRVFrameOpenGL ES模拟器的多线程支持也得到了显著改善,推荐使用。

 

结论

         多渲染线程需要创建复杂的,难以调试的引擎,很容易带来一些麻烦。但是它也提供强大的灵活性。


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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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