Optimizing graphics performance

来源:互联网 发布:图形旋转矩阵 编辑:程序博客网 时间:2024/05/20 22:30

常见的瓶颈和一些检查他们的方式

a) GPU通常被填充率和显存带宽限制

降低显示分辨率运行游戏,如果游戏运行更快,那么可能受到GPU填充率的限制。

b) CPU经常受到需要渲染批次数量的限制

渲染的批次越多,CPU的消耗越高

不常见的瓶颈

c) GPU有太多的顶点需要被处理,可以保证顶点有良好表现依靠于GPU和顶点着色器的复杂程度,通常,在手机上不超过100,000个顶点(10W-30W。对于PC来说即使有成百上千万的顶点也很好管理,但是保证顶点数量在最低的状态是一个很好的优化习惯。

d) 如果渲染不是GPU或者CPU的问题,那么问题出现在别的情况,比如物理等。

CPU优化

将物体渲染到屏幕上,CPU有很多工作去做:确定哪些光线影响物体,设置着色器和着色器参数,发送渲染指令到显卡驱动(将这些命令发送给显卡)

这些操作对CPU的影响是累加的。

Eg:对于1000个三角形,1000个三角形在一个Mesh上的消耗比1000Mesh每个Mesh上有一个三角形的消耗要少很多。在GPU上的成本是相似的。但是对CPU的成本截然不同。

减少可见物体数量,减少CPU的工作量:

e) 手动或者使用Draw call batching(针对Mesh

f) 将不同的纹理组成一张大的图集,减少材质的数量(针对材质)

g) 避免物体被多次渲染(如:反射、阴影、逐像素灯)

将物体合并起来,这样每个Mesh拥有至少上百个三角形且只是用一个材质。注意:合并两个没有使用同一材质的物体并不会对性能有提高。对于Mesh需要使用多个材质最常见的原因是需要使用不同的纹理贴图。为了确保提高CPU的性能,要保证合并的物体拥有相同的纹理。

GPU优化

优化模型几何结构有两个基本规则

h) 不要使用过多的三角形

i) 保持UV贴图接缝和硬边(双向顶点)尽可能的低

需要注意的是:图形硬件需要处理的顶点数量通常与3D应用提供的顶点数量不同。这是因为在建模过程中的一些顶点在显卡中处理的时候需要将其变成两个或者更多个顶点。这么做是为了达到渲染目的。

纹理压缩和Mipmaps

使用纹理压缩来减少图片尺寸的大小,可以提高加载时间、减少内存并且提高渲染性能,压缩纹理占用少量的内存带宽。

3D场景需要使用Mipmaps

最快的选择是创建的时候不需要计算光照,为了做这件事,使用LightMapping烘焙静态光照,而不是每一帧计算。生成Lightmapped环境的好处:

j) 运行速度更快

k) 表现的更好

逐像素灯的处理:

LOD和裁剪距离

裁剪物体包括使物体隐藏,这是一个很有效的方法降低CPUGPU的负载。

有很多方法实现这一点:

l) 使用LOD

m) 在相机上手动设置每层的距离

n) 将小物体放到单独的层中,通过Camera.layerCullDistances方法设置每层裁剪距离

实时光照

实时光照会有很好地表现效果,但是会对性能有很大的影响。对CPUGPU均有影响。

一些规定,可以是使游戏表现更好

o) 顶点数量要低于20W,对于PC要小于300W(要根据设备的GPU设定)

p) 如果使用内置的Shader,使用MobileUnlit系列。

q) 控制材质数量,不同的物体尽量使用相同的材质

r) 不移动的物体设置成静态以便于内部优化,如static batching

s) 只能拥有一个逐像素光影响物体。

t) 使用烘焙

u) 使用压缩纹理

v) 尽可能避免使用雾效

w) 使用遮挡剔除

x) 使用天空盒表现远方的物体

y) 使用像素着色器或者纹理组合来混合多个纹理,而不是使用多通道

z) 使用低精度变量

aa) 像素着色器避免使用复杂的数学函数

ab) 每个片段使用较少的纹理