尽可能使用对象池:
在unity中,内存的分配和内存消耗都会程序带来影响,以及每次C#对实例对象的垃圾回收都很吃力,会占用大量的CPU算力,因此我们才需要尽可能的使用对象池将暂时不适用的对“存放起来”,待到再次使用的时候直接拿出来,而省去实例化的操作”
ps:
减少内存的分配除了使用对象池外,还可以在对象池上使用预加载来优化,在程序运行前让对象池中的对象分配的多一些,这样在需要实例对象的时候就不在需要临时分配内存了。同时!此方法也可以拓展到资源内存,类实例对象有对象池,资源也可以有对象池,在核心程序运行前,如果能够提前知道后面的加载的内容,那么就提前将资源内容加载到内存就可以减少让内存分配的次数,甚至完全避免临时的加载和分配。
例如:统计每个角色图样的资源和实例对象在下一个场景中数量并提前加载,或者接近某个出口或者出口的时候开始预测即将进入的场景内容等
实现思路:
- 使用queue先入先出的特点(使用stack也可以)存放同一种实例对象
- 以相同对象的name为key,queue<实例对象>为value 生命字典作为对象池
- 实现基本的三个方法:入池,取出和清除
公共函数
| 函数名 | 解释 |
|---|---|
| GetObj(GameObject) | 从对象池中得到一个游戏对象,如果池中不存在就会创建一个 |
| PushAllChildren(GameObject) | 将传入物体的子物体全部放入对象池 |
| PushObj(GameObject) | 将游戏对象放入对象池 |
实现:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//对象池
public class ObjectPool {
//存放所有池中物体的父对象
private GameObject poolPos = GameObject.Find("ObjectPool");
private static ObjectPool instance;
public static ObjectPool Instance {
get {
if (instance == null) instance

文章介绍了在Unity中如何通过使用对象池来优化内存分配和垃圾回收,减少CPU开销。通过预先加载和存储实例对象,可以避免运行时频繁的内存分配。对象池的实现包括入池、取出和清除等操作,使用Dictionary和Queue数据结构进行管理。文章还提供了具体的实现代码示例以及如何在实际项目中应用对象池进行内存优化。
最低0.47元/天 解锁文章
2141

被折叠的 条评论
为什么被折叠?



