Renderer.Material和Renderer.SharedMaterial的区别

xiaoxiao2021-02-28  81

结论

renderer.sharedMaterial意为共享材质,使用了相同材质球的 renderer中的sharedMaterial一致,更改材质属性,相同材质的实体的材质也会被更改;renderer.material是自己的材质,更改材质属性,也只是更改自身的;经过测试,使用 renderer.material进行材质球属性更改,Unity 会生成一份新的material实体,造成内存增加,只有在切换场景或Resources.UnloadUnusedAssets()才会释放,有可能造成内存泄露。想象这样的情形,持续实例化meshRenderer并更改材质球属性,然后释放 meshRenderer,而新生成的材质球实例得不到释放,造成泄露;经过测试,使用 renderer.sharedMaterial 会使得编辑器下material 资源产生setDirty的后遗症,造成编辑模式下的资源更改;

测试

使用 renderer.material接口进行材质球属性更改

使用 renderer.sharedMaterial接口进行材质球属性更改

会使得Editor下material资源被 setDirty,开发时可以考虑一下方式(可以写成扩展方法)

public static Material GetMaterial(Renderer render) { #if UNITY_EDITOR return render.material; #else return render.sharedMaterial; #endif }

测试代码

using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 测试使用 renderer.material和使用renderer.sharedMaterial进行属性设置的区别 /// </summary> public class TestDiffModifyMaterialProperty : MonoBehaviour { public MeshRenderer[] MR; void Start(){ StartCoroutine(TestUse_Material()); } Color RandomColor(){ return new Color(Random.Range(0,1f), Random.Range(0,1f), Random.Range(0,1f)); } /// <summary> /// 使用renderer.material来更改属性 /// </summary> /// <returns>The use material.</returns> IEnumerator TestUse_Material(){ MR[0].material.color = RandomColor(); yield return new WaitForSeconds(2f); MR[1].material.color = RandomColor(); yield return new WaitForSeconds(2f); MR[2].material.color = RandomColor(); } /// <summary> /// 使用renderer.sharedMaterial来更改属性 /// </summary> /// <returns>The use shared material.</returns> IEnumerator TestUse_SharedMaterial(){ MR[0].sharedMaterial.color = RandomColor(); yield return new WaitForSeconds(2f); MR[1].sharedMaterial.color = RandomColor(); yield return new WaitForSeconds(2f); MR[2].sharedMaterial.color = RandomColor(); } }
转载请注明原文地址: https://www.6miu.com/read-66608.html

最新回复(0)