优化图形性能

##游戏的图形部分主要影响计算机的两个系统:CPU、GPU
##找到性能问题所在是哟且优化的首要法则

##常见的限制因素如下

  • GPU:一般受填充率或内存带宽限制。
    降低显示分辨率运行游戏。若降低后哟咻运行更快则变送GPU填充率可能是限制因素。
  • CPU:一般受需要渲染的批次数的限制
    检查Rendering Statistics 窗口中的batches。渲染的批次越多,CPU成本越高。
    ##CPU优化
    CPU的处理工作:确定哪些光源影响对象,设置着色器和着色器参数向图形驱动程序发送绘制命令,而图形驱动程序随后将准备发送到显卡的命令。
    如恶化减少CPU需要执行的工作量:
  • 通过手动方式或使用unity的绘制调用批处理将近处对象组合在一起;
  • 通过将单独的纹理放入更大的纹理图集,在对象中十月更少的材质;
  • 减少可能导致对象多次渲染的因素

##GPU优化模型几何体
基本原则:

  • 若无必要,不要使用三角形
  • 尽可能降低UV贴图接缝和硬边的数量

##光照性能
使用光照贴图只需要一次烘焙静态光照,无需每帧计算。
生成光照贴图环境的过程只比在unity场景中放置光源稍久一点,但是他又以下两点:

  • 运行速度要快
  • 视觉效果要好
    ###前向渲染中的光照

##GPU:纹理压缩和Mipmap
使用压缩纹理可减小纹理的大小。这种做法可加快加载时间、减少内存占用并显著提高渲染性能。与未压缩的32位RGBA纹理所需的内存带宽相比,压缩纹理使用的内存带宽要小得多。

###纹理Mipmap
3d场景中的纹理,要始终启用Generate mipmaps选项。Mipmap纹理使GPU能够为较小的三角形十月降低分辨率的纹理。这一点类似于压缩可以帮助限制GPU渲染时传输的纹理数据量。
此规则唯一的例外是当已知纹理像素将1:1映射到渲染的屏幕像素时。

##LOD(细节级别)和每层剔除距离
剔除对象设计使对象不可见。这是减轻CPU和GPU负载的有效方法。

在许多游戏中,在不影响玩家体验的情况下快速地执行此操作的方法是,相对于大对象,更激进地剔除小对象。例如:可让远处的小岩石和草不可见,而大型建筑物仍然可见。
实现方法:

  • 使用细节级别系统Level Of Detail
  • 手动设置camera上的每层剔除距离
  • 将小对象单独放在一层,并使用Camera.layerCullDistance脚本函数设置每层剔除距离
    ##实时阴影Realtime shadows

##GPU:编写高性能着色器shader的技巧

原则:

  1. 复杂的数学运算:超越数学函数都很消耗资源,尽量避免
  2. 浮点精度:在移动端GPU上低于获得良好性能非常重要

##简单的清单,让你的游戏更快
在为 PC 构建时,保持顶点数低于 200K 和每帧 3M(取决于目标 GPU)。
如果您使用内置着色器,请从“移动”或“未点亮”类别中选择。它们也适用于非移动平台,但是更复杂着色器的简化和近似版本。
保持每个场景不同材质的数量较少,并在不同对象之间共享尽可能多的材质。
Static在非移动对象上设置属性以允许内部优化,例如静态批处理。
只有一个(最好是定向的)pixel light影响您的几何图形,而不是多个。
烘焙照明而不是使用动态照明。使用压缩 纹理格式。
在可能的情况下,使用 16 位纹理而不是 32 位纹理。
尽可能避免使用雾。
用遮挡剔除在具有大量遮挡的复杂静态场景的情况下,减少可见几何体和绘制调用的数量。
设计关卡时要考虑到遮挡剔除。
使用天空盒来“伪造”遥远的几何体。
使用像素着色器或纹理组合器来混合多个纹理而不是多通道方法。
half尽可能使用精度变量。
尽量减少在像素着色器中使用复杂的数学运算,例如pow、sin和cos。
每个片段使用更少的纹理。

你可能感兴趣的:(unity3d,游戏,shader)