
DrawCall 优化详解
DrawCall 的数量直接影响游戏的渲染性能。每一个 DrawCall 都需要 CPU 去处理,并消耗 GPU 的渲染资源。当 DrawCall 数量过多时,会导致 CPU 和 GPU 的负担加重,进而影响游戏的帧率和流畅度。特别是在移动设备上,由于硬件性能的限制,过多的 DrawCall 更容易导致游戏卡顿和掉帧。
-
注意
-
注意
-
using UnityEngine; public class MaterialPropertyBlockColorTest : MonoBehaviour { public Renderer[] targetRenderers; // 拖入3个物体的Renderer public Color[] colors = { Color.red, Color.green, Color.blue }; void Start() { if (targetRenderers == null || targetRenderers.Length != 3) { Debug.LogError("请拖入3个Renderer!"); return; } // 确保所有物体使用相同的材质实例 Material sharedMaterial = targetRenderers[0].sharedMaterial; for (int i = 0; i < targetRenderers.Length; i++) { targetRenderers[i].sharedMaterial = sharedMaterial; // 强制共享材质 } // 用 MaterialPropertyBlock 设置不同颜色 for (int i = 0; i < targetRenderers.Length; i++) { MaterialPropertyBlock block = new MaterialPropertyBlock(); block.SetColor("_BaseColor", colors[i]); targetRenderers[i].SetPropertyBlock(block); Debug.Log($"物体 {i} 颜色设置为: {colors[i]}"); } } }
-
SpriteAtlas atlas = Resources.Load<SpriteAtlas>("PathToAtlas"); Sprite sprite = atlas.GetSprite("SpriteName"); Image image = GetComponent<Image>(); image.sprite = sprite;
-
// 同一个材质,开启 GPU Instancing MaterialPropertyBlock block = new MaterialPropertyBlock(); block.SetColor("_Color", Color.red); renderer.SetPropertyBlock(block); // 不打破 instancing
#pragma multi_compile_instancing UNITY_INSTANCING_BUFFER_START(Props) UNITY_DEFINE_INSTANCED_PROP(float4, _Color) UNITY_INSTANCING_BUFFER_END(Props)
-
-
-
-
-
using UnityEngine; public class MeshCombineTest : MonoBehaviour { public MeshFilter[] meshFilters; void Start() { if (meshFilters == null || meshFilters.Length == 0) return; // 1. 创建 CombineInstance 数组 CombineInstance[] combines = new CombineInstance[meshFilters.Length]; for (int i = 0; i < meshFilters.Length; i++) { combines[i].mesh = meshFilters[i].sharedMesh; // 关键修改:使用 localToWorldMatrix 保留位置/旋转/缩放 combines[i].transform = meshFilters[i].transform.localToWorldMatrix; // 2. 禁用原始 MeshRenderer(避免重复渲染) MeshRenderer renderer = meshFilters[i].GetComponent<MeshRenderer>(); if (renderer != null) renderer.enabled = false; } // 3. 创建合并后的 Mesh Mesh combinedMesh = new Mesh(); combinedMesh.CombineMeshes(combines); // 合并所有 Mesh // 4. 赋值给当前 GameObject MeshFilter myFilter = GetComponent<MeshFilter>(); if (myFilter == null) myFilter = gameObject.AddComponent<MeshFilter>(); myFilter.mesh = combinedMesh; // 5. 确保有 Renderer 并复制第一个材质(简单处理) MeshRenderer myRenderer = GetComponent<MeshRenderer>(); if (myRenderer == null) myRenderer = gameObject.AddComponent<MeshRenderer>(); if (meshFilters.Length > 0 && meshFilters[0].GetComponent<MeshRenderer>() != null) { myRenderer.material = meshFilters[0].GetComponent<MeshRenderer>().sharedMaterial; } } }
-
public class UICanvasRenderer : MonoBehaviour { private CanvasRenderer canvasRenderer; void Start() { canvasRenderer = GetComponent<CanvasRenderer>(); canvasRenderer.sortingOrder = 1; } } public class UIMask : MonoBehaviour { public RectTransform maskRect; void Start() { Mask mask = gameObject.AddComponent<Mask>(); mask.showMaskGraphic = false; mask.rectTransform = maskRect; } }
-
原创2025年5月26日...大约 27 分钟