两个实时渲染相关的速算公式

今天想把平时性能分析和做资源规划时用到的一些有意思的估算公式总结下,以后还会继续补充。考虑到网游的性能要求比单机更高,在铺大资源制作之前就对性能指标心中有数是很重要的。否则后期优化简直就是噩梦。下面的公式都来自Real Time Rendering 3rd一书,也参考了一些网上的文献。

1.Batches Per Frame

理想情况下每一帧提交的绘制请求(一般用Batch或者DP缩写)数量的估算公式:

\(x=\frac{BCU}{F}\)

其中X是Batch估算值,C是CPU的主频(GHZ),U是用来做渲染调用的CPU时间比例,F是目标FPS。B是一个NVIDIA工程师通过实验给出的一个标准参数,03年的CPU是1 GHZ在100%利用率下一秒平均可以提交25000个Batch。考虑到这些年CPU速度的提升,Cache的增大,驱动的优化,B我们可以适当增加到75000。比如我们的游戏目标帧数是30FPS。留给渲染API提交的CPU时间预算是40%,CPU主频是2.3GHZ.那么一帧Batch的理论上限就是2300。实际情况下,是远远达不到这个数字。

2.内存带宽估算

除了CPU提交的瓶颈,对游戏来说,GPU带宽瓶颈恐怕是更值得注意的。特别是很多后期算法都依赖大量的纹理读取操作,所以了解一些内存带宽估算方法还是很重要的,这样我们可以估算出每一个像素渲染的内存传输开销,从而作为游戏配置策略的重要参考。

一般来说,GPU内存带宽主要消耗在3种Buffer的读写上:Color(颜色),Depth and Stencil(这两个一般做到一起,24+8 = 32 Byte宽度),Texture(纹理)。所以基本公式就是:\(B=B_{c}+B_{z}+B{t}\)

下面逐个分量展开进行分析。\(B_{z}\)是深度Buffer的读写开销,这个值是和我们的重绘次数o(d)相关的,也就是一个像素被重复写的次数,可以用一个级数来计算平均值:

\(o(d)=1+\frac{1}{2}+\frac{1}{3}…+\frac{1}{d}\)

不过,由于深度测试之后,没有通过测试的像素不会再被写入,所以深度Buffer的读写次数是不同的,所以我们有下面的公式:

\(B_{z}=d\cdot Z_{r} + o(d)\cdot Z_{w}\)

如果假定深度复杂度d为6,o(d)就是2.45

那么\(B_{z}=33.8 bytes\)

对于颜色Buffer来说写次数是和深度的写次数相同的,所以有

\(B_{c}=o(d)\cdot C(w)= 9.8bytes\)

对于纹理来说,要考虑Cache机制的影响,如果假定一个Pixel有4次纹理读取操作,m是Cache命中率。一般为0.25,也就是每4次纹理读取有一次Miss,读取纹理的时候是Trilinear Mipmapping,那么有:

\(B_{t}=o(d)\cdot m \cdot T_{r} =78.4bytes\)

上面的分析忽略了很多细节,比如如果像素需要进行Alpha Blend,那么是需要额外的Color Buffer读取操作的。这样算下来一个像素的内存读写开销就是122bytes。在没有开启MSAA的情况下,如果输出FPS为60,分辨率为1280×720的内存带宽开销就是6.4 GB/s.考虑到上面的公式已经极度简化,所以可以想象内存带宽是影响性能的一个重要因素,比如我的笔记本显卡是GT330M,内存时钟频率只有800MHZ,带宽为128bit,那么内存带宽实际上只有12.8GB/s。从一些GPU数据我们也能很明白的看出内存带宽对性能的巨大影响,比如从这篇文章里面借用的图表

4870的ALU能力是880 GLOP/s而5850的ALU是1000 GLOP/s.也就是核心运算能力5850是略高于4870的,但是由于4870的内存带宽比5850多了50 GB/s.结果3DMark跑分,5850反而低了800分。所以说,如果想要游戏在低端GPU上通过降低配置达到更流畅的体验,内存带宽和显存占用绝对是重点问题。实际上,我在做我们引擎优化的时候也遇到过,滥用纹理拼图,虽然降低了Batch数量(也就是DP数),但是在某些机器上性能反而下降了,主要原因就是显存占用过大以及过高的内存带宽使用。引擎优化就像是踩跷跷板,关键就是管线各个阶段的平衡,不像国外单机开发者,已经可以抛弃DX9硬件了,中国国情决定,甚至现在出的游戏,至少兼容Geforce FX 5200也是必须的。

Tags: , ,

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>