游戏的加载类要点和框架
2014-06-22 21:02
337 查看
不管是端游,页游还是手游,加载类都是底层重要的一个基本功能,其原理大体都是一样,只不过用不同的语言C++,Flash,C#等分别实现而已。这段时间研读了各种游戏底层,提炼出一些加载类的共性。由于加载类考虑点较多,容易遗忘。不想遗忘,也不想被人遗忘,不想像op742《我会永远陪在你身边》里的居鲁士一样,中了童乐魔咒,被家人遗忘。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/27/41b6cf72dd39f62f6df540d4256fe2c4)
事实上,大多数时候都会遗忘,也会被人遗忘。。。
题外话了。作为备忘,本文记录一个比较成熟的加载类框架和其要点。
考虑线上情况,一般游戏的加载类需要包括以下几点需求:
1. 并行加载(2-3个)
2. 重复的url
3. 加密解密
4. fail重试
5. 优先级
6. 预加载
架构上用三个类划分,IzLoader(封装一个基本的加载项,记录加载地址,失败重试次数,优先级,版本号,加载成功回调函数,加载失败回调函数,加载过程中的回调函数)。IzLoaderPipeLine(待加载的流水线,保存IzLoader队列,管理队列中的IzLoader优先级,重排队列,并实现下载完毕后的销毁工作)。IzLoaderTread(挂载在GameObject,用Update每帧检查IzLoaderPipeLine里面有没有待加载的Loader项,有则用www方式加载)。
IzLoader类如下
IzLoaderPipeLine如下
IzLoderTread类
总结,这是一个比较轻量的加载框架,基于U3D,没有实现加密解密过程,但是能满足一般的需求了。
事实上,大多数时候都会遗忘,也会被人遗忘。。。
题外话了。作为备忘,本文记录一个比较成熟的加载类框架和其要点。
考虑线上情况,一般游戏的加载类需要包括以下几点需求:
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,没有实现加密解密过程,但是能满足一般的需求了。
相关文章推荐
- android游戏开发框架libgdx的使用(二十)—资源预加载与AssetManager的使用
- android游戏开发框架libgdx的使用(二十)—资源预加载与AssetManager的使用
- android游戏开发框架libgdx的使用(十八)—资源加载管理AssetManager的使用
- 2.自己总结的游戏框架小到中型游戏适用——从swf加载素材资源
- 手机网络游戏框架体系要点分析
- 游戏框架设计Ⅰ—— 游戏中的事件机制
- J2ME 2D小游戏入门之旅(一)游戏的框架
- 一个使用面向对象方式编写的简单游戏框架
- 游戏框架,com原理
- Visual C#编写3D游戏框架示例(转)
- 用DirectDraw实现射击游戏技术要点
- 我的游戏引擎设计——“SI引擎草案(一)原理和框架”
- 自己动手写游戏引擎一(Windows窗口框架)
- 游戏中如何加载人物,场景模型
- XNA--垮平台游戏开发框架
- 框架动态加载(背忘录)
- 基于Nokia平台的游戏通用框架
- 游戏框架随想,Effect的抽象
- 在MDI主框架窗口中添加位图(在视中加载位图)
- 为公司做的基本游戏框架