今天聊一下Jtro的优化技术分享(不定时更新)

游戏大量删除物体时的优化

比如有割草游戏,当玩家在场景中怪物最多的地方释放一个AOE技能,范围内的怪物全部死掉,这时候就需要把这些怪物删除
如果玩家不听的在施放技能,而怪物刷新又比较快的情况下,大约会有2种办法
第一种是写对象池,

第二种是直接销毁怪物
如果真的采用这种
加入频繁的销毁怪物的话,势必造成手机的计算压力,所以我们可以尝试不在技能施放完毕后立即销毁,而是分为几个阶段销毁,打个比方,如果玩家一个技能造成了20个怪物的死亡,而我们则不需要在玩家玩家释放完技能的这一帧中销毁怪物.而是可以尝试在第一帧中销毁1-3个,第二帧销毁1-3个一直到销毁完毕.
代码示意如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class jxyh : MonoBehaviour
{
    public List<GameObject> list;
    // Start is called before the first frame update
    void Start()
    {
        list = new List<GameObject>();
        for (int i = 0; i < 20; i++)
        {
           GameObject obj= GameObject.CreatePrimitive(PrimitiveType.Cube);
            obj.transform.position = new Vector3(i+0.5f, 0, i+0.5f);
            list.Add(obj);
        }
        StartCoroutine(DestoryEnermy(list));
    }

    IEnumerator DestoryEnermy(List<GameObject> ts)
    {
        int listLenth = ts.Count;
        Debug.Log(listLenth);
        while (ts .Count !=0)
        {
            yield return new WaitForFixedUpdate(); 
            Destroy( ts[listLenth-1]);
            list.RemoveAt(listLenth-1);
            listLenth--;
        }
    }
}

频繁的更改字符串的优化

如果是需要频繁的修改string类型的字符串,那么对于这样的需求,我们在测试的时候发现,频繁修改string类型的字符串会消耗大量的资源,因为程序在一直执行着装箱和拆箱操作.如果换成stringBuild类型,那么将会大大减少性能消耗

StringBuilder sb =new  StringBuilder("字符");

StringBuilder是可变长度的,其首先在内存中分配固定的长度,当进行频繁的插入和连接操作时,超出了内存中分配的长度会自动进行扩充,从而有效的节约了内存空间和减少了生成对象的时间。

正文完