https://www.imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/

一种硬件结构

color target 分成tile

减小带宽

提前(fs)用depth做隐藏面消除 earlyz一个意思

减小cache missing 一行短了。。

所以early失效的都不可以 fs 改depth那些操作

比如fs里面discard (mask or alpha test) alpha to coverage

会不走onchip depth而访存拿depth

要clear 不然就少一次往tilebuffer上存上帧内容的操作

========================================

http://aras-p.info/texts/files/FastMobileShaders_siggraph2011.pdf

这段优化策略是2011年的 很多东西变了 比如ETC2 比如

tiled deferred       PowerVR

Tiled                    Mali, Andreno

Immediate           Tegra

1) TBDR: Render everything in tiles, shade only visible pixels

2) Tiled: Render everything in tiles

3) Classic: Render everything

因为分tile  sample的时候cache missing会比一张大的frame buffer下降

这样mipmap就没那么那么(对性能的影响) 要紧了  但也是好的 (对表现的影响 走样)

贴图资源分平台压缩

PVRTC for PowerVR; DXT for Tegra; ATC for Adreno

ETC2 for Android ogles3.0

TBDR:ipad2

msaa cheaper than immediate

2-4ms 4xmsaa

aniso 3ms

aniso=2

关了mipmap ipad2 2-3ms下降

tegra 跪了

TBDR不存在每个draw call的gpu时间了,这样拿不到GPU时间 不利于做优化

Andero和Tegra还有

一帧的VB太大会被切  导致效率下降(一次处理不了分两次) 1000 thound vertex ipd2

=====================================

减小overdraw  of alpha blend

PerfHUD profiler ES

============================

优化示例 tegra

天空盒后画

opaque 从前往后(不太现实 需要polygon粒度的排序排序)

近的大的物体按这个方式排序 远的按照material分 合并批次减少renderstate切换

(太有才了,我之前只考虑到这两点是矛盾的 没有想到可以分远近使用这两种策略)

主角先画  敌人在场景之后画(被遮挡)

因为reject occlude geo在tegra2上cost1ms*(vs)  我们可以设置trigger zone 这里关掉skybox 这样vs也去了

排序opaque带来 15ms提升

------

shader优化

shader指标  cycles/pixel 有静态分析工具 见别的帖子

light in lookup texture--LUT

by  tex2d(N.L,N.H) (我之前用过一张beckmann的)

----------

texture 压缩 硬件支持的格式 直接sample了

工具

IOS+PowerVR

unity profiler

Apple Instruments

PowerVR 他家有一套工具 见官网PVRUniSCo shader analyzer 可以看cycle

Android +Tegra

nv PerfHUD ES

每个drawcall的gpu时间

shader cycle

2x2 texture, null view rectangle 这两个排除很好用

虽然作者很喜欢这个,感觉这个东西需要开发工具箱那种实体设备 不太方便的样子

Mali

Andreno 都有他们家自己的工具

抓帧

shader 分析,live editing(这个功能我很喜欢)

我用Snapdragon比较多

最近renderdoc 也出了android版本 还算好用

============================================

shader优化 浮点数精度

float/half/fixed 对应highp/mediump/lowp

不要相信直觉

lowp  8bit  -2.0--+2.0

存颜色 归一化的vector 不要缩放拆解 lowp

mediump 16bit  uv, 2d vector 不需要高精度的量

highp  24-32bit 看平台

世界坐标,标量,大贴图UV 对精度要求比较高的offset之类

这个精度的事情分平台 有的显卡对精度比较敏感  总之 看操作手册

===============================

Likewise, do not pack 2 UVs into one float4/vec4 varying for PowerVR

float4 uv -----uv.xy ux.zw, povwerVR里面不要这样用

变量和插值

变量开销分平台 看手册

andreno对shader comple没那么敏感

==============

下面一个例子是ios优化

glFInish wait 这个可以看gpu时间 profiler 看cpu wait了多久

后处理 bloom和热扭曲 花了10ms+

浮点数精度 合并热扭曲和bloom 减少一次blit

优化了10ms (这个我也会 我减了两次blit在ppv2 也是10ms+)

它有个到处都用的fire wall shader

判断ALU bound 还是Texture bound

ALU bound

浮点数精度 逐顶点计算 lookup light tex

用工具分析shader PVRUniSCo

减小顶点数量 导致scene split了 3ms(Apple’s Instruments show this)

粒子优化 减小overdraw 简化shader

省出来的budget给了msaa和aniso

======================

tbdr

• Hidden Surface Removal

– For opaque only

– Don’t keep alpha-test enabled all the time(少用,用的时候才开)

– Don’t keep “discard” keyword in shader source, even if it’s not used(没用的discard去掉)

• Group opaque drawcalls together

• Sort on state, not distance

============================

枭龙优化建议

Qualcomm Snapdragon Rendering Tips

• Traditional handling of overdraw (via depth test)

– Cull as much as you can on CPU, to avoid both CPU and GPU cost

– Sort on distance (front to back) to maximize early z-rejection

• The Adreno SIMD is wide

– Check your ALU utilization in the Adreno Profiler and optimize

– Minimize temp register usage

– Use long shaders with a lot of ALU instructions

– Avoid dependent texture fetches (or cover the latency with a lot of ALUs)

==================

FBO和tile 切换很费需要frame buffer存到 memory

Expensive to switch Frame Buffer Object on Tile-based GPUs

– Saves the current FBO to RAM

