专栏首页FishMALI Tile-based rendering简单原理介绍

MALI Tile-based rendering简单原理介绍

写在最前

关于mali的架构的一点深入了解,将现有的GPU的基本流程和mali的做对比,提出其中的优点与缺点。

传统GPU

传统GPU的架构一般被称为Immediate mode GPU.主要的流程就是vertex shader 和 fragment shader顺序执行,伪代码如下:

for draw in renderPass:
    for primitive in draw:
        for vertex in primitive:
            execute_vertex_shader(vertex)
        for fragment in primitive:
            execute_fragment_shader(fragment)

数据流是这样的:

优点

主要优点就是vertex的输出能够留在片上,可以被下一阶段直接快速读取。

缺点

如果有很大的图形(主要是三角形)需要被渲染,那framebuffer就会很大,比如对于整个屏幕的颜色渲染或者深度渲染就会消耗很多存储资源,但是片上是没有这么多资源的,因此就要频繁读取DDR。很多和当前frame有关的操作( 比如blending, depth testing 或者 stencil testing)都需要读取这个working set,因此需要的带宽是很大的,并且这样能耗也很高,对于移动设备来说,这种方式很不利于设备运行。

Tile-based GPU

因此mali的GPU提出了Tile-based概念,就是将图像分成16*16的小块。分小块进行渲染,最后写入到DDR,就能够减少读写DDR的频率,进而解决上述问题。不过分块需要知道整个图像的几何学信息,所以操作分成了两步:

  1. 第一步执行几何学相关的操作,并产生tile list.
  2. 第二步对每一个tile执行fragment操作,完成之后写入内存

伪代码如下:

# Pass one
for draw in renderPass:
    for primitive in draw:
        for vertex in primitive:
            execute_vertex_shader(vertex)
        append_tile_list(primitive)

# Pass two
for tile in renderPass:
    for primitive in tile:
        for fragment in primitive:
            execute_fragment_shader(fragment)

数据流如下:

优点

显而易见,解决了传统模型的带宽问题,因为fragment shader每次都是读取一个小块放在片上,不需要频繁读取内存,直到最后操作完成,再写入内存。甚至还能够通过压缩tile的方法进一步减少对于内存的读写。另外在图像有一些区域固定不动的时候,通过调用函数判断tile是否相同,减少重复的渲染。

缺点

这个操作需要在vertex阶段之后,将输出的几何数据写入到DDR,然后才被fragment shader读取。这之间也就是tile写入DDR的开销和fragment shader渲染读取DDR开销的平衡。另外还有一些操作(比如tessellation)也不适用于Tile-based GPU。

总结

现在屏显的分辨率越来越大从1080p到1440p再到4K,可以遇见的,mali这种架构将在未来大规模使用。

不过也有一些陷阱,开发者需要避开。首先是要合理设置render pass以充分利用这种架构的特点;其次要了解这种几何学分割所能得到的好处。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Flutter基础篇(8)-- Flutter for Web详细介绍

    Flutter for Web官方的Github库地址:https://github.com/flutter/flutter_web ,此存储库包含面向Web ...

    AWeiLoveAndroid
  • [译] 将通用安卓音乐播放器转化为 instant 应用

    从 Android Studio 的 3.3 版本开始,IDE 将会为 instant 应用提供工具支持。(撰写至本文时,Android Studio 3.3 ...

    Android 开发者
  • 当年的Windows 手机系统,为何不如安卓系统受欢迎?

    微软作为PC端的绝对霸主一直想在移动端开辟属于自己的战场,中间做了很多次的尝试都以失败而告终,最后孤注一掷拿下诺基亚结果windows手机还是处于不温不火的状态...

    程序员互动联盟
  • 薅羊毛 | 让Python每天帮你薅一个早餐钱

    以今日头条极速版为首,包含趣头条、东方头条、全名小视频在内的 App 都有看新闻、视频送金币的活动,当金币达到一定量后,就可以提现到微信、支付包。

    sergiojune
  • 2019谷歌I/O大会:两款全新Pixel,Android Q出炉,让AI无处不在

    一年一度的谷歌I/O大会终于到来,这场科技盛会吸引了全球各地的开发者和用户,这次,整个大会都围绕着各种AI技术,可以说谷歌越来越离不开AI了。

    AiTechYun
  • Android技术选型闲聊

    技术好只能保证做出来的App不烂,品味好了才能将有限的技术发挥到极致,将所做App提升一个档次。

    冰之角
  • Android Jetpack系列——Android Jetpack介绍

    早在2008年,Google 推出了Android ,但那个时候 Android 刚刚问世,经过这将近11年的发展和不断优化,Android 可以说逐渐变...

    Demo_Yang
  • 携程、阿里、京东、腾讯iOS春招面试过程以及面试题总结!

    五一假期,春招基本上已经结束了,剩下少量面试和少量流程中。虽然还没有最终决定,不过也还是决定来开个帖子,写一些总结。

    iOSSir
  • Android人脸识别,你也会做

    Android人脸识别APP事例,大家可以参考一下。注意这不是一下特别完整的项目,只有安卓端程序,缺少后台的程序。但大家也可以学习下吧。举一反三

    程序源代码
  • 使用appium过程中遇到的问题

    版权声明:如需转载本文章,请保留出处! https://blog.csdn.net/xc_zhou/article/details/89888523 ...

    周小董

扫码关注云+社区

领取腾讯云代金券