Unity游戏性能优化 MaterialPropertyBlock
1.概念
顾名思义,就是保存材质属性的块,相当于将其抽象为一个大型机械上的可拔插的零件,这样就不需要在每次调用时都得换一个机械了,减少内存占用。
2.对比
2.1 Material(Instance)
每一个Material都是一个实例,当我们需要在新的Mesh上使用这个Material时,就会从原先的Material中复制一份出来。这样对内存来说就比较不友好了
2.2 SharedMaterial
与上面的实例相反,SharedMaterial就是没有实例,全局仅此一份
2.3 MaterialPropertyBlock
如果我又想优化内存,又想每个都很有个性,黑的红的黄的紫的怎么办,这个时候就需要使用MaterialPropertyBlock了
3.使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine.UI;
using UnityEngine;
public class UIShaderParamsSetter : MonoBehaviour
{
public Material TargetMaterial;
Renderer render;
private int seedId;
private MaterialPropertyBlock prop;
[Range(0.01f,1)]
public float _seed;
private void Start()
{
seedId = Shader.PropertyToID("_Seed");
prop = new MaterialPropertyBlock();
render = gameObject.GetComponent<SpriteRenderer>();
render.GetPropertyBlock(prop);
}
private void Update()
{
prop.SetFloat("_Seed", _seed);
render.SetPropertyBlock(prop);
}
}
3.1 MeshRenderer
3D使用MeshRender
3.2 SpriteRenderer
2D使用SpriteRenderer,最近在使用2D的,但是会和UGUI出现了一些层级问题