赞
踩
对象池:
public class BulletPool : MonoBehaviour { private Queue<Bullet> availableBullets = new Queue<Bullet>(); public void GetBullet(out Bullet bullet) { if (availableBullets.Count > 0) { bullet = availableBullets.Dequeue(); bullet.gameObject.SetActive(true); } else { bullet = Instantiate(bulletPrefab); } } public void ReturnBullet(Bullet bullet) { bullet.gameObject.SetActive(false); availableBullets.Enqueue(bullet); } } // 在使用时: Bullet bullet; bulletPool.GetBullet(out bullet); // 使用完后: bulletPool.ReturnBullet(bullet);
字符串操作优化:
StringBuilder
类进行动态字符串构建。// 非优化版本
string result = "";
for (int i = 0; i < 1000; i++)
{
result += "Value: " + i.ToString(); // 每次循环都会创建新的字符串对象
}
// 优化版本
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
sb.Append("Value: ").Append(i); // 使用StringBuilder避免每次循环都创建新字符串
}
string result = sb.ToString();
避免大型结构体数组的临时创建:
// 非优化版本 Vector3[] normals = mesh.normals; // 每次访问可能重新分配数组 // 优化版本 private Vector3[] cachedNormals; void Awake() { cachedNormals = mesh.normals; } void SomeMethodRequiringNormals() { // 使用缓存的数组 foreach (var normal in cachedNormals) { // ... } }
预初始化集合大小:
// 非优化版本
List<int> list = new List<int>();
for (int i = 0; i < 10000; i++)
{
list.Add(i); // 可能多次自动扩容
}
// 优化版本
List<int> optimizedList = new List<int>(10000);
for (int i = 0; i < 10000; i++)
{
optimizedList.Add(i); // 不会发生自动扩容
}
重用单例和静态变量:
// 单例示例 public sealed class GameManager : MonoBehaviour { private static GameManager _instance; public static GameManager Instance { get { return _instance ?? (_instance = FindObjectOfType<GameManager>()); } } private readonly Dictionary<string, GameObject> prefabCache = new Dictionary<string, GameObject>(); void Awake() { if (_instance != null && _instance != this) { Destroy(gameObject); return; } _instance = this; // 预加载并缓存prefabs,防止运行时反复加载资源导致GC foreach (var prefabPath in prefabNames) { var prefab = Resources.Load<GameObject>(prefabPath); prefabCache[prefabPath] = prefab; } } public GameObject GetCachedPrefab(string path) { return prefabCache.TryGetValue(path, out var prefab) ? prefab : null; } }
通过上述实例可以看出,Unity中的GC优化主要围绕着减少临时对象的创建、有效利用已存在的对象和结构以及合理管理内存分配来进行。同时,在编写代码时应遵循内存安全编程的原则,注意引用类型与值类型的合理使用,以及避免使用可能导致装箱操作的API。
python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(41-50)
————————————————
最后我们放松一下眼睛
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。