当前位置:网站首页>游戏优化性能杂谈(十一) - 知乎
游戏优化性能杂谈(十一) - 知乎
2020-11-08 08:54:00 【osc_eoqljui5】
VS之后,是光栅化阶段。这个阶段属于固定功能(不可编程)阶段,通常被认为是执行效率很高的,所以往往会被忽视。
其实就我所观察到的情况来言,这部分成为瓶颈的情况,并不罕见。比如《原神》在开发过程当中,就出现过这样的情况。
《原神》当时的情况是,游戏当中当人物爬树的时候,为了避免树冠遮挡人物,会有一个将树冠变成半透明的效果。普通的半透明渲染是已知的性能杀手,所以这里开发商采用了用stencil抠掉一些像素,也就是所谓的dither(抖动)的方法。如果不了解这种方法,可以想象一下报纸上的那些图片,都是一些点状的图案组成的。
按理说,这种镂空会减少需要渲染的像素,也就是PS的工作量。但是开发组发现,最终结果是不降反升。也就是渲染时间反而增加了。而且更加不可思议的是,通过对比开关此效果的GPU跟踪文件,可以观测到PS工作量的确是明显减少,但是渲染时间并没有变化甚至是略微变长了。
其实原因就在于光栅化。VS输出的三角形,在光栅化模块进行光栅化之后,形成PS工作量。在光栅化之前,会进行根据三角形级别的背面/正面剔除、视锥剔除/裁剪,以及零面积/小三角形剔除。但是,基于stencil测试级别的排除,并不是发生在三角形级别,而是发生在光栅化之后的fragment级别。也就是说,dither虽然减少了进入PS阶段的fragment数量,但是并不影响光栅化的工作量。
但是如果仅仅是如此,那么dither开启之后,应该还是快些。因为光栅化工作量一样,但是PS工作量减少,应该是变快的。但是实测是变慢,这又是为什么呢?
这是因为在当代的桌面GPU当中,引入了tile-based rasterization。注意这并不是移动平台的TB(D)R,因为它只限rasterization阶段。
具体来说,GPU并非是一次性将三角形按照渲染分辨率拆解成为fragment,而是以更低的分辨率,比如1/8目标分辨率,进行光栅化。比如,如果我们的画面最终是1920x1080,则GPU首先是以240x145这个分辨率进行光栅化,然后再对每个光栅化结果(8x8像素)进行进一步光栅化。(具体做法及尺寸不同GPU型号可能有显著差异)
这种做法有一个好处,就是可以大幅提高pre Z以及pre Stencil的效率。如果低分辨的一个单位(tile)整体上在pre Z测试或者pre Stencil测试当中被拒绝,那么就没有必要再对其进行更加精细的光栅化。
而在我们这个案例当中的情况是,其使用的Stencil模板,也就是“镂空”的模板,其中洞洞的图案并没有对齐这个tile。也就是说,当以tile为单位去做pre Stencil的时候,永远是无法拒绝(因为tile当中蒙版数值不一样,部分通过部分拒绝)。相比较不开dither的情况,等于是白白多了一个stencil测试但是光栅化的工作量一点儿都没有减少,反而是在光栅化过程当中多了一个查询stencil的步骤。所以光栅化效率反而变低了。
版权声明
本文为[osc_eoqljui5]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4255780/blog/4707896
边栏推荐
- 来自不同行业领域的50多个对象检测数据集
- 高并发,你真的理解透彻了吗?
- How did Julia become popular?
- 什么你的电脑太渣?这几招包你搞定! (Win10优化教程)
- These core technology of object-oriented, after you master it, you can have a good interview
- Wechat nickname Emoji expression, special expression causes the list not to be displayed, export excel error report and other problems solved!
- Judging whether paths intersect or not by leetcode
- vivoY73s和vivoY70s的区别 vivoY73s和vivoY70s哪个值得入手
- Sum up some useful functions
- Python learning Day1 -- Basic Learning
猜你喜欢

FORTRAN77从文件中读入若干数据并用heron迭代公式开方

鼠标变小手

搜索引擎的日常挑战_4_外部异构资源 - 知乎

C language I blog assignment 03

Application of bidirectional LSTM in outlier detection of time series

Blazor 准备好为企业服务了吗?

16.文件传输协议、vsftpd服务

Test requirements for MIC certification of Bluetooth 2.4G products in Japan

归纳一些比较好用的函数

SQL Server 2008R2 18456错误解决方案
随机推荐
vivoS7e和vivoS7的区别 哪个更值得入手
ubuntu实时显示cpu、内存占用率
数据科学面试应关注的6个要点
阅读心得:FGAGT: Flow-Guided Adaptive Graph Tracking
进程、线程和协程的区别
What? Your computer is too bad? You can handle these moves! (win10 optimization tutorial)
接口
架构师(2020年11月)
How can a technician take over a complex system?
NOIP 2012 提高组 复赛 第一天 第二题 国王游戏 game 数学推导 AC代码(高精度 低精度 乘 除 比较)+60代码(long long)+20分代码(全排列+深搜dfs)
Littlest jupyterhub| 02 using nbgitpuller to distribute shared files
分布式共识机制
Is there a big difference between i5 1135g7 and i51035g1? Which is better?
VC6 compatibility and open file crash resolution
vivoY73s和vivoY70s的区别 vivoY73s和vivoY70s哪个值得入手
Littlest JupyterHub| 02 使用nbgitpuller分发共享文件
个人短网址生成平台 自定义域名、开启防红、统计访问量
The real-time display of CPU and memory utilization rate by Ubuntu
Introduction to ucgui
盘点那些你没想到的云计算应用场景(上)