【优化】Unity游戏加载卡顿原因之一:冗余组件的挂载问题

  • Post author:
  • Post category:其他




游戏加载卡顿这个问题严重吗?



一、背景

在游戏开发中游戏的卡顿不是某个单一的问题导致,是由诸多问题的量变在一起导致的;可能是资源层面的,也可能是逻辑层面的,也可能是网络层面的…;我这里要说的是Unity的中组件的挂载问题,当然这里的组件是指不必要的组件;



二、组件挂载问题

一个不必要的组件在GameObject上存在3种情况:

  1. 直接移除,没有挂载这个组建
  2. 挂载了这个组建,但是没有启用
  3. 挂起了,并启用了

如果数据到达一定的量,你就会得到下面的这张数据实践图:

在这里插入图片描述

这就是实际的测试数据;这里只是测试加载、实例化的问题;



三、如何解决

  1. 如果不是需要的组建一定要删除
  2. 如果组建加载的时候不直接使用,而是在特定的时刻使用,建议不需要直接启用;在需要的时候启用也可;



四、视频详细地址


视频讲解地址



五、测试代码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Text;


public class ValakiCreateObjDemos : MonoBehaviour
{

    [SerializeField] Text noBoxColliderText;
    [SerializeField] Text noEnabledBoxColliderText;
    [SerializeField] Text enableBoxColliderText;


    [SerializeField] GameObject noBoxColliderItem;
    [SerializeField] GameObject noEnabledBoxCollider;
    [SerializeField] GameObject enabledBoxCollider;


    StringBuilder noBoxColliderSB = new StringBuilder("无BoxCollider\n");
    StringBuilder noEnableBoxColliderSB = new StringBuilder("不启用BoxCollider\n");
    StringBuilder enabledBoxColliderSB = new StringBuilder("启用BoxCollider\n"); 


    [SerializeField] int times;

    

    public void OnClickCreateCubeNoBoxColliderBtn()
    {
        CreateCubes(noBoxColliderItem, noBoxColliderSB, noBoxColliderText);
    }


    public void OnClickCreateCubeNoEnableBoxColliderBtn()
    {
        CreateCubes(noEnabledBoxCollider, noEnableBoxColliderSB, noEnabledBoxColliderText);
    }


    public void OnClickCreateCubeEnabledBoxColliderBtn()
    {
        CreateCubes(enabledBoxCollider, enabledBoxColliderSB, enableBoxColliderText);
    }


    void CreateCubes(GameObject item, StringBuilder stringBuilder, Text text)
    {
        long startTime = GetTimeStamp();
        Debug.Log(startTime);
        for (int i = 1; i <= times; i++)
        {
            GameObject go = GameObject.Instantiate(item);
            go.name = i.ToString();
            if (i == times)
            {
                long offset = GetTimeStamp() - startTime;
                stringBuilder.Append("\n耗费时间:");
                stringBuilder.Append(offset);
                stringBuilder.Append("ms");
                stringBuilder.Append("\n");
                text.text = stringBuilder.ToString();
            }
        } 

    }

    public long GetTimeStamp()
    {
     	return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000;
    }

}


结语:


希望居家办公早点结束…【

valaki




版权声明:本文为valaki原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。