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);
        });
    }
}

 

 效果演示

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值