unity性能优化-GPU

本文介绍了Unity游戏开发中针对GPU性能瓶颈的优化策略,包括减少绘制次数、应用LOD技术、优化显存带宽等手段,并提供了具体的实现方法,如遮挡剔除、减少实时光照等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GPU:负责整个渲染流水线。它会从处理CPU传递过来的模型数据开始,进行Vertex Shader、Fragment Shader等一系列工作,最后输出屏幕上的每个像素。因此它的性能瓶颈包括顶点、像素、显存等因素有关。
GPU的瓶颈主要存在在如下的方面:
1.像素分辨率,可以简单的理解为图形处理单元每秒渲染的像素数量,可以在unity的Player Settings中设置降低分辨率。
2.像素的复杂度,比如动态阴影,光照,复杂的shader等等
3.几何体的复杂度(顶点数量)
4.GPU的显存带宽:存储带宽是指GPU在其特定的内存上的读写速率

优化:
1减少绘制的数目:尽可能减少模型中三角形的数目,尽可能重用顶点,对于GPU来说,它本质上只关心有多少个顶点。因此,尽可能减少顶点的数目其实才是我们真正对需要关心的事情。移除不必要的Hard Edge以及纹理衔接,即避免Smoothing splits和UV splits。遮挡剔除是用来消除躲在其他物件后面看不到的物件,这代表资源不会浪费在计算那些看不到的顶点上,进而提升性能。控制绘制顺序,主要原因是为了最大限度的避免overdraws,也就是同一个位置的像素可以需要被绘制多变。在Unity中,那些Shader中被设置为“Geometry” 队列的对象总是从前往后绘制的,而其他固定队列(如“Transparent”“Overla”等)的物体,则都是从后往前绘制的。这意味这,我们可以尽量把物体的队列设置为“Geometry” 。减少实时光照,使用Lightmaps,使用God Rays,使用mobile版的shader。。 LOD技术有点类似于Mipmap技术,不同的是,LOD是对模型建立了一个模型金字塔,根据摄像机距离对象的远近,选择使用不同精度的模型。它的好处是可以在适当的时候大量减少需要绘制的顶点数目。它的缺点同样是需要占用更多的内存,而且如果没有调整好距离的话,可能会造成模拟的突变。

2.LOD:LOD(level of detail)技术可以用来减少较远网格的复杂度,通过减少需要渲染的顶点数量同时不影响游戏的表现效果。菜单Component-Rendering-LODGroup。

3.优化显存带宽:主要途径是减少贴图的内存占用来提高游戏的性能,贴图压缩 贴图压缩可以极大的减少贴图在磁盘和内存中的占用率。如果游戏的内存是我们的限制因素,则压缩贴图可以提高游戏的性能。使用mipmap,MipMap会占用内存,但能提高图片渲染的质量(比压缩要好)。

4.游戏中的图像特效会极大的造成像素问题,特别是有多个图像特效。如果游戏受到像素的影响同时又采用了图像特效,则最好对图像特效进行优化,比如用优化后的爆炸特效来替代优化前的爆炸特效。特别是在同一个相机上有多个图像特效,这会造成多个shader pass,这种情况下最好将多个图像特效合并在一个shader pass中。如果这样设置都不能解决问题,则最好考虑是否能不用图像特效,特别是在低端机上。

5.如果游戏中的模型网格没有使用法线贴图,则可以在导入设置的时候剔除切线顶点来减少顶点数量。

6.警惕透明物体。GUI大多数被设置成半透明,尽量减少窗口中GUI所占的面积。如果实在无能为力,可以把GUI绘制和三维场景的绘制交给不同的摄像机,而其中负责三维场景的摄像机的视角范围尽量不要和GUI重叠。

7.减少实时光照。使用光照贴图Lightmaps;使用雾和体积光God Rays;使用mobile版的shader。

8.遮挡剔除:顾名思义就是被遮挡看不见的地方不渲染,例如墙后的物体。遮挡剔除可以CPU计算也可以GPU计算。Unity自带了OcclusiongCulling

9.降低渲染的分辨率:缩小Framebuff分辨率,减少ps开销和内存显存,但是会模糊,王者荣耀等很多主流游戏在Android上都降了分辨率。

转载于:https://www.cnblogs.com/wang-jin-fu/p/8331278.html

### Unity GPU性能优化方法与技巧 在Unity开发过程中,GPU性能优化是确保游戏能够在各种平台上流畅运行的重要环节。以下是针对UnityGPU性能优化的一些有效方法和技巧: #### 1. 批处理 (Batching) 批处理是一种减少Draw Calls的有效技术。通过将多个具有相同材质的对象组合成单个绘制调用,可以显著降低渲染开销。Unity支持两种类型的批处理:静态批处理(Static Batching)和动态批处理(Dynamic Batching)[^2]。 - **静态批处理**: 对于不移动游戏对象,可以通过启用`Static`标记来应用静态批处理。这会将这些对象合并到一个网格中进行渲染。 - **动态批处理**: 动态批处理适用于较小的、频繁变换位置的对象。然而,它仅限于一定大小范围内的Meshes,并且要求共享相同的Material实例[^3]。 #### 2. 减少Overdraw Overdraw是指同一像素被多次渲染的情况,通常发生在透明物体或多层叠加的情况下。过多的Overdraw会导致GPU负载增加。为了减少Overdraw: - 使用合适的Shader复杂度,避免不必要的计算操作。 - 调整摄像机裁剪平面(Culling Plane),移除不可见的内容[^1]。 #### 3. Shader优化 Shaders是影响GPU性能的关键因素之一。复杂的Pixel Shading可能会消耗大量资源。因此,在编写或选择Shaders时应考虑以下几点: - 尽量使用内置Standard Surface Shader而非自定义High-Level Shading Language(HLSL)/CG代码片段。 - 避免过度依赖昂贵的效果如环境光遮蔽(AO)或者屏幕空间反射(SSR)[^2]。 #### 4. 纹理压缩与LOD(Level of Detail) 高效管理纹理数据也是提高GPU效率的好办法: - 利用Texture Atlases合并小型独立图片文件至单一较大图像上以节省内存访问时间并促进更好的缓存行为。 - 实施Level Of Details策略根据距离调整模型细节程度从而平衡视觉质量和运算成本之间的关系。 #### 5. 渲染路径的选择 不同的Rendering Path会对最终呈现效果及其背后涉及的工作流程产生深远的影响。Forward Rendering适合简单场景而Deferred Lighting则更适合大型开放世界类别的作品因为后者允许每帧只处理可见几何体而不是整个场景的所有部分[^1]。 ```csharp // 示例:设置Quality Settings中的Render Pipeline Asset GraphicsSettings.renderPipelineAsset = pipelineAsset; ``` #### 6. 其他建议 除了上述提到的技术手段外还有一些通用性的指导原则可以帮助进一步改善整体表现水平比如定期执行Profiler工具检测找出瓶颈所在;合理分配工作给CPU/GPU各自擅长领域等等[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值