首页 > 业内新闻 > GPU > GPU在移动多媒体处理的运用之GPU基础概念篇

GPU在移动多媒体处理的运用之GPU基础概念篇

52RD.com 2015年11月5日 电子创新网            参与:4人 我来说两句
  

  苦逼码农GG在移动应用开发中,经常会遇到各种问题:


  1.为什么滑动这么卡

  2.为什么动画这么不流畅

  3.为什么图片处理速度这么慢

  会有很多原因导致上述问题,但有时候不论怎么优化,产品性能一直达不到满意的程度,问题其实就出在一个关键技术的选型上:你用GPU还是CPU。

  GPU到底是什么东西,有什么特性,能够帮助我们做好哪些相关的优化,其实是一个比较深的课题。

  这里就从GPU和opengl的一些基本概念开始,逐步深入,让开发和测试同学对于GPU和opengl有一个初始的认识。并一步一步通过案例和框架,帮助开发同学快速理解和运用好GPU。

  先说说GPU的历史,其实民用显卡可以追溯到上世纪的80年代,但当时的并没有GPU的概念,而所谓的显卡更多的被成为显示适配器(Display Adapter),仅能用于简单的文字和图形输出,在处理3D图像和特效是主要还是依赖CPU。

  真正的GPU,也就是Graphic Processing Unit(图形处理器)的概念,GPU的出现使得显卡减少了对CPU的依赖,尤其是在3D图形处理时取代了部分原本CPU的工作,而这一切都要归功于GPU引入的硬件T&L( Transform & lighting,坐标转换和光源)功能。

  本质上来说,3D图形的渲染是由复杂的坐标转换和光源运算组成的,当显卡还没有T&L功能时,坐标处理和光源运算都是由CPU来处理的,也就是所谓的软件T&L。不过由于CPU的任务繁多,除了T&L之外,还要做内存管理、输入响应等非3D图形处理工作,因此在实际运算的时候性能会大打折扣,常常出现显卡等待CPU数据的情况,其运算速度远跟不上复杂3D游戏的要求。

  看到这里,开发同学往往会想,GPU是来帮助做3D游戏和相关应用的,如果不开发3D应用,就没有必要用GPU了吧。 这其实是一个非常大的误区。 我们来看看GPU有些什么特点吧:

  1.核心特别多

  CPU 由专为顺序串行处理而优化的几个核心组成。而GPU 则由数以千计的更小、更高效的核心组成,这些核心专为同时处理多任务而设计。

图一:GPU和CPU在并行核数上的比较


  非常有趣,很形象,大家可以看看,这样就能理解为什么在绘制方面,GPU会比CPU快了。想想那些3D的场景,大量的纹理和顶点能够被同时绘制,多么爽的事情。

  另外CPU切换线程的代价是数百个时钟周期,而GPU每个核心可以同时处理多达1024个线程,线程切换的时钟周期是0。

  2. 包含SIMD结构的指令集。

  不管是老一代的GPU,还是现在的,都需要能够快速的处理矢量,比如四通道的像素数据RGBA

图二:各种Shader处理的矢量数据


  其实就是SIMD指令结构:

