避免创建重复的对象

避免创建重复的对象,如果一个对象是不可变的,那么它总是可一被重用 

书中的例子:

String s=new String("silly");//这个为什么不好?该语句每次被执行的时候都创建一个新的String实例.

String s="silly"; //只使用一个String实例

今年年初,项目组在进行项目优化的时候,遇到过类似的代码,当时问了下为什么第一种不好,大家只是说不好,并没有说出原因.而现在,终于在书中找到了答案.

所以对于同时提供静态工厂方法和构造函数的非可变类,通常可以利用静态工厂方法而不是构造函数,以避免创建重复的对象.如:Boolean.valueOf(String)优先于Boolean(String) .也就是如果有别的方法可以创建对象的话,应该尽量避免去new 一个对象.

除了重用非可变的对象之外,对于那些已知不会被修改的可变对象,也可一重用他们.(例子见书上.)

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Unity中,可以使用对象池来重复使用游戏对象,从而避免频繁地创建和销毁对象,提高游戏性能。下面是一个简单的示例代码,展示如何在Unity中创建一个游戏对象池: 首先,在场景中创建一个空对象,并将其命名为“ObjectPool”。 然后,编写一个名为“ObjectPoolManager”的脚本,并将其添加到“ObjectPool”对象上。该脚本将用于管理游戏对象池。 ```csharp using UnityEngine; using System.Collections.Generic; public class ObjectPoolManager : MonoBehaviour { public GameObject prefab; public int poolSize = 10; private List<GameObject> pool; void Start () { pool = new List<GameObject>(); for (int i = 0; i < poolSize; i++) { GameObject obj = (GameObject) Instantiate(prefab); obj.SetActive(false); pool.Add(obj); } } public GameObject GetObject() { foreach (GameObject obj in pool) { if (!obj.activeInHierarchy) { obj.SetActive(true); return obj; } } GameObject newObj = (GameObject) Instantiate(prefab); pool.Add(newObj); return newObj; } public void ReleaseObject(GameObject obj) { obj.SetActive(false); } } ``` 在此脚本中,我们首先声明了一个名为“prefab”的公共游戏对象。这是我们要重复使用的对象的原型。 然后,我们声明了一个名为“poolSize”的公共整数,表示我们要创建对象池的大小。 在“Start”方法中,我们创建了一个名为“pool”的列表,并使用“Instantiate”方法创建了一组游戏对象,并将其添加到池中。我们将这些对象的“SetActive”方法设置为false,以便它们最初处于非活动状态。 在“GetObject”方法中,我们遍历游戏对象池中的所有对象,查找当前处于非活动状态的对象,并将其设置为活动状态。如果没有找到可用对象,则使用“Instantiate”方法创建一个新对象,并将其添加到池中。 在“ReleaseObject”方法中,我们将游戏对象的“SetActive”方法设置为false,这样它就会回到对象池中,等待下一次重复使用。 最后,在场景中创建一个需要使用对象池的游戏对象,并创建一个名为“ObjectPoolBehavior”的脚本,并将其添加到该对象上。在此脚本中,我们将使用“ObjectPoolManager”脚本中的“GetObject”方法获取游戏对象,并使用“ObjectPoolManager”脚本中的“ReleaseObject”方法将游戏对象返回到对象池中。 ```csharp using UnityEngine; public class ObjectPoolBehavior : MonoBehaviour { private ObjectPoolManager objectPool; void Start () { objectPool = GameObject.Find("ObjectPool").GetComponent<ObjectPoolManager>(); } void Update () { if (Input.GetKeyDown(KeyCode.Space)) { GameObject obj = objectPool.GetObject(); obj.transform.position = transform.position; } } void OnTriggerEnter(Collider other) { objectPool.ReleaseObject(gameObject); } } ``` 在此示例中,我们在按下空格键时获取游戏对象,并将其放置在当前对象的位置。当游戏对象与其他对象发生碰撞时,我们将其返回到对象池中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值