转自:http://www.cnblogs.com/TracePlus/p/4037165.html

因为,每家芯片的特性不同,根据向framebuffer写法的不同,分为tile-based的mobile cpu,如ImgTec PowerVR,ARM Mali,一部分老版本Qualcomm Adreno。还有标准的direct(immediate)的mobile cpu,如Nvida,Intel,Viante,以及一部分Qualcomm芯片(Qualcomm的Adreno.3xx系列后是可以在这两者之间进行切换的)。对tile-based的GPU来说,一旦使用打开alpha test或者其他discard功能的指令,就意味着这个fragment shader上不再只绘制一次像素了。这样会增加额外的性能消耗,所以一般都是建议用不实用alpha test,或者用alpha blend来代替。

 
  tile-based gpu又分为Tiled Deferred(PowerVR)和Tiled(Adreno,Mali),两者都是在tile里进行渲染,而区别是TBR有自己的预处理,可以只着色可见像素。
 
图 1 三种管线。
 
  TBDR,以苹果设备用的ImgTec的PowerVR系列来说,在渲染处理时,会在fragment shading 阶段提供,在每个tile使用Deferred的方法,进行Hidden Surface Removal(HSR)的处理,原理是fs阶段前,对多边形进行预处理,决定它的哪个像素会对最终结果产生贡献,后面就只对这些像素进行着色。这个功能需要对不透明几何体进行排序。也就是说,要进行这种优化,必须要确保一定有能遮挡的像素,然而使用带有discard的shader指令,例如alpha-test,sample mask,alpha-to-coverage等等,会使得一些本来被遮挡的像素对最终结果产生贡献,所以,这个特性可能只能对一部分物体产生作用,从而产生额外的状态切换消费。以及该fragment额外隐藏像素的处理。
  
图2 ImgeTec的渲染处理
 
  除此之外,ImgeTec还有另一个depth-only pass功能,生成深度缓冲,再次进行渲染时,就可以获取每个像素的可见深度,只有可见像素才会进行处理。所以,对于苹果设备来说,在CPU阶段对不透明物体的那种从前向后预处理排序是没有必要的。而是应该根据渲染状态来排序。
图3 ImgTec的渲染提示
  TBR也上有提供类似的HSR方法,也就是early z-cull,使用粗糙,低精度和分辨率的Zbuffer进行depth-test,测试失败的fragment则不传说给rasterization。如果打开alpha test,后果跟TBDR也是类似的。
图4 TBDR的Deferred vs TBR的 Early z
 
图5 Qualcomm的TBR
 
  而IMR上,还是按照传统方法,尽可能的在CPU上进行Cull,以及从前向后进行距离排序,也提高erlay-z的效率。
 
不透明物体,early-z的overdraw测试,只有PowerVR不需要进行预先排序处理。红色是从前向后绘制,蓝色是从后向前绘制
如图,当绘制透明和半透明混合物体时,必须使用discard命令的话,对性能的消耗还是很大的
 
不同芯片上的的推荐绘制顺序
 
OpenGL Insights Performance Tuning for Tile-Based Architectures
Next-Generation AAA Mobile Rendering
FastMobileShaders
High-End Graphics for Smartphones and Tablets: A Development Case Study" CEDEC 2013

