Unity 2017 Game Optimization 读书笔记 Dynamic Graphics(1)

The Rendering Pipeline

渲染表现差有可能取决于CPU端(CPU Bound)也有可能取决于GPU(GPU Bound).调查CPU-bound的问题相对简单,因为CPU端的工作就是从硬盘或者内存中加载数据并且调用图形APU指令。想找到GPU-bound的原因会困难很多,因为在渲染管线中很多地方都有可能是引起问题的原因。解决GPU 瓶颈的问题我们甚至可能得使用猜测法和排除法。

图中第一行展示了CPU所做的工作,包括了通过硬件驱动调用图形API以及把渲染指令传输到GPU中(通过Command Buffer) 

下边的两行展示了GPU所做的工作,还可以再细分为Frond End 和 Back End两部分。

The GPU Front End

Front End是渲染管线中处理顶点(vertex)数据的部分。它从cpu接收mesh数据和Draw Call请求。GPU随后会收集所有vertex数据并且把它们传入到Vertex Shaders中。在Vertex Shader中可以对顶点数据进行修改和处理,最后输出的数据数量和输入时保持1比1的比例(就是比如输入100个顶点,处理后输出的数据也是100个)。接下来顶点数据会组装成片元(最常见的是三角形片元)并进行光栅化,根据顶点的位置和摄像机的视野会决定哪些像素会出现在最终的渲染结果中。这个过程输出的是一个pixels的list,也就是常说的fragments,它将会用于Back End 的处理阶段。

Vertex Shaders的输出还可以用于Tessellation,它是在几何着色器中处理(Geometry Shaders)。Geometry Shaders和Vertex Shaders 类似,但是它是1对多的关系,也因此可以产生更多的几何细节。

总结下就是对于Front End:Vertex Shaders  -- Geometry Shaders(如果有) -- 光栅化 -- 输出fragments给Back End处理。

The GPU Back End

Back End是渲染管线中处理Fragments的过程。每个Fragment将会传入Fragment Shader中,这些Shader比Vertex Shader会复杂许多,比如可以包含Depth test(深度测试),alpha test(透明度测试),图片采样,光照计算,阴影计算等等。

经过这个过程处理后的数据就会传入Frame Buffer中,通常渲染API中会有两个Frame Buffer,一个用于显示当前的,另一个会在GPU完成渲染指令后用于存储下一帧要显示的内容。当GPU接收到Swap Buffer指令(每一帧CPU发送的最后一个指令)后,连个frame buffer会交换,这样新的一帧会被渲染出来,这个过程会在应用程序渲染的过程中不断重复。

在Back End部分,会有两个因素很有可能成为瓶颈:Fill Rate(填充率) 和 Memory Bandwidth(内存带宽)

Fill Rate

Fill rate和GPU渲染fragments的速度相关。一个fragment仅仅是有可能会最终成为一个像素,如果它在fragment shader中某个test过程失败了,就会被舍弃,这种方式能给性能带来极大的提升,因为渲染管线就可以略过这个fragment后边的操作,去直接处理下一个fragment。

各种test的一个例子就是 Z-testing。它用于检查一个fragment是否被另一个更靠近摄像机的fragment遮挡住。如果被遮挡住,就会被舍弃,如果没有,就会被处理成一个像素,这会消耗fill rate中的一个fill。想象下,成千上万的物体,每个物体又产生几百几千个fragments,很容易就会导致每帧需要处理几百万个fragemnt。

显卡制造商把Fill Rate做为显卡性能的一个参数,通常是以Gigapixels per-second衡量,但是更准确的说法应该是 Gigafragments per-second(因为最终的像素是屏幕固定的,但实际处理的是fragment)。不管咋说,反正这个值越大越好,说明处理能力越强。比如一个30Gigapixels每秒的显卡,目标帧率是60hz,则 我们每帧能处理的fragment上限为:30,000,000,000/60 = 500
million。这对于分辨率为2560 x 1440,最理想状态下每个像素只渲染一次的话,我们可以将整个场景渲染125次。

但是现实不是完美的,Fill Rate也会被其他渲染功能所消耗,比如阴影和后处理,他们都需要将同一个fragement数据在各自pass中处理多次。初次之外,我们通常也需要重复渲染同个像素多次,这个现象可以叫做Overdraw,它可以用于衡量我们是否有效的利用了Fill Rate。

Overdraw

通过additive alpha blending模式,我们可以很直观的看到有多少OverDraw。越亮的地方代表着OverDraw越严重,因为同一个像素被渲染了更多的次数。通过Scene window的Overdraw Shading模式即可查看:

 OverDraw越多,Fill Rate浪费越多,有一些技巧可以降低OverDraw,之后我们会讨论。