图三:大致的单指令多数据的指令结构


  知道GPU这两个天然特性后,很多决策就好办了。回到文章最初的问题:

  1.为什么滑动这么卡

  很有可能是CPU的绘制层次太多,CPU UI线程和其他线程抢占CPU资源。UI线程和其他线程抢资源是安卓的老难题。这种情况除了优化绘制层次,还有一个更好的方案,实现GPU自绘。 安卓最典型的两款软件魅拍和快图,在滑动时的流畅感远远超出其他图片显示的产品,就是因为直接在GPU上实现图片的绘制,减少CPU的指令数。

  CPU各种view的绘制,各种优化,各种精简layout,最后可能还是不够快。绕开吧,用opengl实现,后续会详细说明如何用opengl绘制照片墙。从选型上直接规避这些卡顿。手机管家的子产品相册管家,经过2个月的重构,利用的GPU实现自绘,照片墙滑动的性能得到了明显的提升。

  其实自绘这个事情,安卓4.0已经通过opengl的api,给我们一个不错的封装,比如GLCanvas,GLView,GLPaint等等。架构设计类似传统的View和Canvas。同学们要做的事情就是利用这些GLCanvas,GLView去实现绘制,在SurfaceTexture的绘制回调函数OnFrameDrawnListener里实现一帧一帧的绘制。

  2.为什么动画这么不流畅

  为什么不试试用GPU实现动画(后续会介绍如何实现)

  3.为什么图片美化处理速度这么慢

  答案还是在GPU。不过这个地方还是要慎重,不是一根筋的用GPU就好使。有不少场景还是CPU快,这个和CPU与GPU之间的硬件连接方式有关系,除了要考虑照片尺寸。

  在做离屏渲染的时候一定要小心:没有DMA的方式,glReadPixels 将480*480的图像数据拷贝回CPU,需要70ms(Galaxy NS) 。这种情况下,如果CPU处理,比如图像合并只需要几个毫秒,就没有必要用GPU了,数据搬移反而增加开销。

  即便是CPU拷贝,类似如下的安卓java代码:

  ByteBuffer buffer = ByteBuffer.allocate(480*480*4);

  long lastTime = System.currentTimeMillis();

  Bitmap bitmap = WaterCreateBmp.createWaterMark(mContext, mWater);

  Canvas canvas = new Canvas(myBitmap2);

  canvas.drawBitmap(bitmap, new Matrix(), null); canvas.save(); myBitmap2.copyPixelsToBuffer(buffer);

  480*480的图片拷贝,也就是1-2毫秒,非常快,完胜GPU搬运数据到CPU的时间开销

图四:没有PBO的传统GPU和CPU在纹理读取上的路径,CPU很辛苦,做搬运工,效率不一定高。


图五:有DMA支援的结构,就不用担心glReadPixels太慢


  另外一个需要特别注意的事情是要减少CPU与GPU的交互次数,差的总线方式会坑掉你。

  再有就是GPU实现上要避免分支,才能更加充分的发挥GPU的作用,否则很容易大炮打蚊子。

图六:两种颜色的区域,可以用两个不同的shader实现,避免分支逻辑

52RD.com  微博关注:http://weibo.com/52rd  微信关注:admin_52RD
已有0位网友发表了看法 我来说两句
读取...
相关报道
评 论
业界快讯 NewsMORE>
新闻导航 Navigation
精彩评论 CommentMORE>
aquasnake:入股mtk,想的太好了,这样对冲投资,展讯做的好展讯这边上市,mtk做的好mtk这边分红.上层酒桌上谈笑风生分钱,底下苦逼门却在内斗,为了争夺有…
紫光合并联发科的三个挑战
52RD网友:疑问!!!! 魅蓝metal这次使用的CPU- Helio X10是不是那个销售1799元 被红米Note 799元腰斩之后的MX5库存CPU???
魅蓝metal正式发布 1099元起配指纹识别
52RD网友:他进一步分析,钱进台湾,才可以把人才留在台湾、让产业继续留在台湾发展;进入董事会则是掌握公司经营资讯,并不会涉及研发技术,这样就…
紫光合并联发科的三个挑战
52RD网友:国产手机都是这么高的配置,这么低的价格,这些元器件的参数确实很高,但是质量能保证吗? 为什么全国人民都在生产那种参数吊爆、用得几…
疑似联想新机Vibe X3 Lite亮相工信部
52RD网友:不把重点放在做好产品上,而是SB的认为什么供应链、什么成本、什么渠道才是制胜的关键, 再看看你们笔记本,做的一坨屎,连高端Thinkpad…
错过发展良机 联想手机难以复制PC神话
特别推荐 Recommend