(转)mobile cpu上禁用alpha test的相关总结的更多相关文章

  1. mobile cpu上禁用alpha test的相关总结

       因为,每家芯片的特性不同,根据向framebuffer写法的不同,分为tile-based的mobile cpu,如ImgTec PowerVR,ARM Mali,一部分老版本Qualcomm  ...

  2. linux下将不同线程绑定到不同core和cpu上——pthread_setaffinity_np

    =============================================================== linux下的单进程多线程的程序,要实现每个线程平均分配到多核cpu,主 ...

  3. <转>Python 多线程的单cpu与cpu上的多线程的区别

    你对Python 多线程有所了解的话.那么你对python 多线程在单cpu意义上的多线程与多cpu上的多线程有着本质的区别,如果你对Python 多线程的相关知识想有更多的了解,你就可以浏览我们的文 ...

  4. 限制某个进程只能在某个CPU上运行

    首先可以调用GetSystemInfo查看有多少个CPU,再通过调用: BOOL WINAPI SetProcessAffinityMask( __in HANDLE hProcess, __in D ...

  5. 多线程程序在单核cpu与多核cpu上是怎么工作的?

    转自 1.多线程在单核和多核CPU上的执行效率问题的讨论 a1: 多线程在单cpu中其实也是顺序执行的,不过系统可以帮你切换那个执行而已,其实并没有快(反而慢) 多个cpu的话就可以在两个cpu中同时 ...

  6. nginx——绑定 Nginx 进程到不同的 CPU 上

    为什么要绑定 Nginx 进程到不同的 CPU 上 :默认情况下,Nginx 的多个进程有可能跑在某一个 CPU 或 CPU 的某一核上,导致 Nginx 进程使用硬件的资源不均,因此绑定 Nginx ...

  7. [转帖]第二个显示屏上禁用Windows任务栏

    http://os.51cto.com/art/201812/589207.htm 这个过程非常简单,你可以在一分钟内摆脱第二个屏幕上的任务栏. 您需要做的就是按照以下步骤操作: --打开设置,然后转 ...

  8. taskset: 让进程运行在指定的CPU 上

    观察发现4核CPU,只有第1个核心(CPU#0)非常忙,其他都处于idle状态. 不了解Linux是如何调度的,但目前显然有优化的余地.除了处理正常任务,CPU#0还需要处理每秒网卡中断.因此,若能将 ...

  9. 多核CPU上python多线程并行的一个假象

    GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题.运行下面这段 python 程序,CPU 占用率是多少? # 请勿在工作 ...

随机推荐

  1. systemtap 脚本示例

    .[root@localhost ~]# stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}' Pass ...

  2. 恶意软件正在利用SSLserver窃取用户个人信息!

    安全套接层协议(SSL)及安全传输层协议(TLS)旨在提供一个安全.加密的client和server之间的连接网络.为进一步进行身份验证和加密,server必须提供证书,从而直接有效地证明其身份. 使 ...

  3. Linux声卡驱动框图

    1.声卡驱动注册完成后的框图 2.open & hw_params 完.

  4. JavaScript:回调模式(Callback Pattern)

    函数就是对象,所以他们可以作为一个参数传递给其它函数: 当你将introduceBugs()作为一个参数传递给writeCode(),然后在某个时间点,writeCode()有可能执行(调用)intr ...

  5. iOS 程序插件及功能动态更新思路

    所用框架及语言 iOS客户端-Wax(开发愤怒的小鸟的连接Lua 和 Objc的框架),Lua,Objc, 服务端-Java(用于返回插件页面) 工具框架链接地址:Wax - https://gith ...

  6. python测试开发django-14.查询表结果(超详细)

    前言 django查询数据库的方法很多,不同的方法返回的结果也不太一样,本篇详细讲解关于查询的13个方法 返回对象是对象列表的: all(), filter(), exclude(), order_b ...

  7. Python中的文件IO操作(读写文件、追加文件)

    Python中文件的读写包含三个步骤:打开文件,读/写文件,关闭文件. 文件打开之后必须关闭,因为在磁盘上读写文件的功能是由操作系统提供的,文件作为对象,被打开后会占用操作系统的资源,而操作系统在同一 ...

  8. LuaJit转义的问题

    之前在项目中,处理类似!30转为表现的字符串时,有人写了这样的一段代码"\![1-2][0-9]",当换成luajit时启动报错了,出错原因在于转义字符使用不对.在很多语言中,正则 ...

  9. PostgreSQL入门,PostgreSQL和mysql

    PostgreSQL被誉为“世界上功能最强大的开源数据库”,是以加州大学伯克利分校计算机系开发的POSTGRES 4.2为基础的对象关系型数据库管理系统. PostgreSQL支持大部分 SQL标准并 ...

  10. TensorFlow训练神经网络cost一直为0

    问题描述 这几天在用TensorFlow搭建一个神经网络来做一个binary classifier,搭建一个典型的神经网络的基本思路是: 定义神经网络的layers(层)以及初始化每一层的参数 然后迭 ...