Material.SetXXX和SetPropertyBlock (MaterialPropertyBlock)

在Unity中,SpriteRenderer.SetPropertyBlock 和 Material.SetXXX都用于修改材质属性,但它们在实现机制和性能影响上有本质区别。以下是关键对比:

1:Material.SetColor

    // 直接修改材质实例

spriteRenderer.material.SetColor("_Color", newColor);

内存影响

⚠️ 每次调用 .material 都会创建新的材质实例(如果首次使用),导致内存中生成相同材质的多个副本。

性能影响

❌ 破坏合批:每个材质实例会被视为不同材质,导致 Draw Call 增加,降低渲染性能。

共享性

❌ 修改仅影响当前渲染器,其他使用相同材质的对象不受影响(因为创建了新实例)。

2. SetPropertyBlock (MaterialPropertyBlock)

// 使用属性块修改

MaterialPropertyBlock propBlock = new MaterialPropertyBlock();

spriteRenderer.GetPropertyBlock(propBlock); // 获取当前属性

propBlock.SetColor("_Color", newColor);

spriteRenderer.SetPropertyBlock(propBlock);

内存影响

✅ 零内存分配:不创建新材质实例,仅存储属性值(轻量级)。

性能影响

✅ 保持合批:所有使用相同材质的对象仍可被合批(如GPU Instancing),维持高性能渲染。

共享性

✅ 修改仅作用于当前渲染器,其他对象不受影响(无需创建独立材质)。



💡 使用场景建议:

1.Material.SetColor

适用于静态对象不频繁修改的属性

需要修改材质其他复杂属性(如Shader类型)时

2.SetPropertyBlock

强烈推荐用于动态对象(如游戏角色、特效)

需要高频修改属性(每帧更新颜色/透明度)

优化大量相同材质对象的渲染(如血条、同类型敌人)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容