목차
이론
Unity의 프레임별 로딩(프로그레시브 로딩이라고도 함)은 리소스를 작은 덩어리로 나누고 프레임별로 로드하여 게임 성능과 사용자 경험을 향상시키는 최적화 기술입니다. 다음은 프레임 로딩의 몇 가지 장점입니다.
-
게임 로딩 속도 향상: 자산을 작은 덩어리로 로드하면 현재 프레임에 필요한 자산 부분만 로드되기 때문에 로드 시간을 줄일 수 있습니다. 이는 대규모 게임이나 리소스 집약적인 장면에 특히 유용하며, 초기 로드 시간을 줄이고 플레이어를 게임에 더 빠르게 끌어들입니다.
-
메모리 공간 감소: 프레임에 리소스를 로드하면 각 프레임에 필요한 메모리 공간을 줄일 수 있습니다. 현재 프레임에 필요한 리소스만 로드하면 모든 리소스를 한 번에 메모리에 로드하지 않아도 되므로 메모리 사용량을 줄일 수 있습니다. 이는 메모리가 제한된 장치나 대용량 게임의 경우 매우 중요합니다.
-
게임 유창성 향상: 프레임 단위로 로드하면 프레임 속도가 떨어질 때 명백한 끊김 현상을 방지할 수 있습니다. 한 번에 모든 리소스를 로드하는 것과 비교하여 프레임별 로드는 백그라운드에서 리소스를 원활하게 로드할 수 있으며 프레임 속도의 속도에 따라 적절한 로드를 수행할 수 있습니다. 이렇게 하면 리소스를 로드하는 동안에도 게임이 원활하게 실행됩니다.
-
게임 세계의 원활한 연결 향상: 프레임별 로딩은 다양한 장면 또는 레벨의 원활한 연결을 실현할 수 있습니다. 장면이나 레벨이 로드되면 게임은 다음 장면이나 레벨을 원활하게 로드할 수 있어 플레이어가 게임 세계의 연속성을 느낄 수 있습니다.
-
게임 적응성 향상: 프레임에 로드하면 게임이 장치의 성능 및 리소스 조건에 따라 로딩 전략에 자동으로 적응할 수 있습니다. 이는 게임이 고사양 PC든 저사양 모바일이든 다양한 기기에서 좋은 사용자 경험을 제공할 수 있음을 의미합니다.
대체로 Unity의 프레임별 로딩은 게임의 로딩 속도를 개선하고, 메모리 사용량을 줄이고, 유창함을 개선하고, 원활한 연결을 달성하고, 게임의 적응성을 향상시킬 수 있습니다. 이것은 게임 성능과 사용자 경험을 향상시키는 강력한 최적화 기술입니다.
코드 부분
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CilpFPS : MonoBehaviour
{
//协程id
private int id;
//协程字典
Dictionary<int, Coroutine> dic=new Dictionary<int, Coroutine>();
public void AddFPS<T>(List<T> list,int num,Action<T> action)
{
int name = id++;
Coroutine coroutine =StartCoroutine(GetFromInfoList(name,list,num,action));
dic.Add(name, coroutine);
}
/// <summary>
/// 添加分帧
/// </summary>
/// <param name="max">分帧加载的总数量<</param>
/// <param name="num">一帧调用的帧的数量</param>
/// <param name="action">具体做什么</param>
public void AddFPS(int max,int num,Action<int> action)
{
int name = id++;
Coroutine coroutine =StartCoroutine(GetFromInfoList(name,max,num,action));
dic.Add(name, coroutine);
}
/// <summary>
/// 开始分帧加载
/// </summary>
/// <param name="name">协程名称</param>
/// <param name="max">分帧加载的总数量</param>
/// <param name="num">一帧调用的帧的数量</param>
/// <param name="action">具体做什么</param>
/// <returns></returns>
IEnumerator GetFromInfoList<T>(int name, List<T> list, int num, Action<T> action)
{
int InfoListIndex = 0;
foreach (T item in list)
{
InfoListIndex++;
action(item);
if (InfoListIndex % num == 0)
{
yield return null; // 在下一帧执行
}
}
StopFPS(name);
}
/// <summary>
/// 开始分帧加载
/// </summary>
/// <param name="name">协程名称</param>
/// <param name="max">分帧加载的总数量</param>
/// <param name="num">一帧调用的帧的数量</param>
/// <param name="action">具体做什么</param>
/// <returns></returns>
IEnumerator GetFromInfoList(int name, int max, int num, Action<int> action)
{
for (int i = 0; i < max; i++)
{
action(i);
if(i% num == 0)
{
//每一帧提取5条数据
Debug.Log("运行时间:"+Time.time + ",创建次数:" + (i+1));
yield return null; // 在下一帧执行
}
}
StopFPS(name);
}
/// <summary>
/// 移除协程
/// </summary>
/// <param name="name"></param>
private void StopFPS(int name)
{
if(dic.ContainsKey(name))
{
StopCoroutine(dic[name]);
dic.Remove(name);
}
}
}
호출 코드
using UnityEngine;
public class CreateFps : MonoBehaviour
{
public GameObject game;
public CilpFPS cilpFPS;
void Start()
{
cilpFPS.AddFPS(20,1, (i) =>
{
GameObject game1=Instantiate(game,transform);
game1.transform.position=new Vector3(i,0,i);
});
}
}
효과 데모