值得注意的一点是渲染中有不同的队列(queues),可以分为两类:Opaque(不透明)和Transparent(透明),Opaque队列中渲染的物体可以通过之前介绍的Z-testing方法剔除fragments,但是Transparent队列中渲染的物体则不行,这会导致很多OverDraw。Unity 的 UI总是使用Transparent队列渲染,所以UI经常成为OverDraw的重灾区。

Memory Bandwidth

GPU 核心中有一个local texture Cache,它存储了GPU最近使用的textures。这个cache和CPU内存的cache设计非常像,它处理速度非常快但是非常小,它使得texture的采样开销变小速度变快。

如果当一张textrue已经存储在这个local texture Cache中,采样速度会快如闪电,如果没有,在采样前则必须从VRAM中拉取这个texture,此时就是缓存没有命中,这会花费时间去从VRAM中寻找并且获取想要的那张texture。这个过程就会消耗Memory Bandwith,消耗的大小为VRAM中存储这个texture的大小(但是可能并不是这张图原始大小,因为GPU有压缩技术)。

当Memory Bandwidth成为瓶颈的时候,GPU不断的寻找所需的textures,而cache会不断的在等待所需的数据,GPU在Cache提供所需的数据之前,就没法将渲染好的数据及时传入到Frame Buffer中,从而导致帧率下降。

假设显卡的Memory Bandwidth为 96 GBs每秒,目标帧率为60hz,则每帧可处理的texture数据量为1.6 GBs (96/60)。虽然这么算不精确,但是可以提供大致的估算。

要特别注意的是这个值并不是说工程中贴图总量的最大值,也不是CPU 内存中贴图总量的值,也不是GPU显存中的贴图总量的值。因为每一帧中有可能会不断的切换texture,有可能一个texture渲染多次,这取决于有多少Shader需要这些texture以及物体的渲染顺序,有可能虽然只有几张图也会把Memory Bandwith消耗光。Shader中使用大量的texture会更有可能导致没有命中缓存从而导致Memory Bandwith出现问题,当大量物体需要不同的各种高质量贴图(法线贴图,Emission贴图等等)进行渲染时,就很容易触发这种情况。

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics(2)

Lighting and Shadowing 现代的游戏中,基本没有物体能在一步就完成渲染,这是因为有光照和阴影的关系。光照和阴影的渲染在Fragment Shader中需要额外的pass。 首先要设置场景中的Shadow Casters和Shadow Receivers,Shadow Casters投射阴影&…

Unity 2017 Game Optimization 读书笔记 The Benefits of Batching

batching(合批) 和大量的描述一个3D物体的数据有关系,比如meshes,verices,edges,UV coordinates 以及其他不同类型的数据。在Unity中谈论batching,指的是用于合批mesh数据的两个东西&#xff1a…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (3)

Rendering performance enhancements Enable/Disable GPU Skinning 开启GPU Skinning可以减轻CPU或GPU中Front End部分中某一个的负担,但是会加重另一个的负担。Skinning是mesh中的顶点根据动画中骨骼的当前位置进行计算,从而让角色摆出正确的姿势。 …

Unity手游开发札记——布料系统原理浅析和在Unity手游中的应用

原文:https://zhuanlan.zhihu.com/p/28644618 0. 前言 项目技术测试结束之后,各种美术效果提升的需求逐渐成为后续开发的重点,角色效果部分的提升目标之一便是在角色选择/展示界面为玩家提供更高的品质感,于是可以提供动态效果的…

行为树(Behavior Tree)实践(1)– 基本概念

原文:http://www.aisharing.com/archives/90 行为树(Behavior Tree)实践(1)– 基本概念 自从开博以来,每天都会关心一下博客的访问情况,看到一些朋友的订阅或者访问,不胜欣喜&…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (5) Shader优化

Shader optimization Fill Rate和 Memory Bandwidth开销最大的地方就是Fragment Shader。开销多大取决于Fragment Shader的复杂程度:多少纹理需要采样,多少数学计算函数需要使用等等。GPU的并行特性意味着在线程中如果任何地方存在瓶颈,都会…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (6)

1. Use less texture data 这条优化技巧非常直接,减少texture的数据量,减少分辨率或者降低位数,虽然可能会降低渲染质量。但是通常使用16-bit textures并不会明显的感觉到渲染效果下降。 MipMap技术可以有效减少VRAM和Texture Cache之间来回…

LeetCode 面试题57 - II(剑指offer) 和为s的连续正数序列

今天毕业五年了,一直忙于工作和享受,自从当年找完工作后就一直没有再刷过题,作为搬砖的码农,觉得还是应该养成长期刷题的习惯坚持下去。之前坚持了每天被一会单词,如今雅思一本也快看完了,从今天开始准备在…

反走样技术相关文章

