您的位置:首页 > 其它

游戏的加载类要点和框架

2014-06-22 21:02 337 查看
不管是端游,页游还是手游,加载类都是底层重要的一个基本功能,其原理大体都是一样,只不过用不同的语言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,没有实现加密解密过程,但是能满足一般的需求了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  U3D 加载框架