目录
理论
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);
});
}
}
效果演示