游戏的加载类要点和框架

游戏加载类在游戏开发中扮演重要角色,无论是端游、页游还是手游。本文探讨了不同语言如C++, Flash, C#实现的加载原理,并提出一个成熟加载类框架的共性需求,包括并行加载、URL复用、加密解密、失败重试、优先级管理和预加载等。文章介绍了由IzLoader、IzLoaderPipeLine和IzLoaderThread三个类组成的加载框架,用于管理加载项、处理优先级和执行实际下载任务。" 85341730,7846711,解决0xc0150002错误:VC++运行库缺失,"['C++', '程序错误', '依赖解决', 'VC++运行库']

不管是端游,页游还是手游,加载类都是底层重要的一个基本功能,其原理大体都是一样,只不过用不同的语言C++,Flash,C#等分别实现而已。这段时间研读了各种游戏底层,提炼出一些加载类的共性。由于加载类考虑点较多,容易遗忘。不想遗忘,也不想被人遗忘,不想像op742《我会永远陪在你身边》里的居鲁士一样,中了童乐魔咒,被家人遗忘。


事实上,大多数时候都会遗忘,也会被人遗忘。。。

题外话了。作为备忘,本文记录一个比较成熟的加载类框架和其要点。

考虑线上情况,一般游戏的加载类需要包括以下几点需求:

1.  并行加载(2-3个)
2.  重复的url
3.  加密解密
4.  fail重试
5.  优先级
6.  预加载

架构上用三个类划分,IzLoader(封装一个基本的加载项,记录加载地址,失败重试次数,优先级,版本号,加载成功回调函数,加载失败回调函数,加载过程中的回调函数)。IzLoaderPipeLine(待加载的流水线,保存IzLoader队列,管理队列中的IzLoader优先级,重排队列,并实现下载完毕后的销毁工作)。IzLoaderTread(挂载在GameObject,用Update每帧检查IzLoaderPipeLine里面有没有待加载的Loader项,有则用www方式加载)。

IzLoader类如下

using UnityEngine;
using System.Collections.Generic;
using System.Text;

// 异步加载,内部用 WWW 加载
public class IzLoader
{
    public static int ms_iRetryCount = 3;       // 失败重试次数
    public WWW m_kWWW;  //U3D的www类,其他语言用其他的加载类
    public string m_strURL;//加载地址
    public int m_iPriority;//优先级
    public int m_iVersion;//版本号

    public int m_iRetryCount; //重试次数

    protected List<FINISH_CALLBACK_INFO> m_listFinish;  //成功回调函数队列
    protected List<FAILED_CALLBACK_INFO> m_listFailed;// 失败回调函数队列
    protected List<PROCESS_CALLBACK_INFO> m_listProcess;  //过程处理函数队列
   
    public IzLoader()
    {
        m_iRetryCount = 0;
    }

    public void AddFinishCallback()
    {
        //添加成功下载回调函数
    }

    public bool RemoveFinishCallback()
    {
        //移除成功下载回调函数
    }

    public void AddFailedCallback()
    {
        //添加失败下载回调函数
    }

    public bool RemoveFailedCallback()
    {
        //移除失败下载回调函数
    }

    public void RemoveAllFailedCallback()
    {
        //移除所有失败下载回调函数
    }

    public void AddProcessCallback()
    {
        //添加下载中回调函数
    }

    public bool RemoveProcessCallback()
    {
        //移除下载中回调函数
    }

    public void RemoveAllProcessCallback()
    {
        //移除下载中所有的回调函数
    }

    public void RemoveAllCallbacks()
    {
        //移除所有回调函数
    }

    public void Load( string strURL, int iPriority = 0, int iVersion = 0 )
    {
        m_strURL = strURL;
        m_iPriority = iPriority;
        m_iVersion = iVersion;

        IzLoadPipeline.ms_kSig.AddItem(this);
    }  
}

IzLoaderPipeLine如下

using UnityEngine;
using System.Collections.Generic;

public class IzLoadPipeline
{
    public static IzLoadPipeline ms_kSig;//单例

    private List<IzLoader> m_listLrd;//加载loader项队列
    private int m_iParallelLoadCount;//并行加载数量
    private int m_iLoadingCount;//正在下载项数量

    public IzLoadPipeline()
    {
        if (ms_kSig != null)
        {
            Debug.LogError("IzLoadPipeline is a singlon!");
            return;
        }
        ms_kSig = this;
        m_listLrd = new List<IzLoader>();
        m_iParallelLoadCount = 2;
        m_iLoadingCount = 0;
    }

    public void SetParallelLoadCount(int iCount)
    {
        //设置并行加载数量
    }

    public void AddItem( IzLoader kLrd )
    {
        //添加一个IzLoader,优先级调整队列顺序
    }

    public void Update()
    {
        /*
         * 检查是正在加载数是否大于最大值
         * 小于最大值则从下载队列中取出最优一项
         * 添加OnLoadFinish,OnLoadFailed作为成功和失败的回调函数,用语去掉加载项自身的回调函数,并实现失败重传
        */
    }

    private void OnLoadFinish(IzLoader kLrd )
    {
        //移除loader的成功和失败回调函数
    }

    private void OnLoadFailed(IzLoader kLrd )
    {
        //如果重试次数小于最大值,则重新加入到队列,再试一次
        //如果重试次数大于等于最大值,则放弃,移除所有回调函数
    }
}


IzLoderTread类

using UnityEngine;
using System.Collections.Generic;
using System.Collections;

// 此类用于协程加载
// 注意:此类须置于GameObject上最先初始化
public class IzLoadThread : MonoBehaviour
{
    public static IzLoadThread ms_kSig;

    private const float ms_fLoadPercentCheck = 0.05f;

    void Awake()
    {
        if (ms_kSig != null)
        {
            Debug.LogError("IzLoadThread is a singlon!");
            return;
        }
        ms_kSig = this;

        new IzLoadPipeline();
    }
    //调用协程加载
    public void BeginLoad(IzLoader kLrd)
    {
        StartCoroutine("OnRealLoad", kLrd);
    }

    private IEnumerator OnRealLoad(object kArg)
    {
        //www初始化

        //www处理过程中
        while (!www.isDone)
        {
            //执行IzLoader的处理过程中的回调函数
            yield return 1;
        }

        //成功加载
        if (string.IsNullOrEmpty(www.error))
        {
            //执行IzLoader的成功回调函数
        }
        //失败加载
        else
        {
            //之行IzLoader的失败回调函数       
        }
    }
    //每帧到IzLoadPipeline加载队列中抽出可行的加载项加载
	void Update ()
    {
        IzLoadPipeline.ms_kSig.Update();	
	}    
}

总结,这是一个比较轻量的加载框架,基于U3D,没有实现加密解密过程,但是能满足一般的需求了。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值