– Reloads the new FBO from RAM

带宽高

Framebuffer Resolve/Restore

• Clear ALL FBO attachments after new frame/rendertarget

– Clear after eglSwapBuffers / glBindFramebuffer

– Avoids reloading FBO from RAM

– NOTE: Do NOT do unnecessary clears on non-tile-based GPUs (e.g. NVIDIA)

• Discard unused attachments before new frame/rendertarget

– Discard before eglSwapBuffers / glBindFramebuffer

– Avoids saving unused FBO attachments to RAM

– glDiscardFramebufferEXT / glInvalidateFramebuffer

这些都是为了防止 从memory读写framebuffer

=============================================================

https://de45xmedrsdbp.cloudfront.net/Resources/files/GDC2014_Next_Generation_Mobile_Rendering-2033767592.pdf

Tile based Rendering //后面一段是手机优化建议的更多相关文章

  1. Tile based Rendering 二 tbr and tbdr 优化建议tiled based deferred rendering

    http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-TileBasedArchitectures.pdf tbr 和tbdr ...

  2. OpenGL Insights 阅读有感 - Tile Based架构下的性能调校 翻译

    Performance Tunning for Tile-Based Architecture Tile-Based架构下的性能调校 by Bruce Merry GameKnife译 译序 在大概1 ...

  3. 【OpenCV】【计算机图形学】DIBR: Depth Image Based Rendering/ 3D image warping 中的实现细节

    最近在学习DIBR并尝试实现.感觉网上相关资料比较少,大多还是爬虫,决定自己写一个. DIBR就是depth image based rendering问题.输入一个视角下的图像和深度图,要求你输出另 ...

  4. 华为Mate8手机优化技巧

    我的华为Mate8手机手机存储(手机内存)32G, 运行内存3G,2016年买的手机,两样数值都偏小,导致使用手机的时候经常卡顿,一天来回清理垃圾.清理内存很多次,要运行微信.QQ等占用运行内存较多的 ...

  5. Physically Based Rendering

    Microfacet Models for Refraction through Rough Surfaces 这篇论文...名字被我忘记了 找了好久...之前存电脑里的 ggx beckmann 找 ...

  6. PBR:基于物理的渲染(Physically Based Rendering)+理论相关

    一: 关于能量守恒 出射光线的能量永远不能超过入射光线的能量(发光面除外).如图示我们可以看到,随着粗糙度的上升镜面反射区域的会增加,但是镜面反射的亮度却会下降.如果不管反射轮廓的大小而让每个像素的镜 ...

  7. 安卓手机优化 ROOT自启动管理 + 电量管理

    一.KingRoot + 净化大师 KingRoot 主要完成ROOT 和 自启动软件的管理 这里禁止的自启动管理 对于有些软件是不太管用 比如美团 手机百度等 净化大师 主要完成 高电量的软件优化 ...

  8. 回滚线段树+bitset优化01背包——cf981E

    /*首先考虑如何计算一个点的可能凑出的值,这就是一个01可行性背包问题那么再拓展到一段区间[1..n]的点上,每个query都可以看做是一段区间上的点[l,r]加上一个体积为x的物品,转换到01背包上 ...

  9. 一段sql的优化

    优化前代码 select * ,ROW_NUMBER() OVER(order by WrongCount desc) as rowId from(select Quba_IDint,Quba_Num ...

随机推荐

  1. 一个有趣的基于Django的调试插件--django-debug-toolbar

    django-debug-toolbar 介绍 django-debug-toolbar 是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息. git ...

  2. 更换163的yum源

    1.利用oss的文件目录形式进行各地项目的汇总保存.上报在A目录,统计过的放到B目录. 2.各地服务器健康状态检查,每5分钟检查项目,    如果有异常,就发短信+邮件进行汇报.不管是不是有异常,都以 ...

  3. 调用git命令行执行更新的思路

    cd /usr/local/software/CloudPlatformUtil/GitLab # CentOS6.5自带的git版本是1.7.1 # 安装高版本git wget -O git.zip ...

  4. 【转】kubernetes 中 deployment 支持哪些键值

    这个比较全,可以参考 ================= https://www.addops.cn/post/kubernetes-deployment-fileds.html ========== ...

  5. Pycharm中的Django项目连接mysql数据库

    一.安装Pycharm和Django就不详细说了,自行百度 二.新建Django项目也不说了 三.配置Django连接到mysql 1.models.py写一个类,继承models.Model cla ...

  6. Java基础:类加载机制

    之前的<java基础:内存模型>当中,我们大体了解了在java当中,不同类型的信息,都存放于java当中哪个部位当中,那么有了对于堆.栈.方法区.的基本理解以后,今天我们来好好剖析一下,j ...

  7. Linux基础系列-Day8

    Shell编程基础 Shell介绍 Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于windows下的的cmd.exe.它接收用户命令,然后调用相应的应用程序 ...

  8. Ubuntu用户管理原理

    Ubuntu账户: Ubuntu有三类账户:超级用户.普通用户以及系统用户. 每一个用户在ubuntu中都必须拥有一种账户,在Ubuntu中, /etc/passwd用来保存每个账户的信息.实际密码保 ...

  9. Python的替换函数——strip(),replace()和re.sub()(转)

    原文地址:http://blog.csdn.net/zcmlimi/article/details/47709049 在Python中常用的三个"替换"函数是strip(),rep ...

  10. NOIP 2006 提高组 t1 能量项链

    题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...