Unity 프레임 로딩

목차

이론

코드 부분

효과 데모


이론

Unity의 프레임별 로딩(프로그레시브 로딩이라고도 함)은 리소스를 작은 덩어리로 나누고 프레임별로 로드하여 게임 성능과 사용자 경험을 향상시키는 최적화 기술입니다. 다음은 프레임 로딩의 몇 가지 장점입니다.

  1. 게임 로딩 속도 향상: 자산을 작은 덩어리로 로드하면 현재 프레임에 필요한 자산 부분만 로드되기 때문에 로드 시간을 줄일 수 있습니다. 이는 대규모 게임이나 리소스 집약적인 장면에 특히 유용하며, 초기 로드 시간을 줄이고 플레이어를 게임에 더 빠르게 끌어들입니다.

  2. 메모리 공간 감소: 프레임에 리소스를 로드하면 각 프레임에 필요한 메모리 공간을 줄일 수 있습니다. 현재 프레임에 필요한 리소스만 로드하면 모든 리소스를 한 번에 메모리에 로드하지 않아도 되므로 메모리 사용량을 줄일 수 있습니다. 이는 메모리가 제한된 장치나 대용량 게임의 경우 매우 중요합니다.

  3. 게임 유창성 향상: 프레임 단위로 로드하면 프레임 속도가 떨어질 때 명백한 끊김 현상을 방지할 수 있습니다. 한 번에 모든 리소스를 로드하는 것과 비교하여 프레임별 로드는 백그라운드에서 리소스를 원활하게 로드할 수 있으며 프레임 속도의 속도에 따라 적절한 로드를 수행할 수 있습니다. 이렇게 하면 리소스를 로드하는 동안에도 게임이 원활하게 실행됩니다.

  4. 게임 세계의 원활한 연결 향상: 프레임별 로딩은 다양한 장면 또는 레벨의 원활한 연결을 실현할 수 있습니다. 장면이나 레벨이 로드되면 게임은 다음 장면이나 레벨을 원활하게 로드할 수 있어 플레이어가 게임 세계의 연속성을 느낄 수 있습니다.

  5. 게임 적응성 향상: 프레임에 로드하면 게임이 장치의 성능 및 리소스 조건에 따라 로딩 전략에 자동으로 적응할 수 있습니다. 이는 게임이 고사양 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);
        });
    }
}

 

 효과 데모

 

 

추천

출처blog.csdn.net/q1295006114/article/details/131583959