https://zhuanlan.zhihu.com/p/28800047 https://zhuanlan.zhihu.com/p/57503957 https://zhuanlan.zhihu.com/p/33444125 https://zhuanlan.zhihu.com/p/33444429 走样的原因及其分类 说到走样,首先要说的就是采样。这也算是很多图形学专著中提到反走样相关技…

求n的阶乘的算法框图_单片机常用的14个C语言算法

问:怎么每天看到这种文章?答:只需搜索公众号"51单片机学习网"免费关注算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述&#xff…

LeetCode 286. 墙与门 多源BFS和DFS

思路1&#xff1a; DFS&#xff0c;对于每个门进行一次DFS搜索&#xff0c;记录每个位置对每个门的距离&#xff0c;当有更小距离的门时更新这个数值 public void WallsAndGates(int[][] rooms) {for (int i 0; i < rooms.GetLength(0); i){for (int j 0; j < rooms[i]…

贝塞尔曲线

文章参考于&#xff1a;https://www.jianshu.com/p/0c9b4b681724 https://gameinstitute.qq.com/community/detail/129188 贝赛尔曲线的前世今生&#xff1a; 贝塞尔曲线&#xff0c;这个命名规则一眼看上去大概是一个叫贝塞尔的数学家发明的。但&#xff0c;贝塞尔曲线依据…

如何控制局域网网速_单臂路由|N1盒子(OpenWRT)单线多拨实现网速叠加

受于某些现实条件&#xff0c;有些同学苦于家里的网络带宽太小无法尽情冲浪。如何在不额外花钱升级宽带的情况下提升家里网络呢&#xff1f;且看一个盒子加路由器即可实现网络单线多拨&#xff0c;成倍提升网速完成网速叠加。题图是我家里的路由器加N1盒子。前置条件光猫有超级…

linux离线安装redmine_Linux 下一款非常好用的翻译软件

前面有一个半月的时间&#xff0c;我非常详细且非常基础的介绍了 Ubuntu 18.04 desktop 桌面系统的安装和基本使用&#xff0c;在知乎上也开了一个专栏《Linux 漫游之旅》&#xff0c;上面记录了所有的文章&#xff0c;这个专栏的目的呢是手把手教新接触 Linux 操作系统的朋友如…

vivo应用商店电脑版_VIVO应用商店代理商江湖的那些关系

VIVO应用商店代理商江湖的那些关系需要源文件清晰版本加微信wps007其他干货文章如何不花钱或者少花钱把ASO的活给干了&#xff1f;2020最新主流安卓应用市场ASO技巧以及注意事项App推广的高阶玩法&#xff0c;一箭双星&#xff01;今日头条定向优化技巧今日头条广告创意优化指南…

华为阅读下载的文件在哪里找_华为手机还要天天清理内存?1键关闭这2个设置,手机用到2035年...

阅读本文前&#xff0c;请您先点击上面的蓝色字体“科技荟 ”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注。 华为手机还要天天清理内存&#xff1f;1键关闭这2个设置&#xff0c;手机用到…

pyautogui 打包 运行 窗口_试试动态窗口管理器 dwm 吧

以不到 2000 标准行的代码写就的 dwm&#xff0c;是一个速度极快而功能强大&#xff0c;且可高度定制的窗口管理器。-- Adam Šamalk(作者)如果你崇尚效率和极简主义&#xff0c;并且正在为你的 Linux 桌面寻找新的窗口管理器&#xff0c;那么你应该尝试一下 动态窗口管理器(dy…

ArcMap 导入 wrl_flmic拍摄的素材如何无损导入电脑

点击上方“九尾短视频研习室” 可以订阅哦&#xff01;今天分享使用 iPhone 或者安卓版 filmic 拍摄的素材&#xff0c;如何无损导入到win 或 Mac 电脑中~01iPhone Mac使用 iPhone 和 Mac 的朋友&#xff0c;可以使用“隔空投送”无线传输&#xff0c;但是这个过程中&#xff…

LeetCode 97: 交错字符串

这里我们考虑用 s1和 s2的某个前缀是否能形成 s3 的一个前缀。 这个方法的前提建立于&#xff1a;判断一个 s3的前缀&#xff08;用下标 k表示&#xff09;&#xff0c;能否用 s1和 s2 的前缀&#xff08;下标分别为 i和 j&#xff09;&#xff0c;仅仅依赖于 s1 前 i个字符和…

苹果6发布时间_苹果秋季发布会将在北京时间9月16日举办

点击上方蓝字&#xff0c;关注我们苹果正式公布了苹果秋季发布会9月16日举办&#xff0c;届时国内可在五大平台上观看直播&#xff0c;据悉本次发布会将发布的产品有iPhone、ipad和Apple Watch等系列新品&#xff0c;那么这场发布会可以在哪看呢?下面小编带来了2020年苹果秋季…