一、背景
游戏的卡顿是一个老问题,是由很多很多方面的问题导致,那么这篇文章说的就是关于游戏中一个Asset大小的问题;
在加载一个Assett的过程中,不知道看官你有没有考虑过一个资源的大小对加载过程是否会有影响?不用想,肯定是考虑过,大的资源肯定比小的资源耗时间;
那么有没有考虑过把一个大的资源拆分成小的几个资源以后,它们的加载时间问题呢?这就是这节的内容;
二、实践
把一个大物体拆分成三份:
左边的A、B、C是右边的3个组成部分;
这个时候分别对左边的进行加载计算总和与右边的加载进行比较会是什么样的结果;
数据截图:
结果就是:整体加载处理的实践要大于分开加载处理的时间
三、视频讲解
四、实践源码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Text;
using UnityEngine.UI;
public class ValakiCreateObjectDemos : MonoBehaviour
{
public Text textMult;
public Text textSingle;
public Text textTips;
List<GameObject> cacheItems = new List<GameObject>();
StringBuilder singleSb = new StringBuilder();
StringBuilder multSb = new StringBuilder();
public void OnClickSingleBtn()
{
List<string> urls = new List<string>() { "GB" };
CreateCubes(urls, singleSb, textSingle);
}
public void OnClickMultBtn()
{
List<string> urls = new List<string>() { "GB_A", "GB_B", "GB_C" };
CreateCubes(urls, multSb, textMult);
}
void CreateCubes(List<string> urls, StringBuilder stringBuilder, Text text)
{
long startTime = GetTimeStamp();
Debug.Log(startTime);
for (int i = 0; i < urls.Count; i++)
{
GameObject go = Resources.Load<GameObject>("Prefabs/" + urls[i]);
go = GameObject.Instantiate(go);
go.SetActive(true);
go.name = urls[i];
cacheItems.Add(go);
if (i == urls.Count - 1)
{
long offset = GetTimeStamp() - startTime;
stringBuilder.Append("\n耗费时间:");
stringBuilder.Append(offset);
stringBuilder.Append("ms");
stringBuilder.Append("\n");
text.text = stringBuilder.ToString();
textTips.text = "数据载入内存完成";
}
}
}
public long GetTimeStamp()
{
return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000;
}
public void OnClickMemoryBtn()
{
int len = cacheItems.Count;
for (int i = len - 1; i >= 0; i--)
{
Destroy(cacheItems[i]);
}
Resources.UnloadUnusedAssets();
System.GC.Collect();
textTips.text = "内存数据释放完成";
}
public void OnClickClearShowContext()
{
singleSb.Clear();
multSb.Clear();
textSingle.text = "";
textMult.text = "";
textTips.text = "";
}
}
结语
路太长、夜未央【valaki】