不管是端游,页游还是手游,加载类都是底层重要的一个基本功能,其原理大体都是一样,只不过用不同的语言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 )
{
//如果重试次数小于最大值,则重新加入到队列,再试一次
//如果重试次数大于等于最大值,则放弃,移除所有回调函数
}
}
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,没有实现加密解密过程,但是能满足一般的需求了。
游戏加载类在游戏开发中扮演重要角色,无论是端游、页游还是手游。本文探讨了不同语言如C++, Flash, C#实现的加载原理,并提出一个成熟加载类框架的共性需求,包括并行加载、URL复用、加密解密、失败重试、优先级管理和预加载等。文章介绍了由IzLoader、IzLoaderPipeLine和IzLoaderThread三个类组成的加载框架,用于管理加载项、处理优先级和执行实际下载任务。"
85341730,7846711,解决0xc0150002错误:VC++运行库缺失,"['C++', '程序错误', '依赖解决', 'VC++运行库']
2014

被折叠的 条评论
为什么被折叠?



