走在网页游戏开发的路上(十)

页游资源管理

现在页游的规模越来越来大,游戏内容丰富,资源管理变得很重要。现在一款SNS页游的所有资源可达50MMMO页游更高达几百M,不可能把资源放到一个文件里面、也不可能一次性加载完所有资源。按200kb/s的下载速度来算,50M的资源需要4+分钟,这是绝对不能忍受的事情(更何况大部分人网速比这慢)。

页游资源通常有以下几种格式:图片(jpgpng等)、xml(配置文件)、swf资源、声音文件。通常有以下手段来管理资源,并解决进入游戏慢的问题:

l 配置文件压缩打包

l 资源细化分离,按需加载

l 模块化编程,按模块加载

l 资源缓存

l 资源预加载

l 使用CDN部署资源

1. 配置文件压缩

页游需要10几,20几个配置文件这是很常见的,配置文件现在流行使用xml格式。可以通过压缩软件打包,flash通过二进制方式加载压缩包之后解压使用。这样一方面减少连接请求数另一方减少了流量

2. 资源细化分离,按需加载

分离各类模块和素材(图片、swf文件),方便实现按需加载。整个游戏的资源size很大,但是进入游戏往往并不需要所有的资源。这样我们可以分离各类模块和素材,所有资源通过配置文件管理。整理出进入游戏需要的必加载资源,剩余资源只在需要的时候再加载,以减少进入游戏的时间。分离各类模块和素材,还要一个好处就是减少单个资源的size,降低资源下载失败的情况

按需加载的流程如下:

l 判断资源是否可用(是否已经加载过);

l 如果已经加载,直接使用即可;

l 否则加载资源,下载完成后才使用。

这里有点需要注意 如何判断一个资源是否已经加载过?一般加载过的资源,我们会缓存在内存中(这样下次使用资源无需再次加载),加载过的资源使用一个Dictionary管理(以资源urlkey,资源内容为值。注意不用使用数组保存资源,使用字典会比遍历数组查找名称快很多),通过资源url就可判断资源是否已经加载过。或者通过applicationDomain.hasDefinition(className),查找资源中的链接类是否可以在应用程序域中找到,因为加载通常会制定一个应用程序域,加载过的资源可以直接从域中读取。

我做过的几个游戏进入游戏必加载资源必须尽量小,这样可以保证玩家可以快速进入游戏,这也是一个硬性指标,按需加载是必须的!

3. 按模块加载

模块细化:按照程序逻辑,游戏可以拆分出多个模块,如“登陆模块”、“副本模块”、“任务模块”、”关系链模块“等等;按照游戏中的关卡或场景,可以拆分出不同的“场景模块”。这些模块不是主程序运行必须的,只在需要的时候加载。

这点其实跟第二点“按需加载”是一样的,这里更关注游戏如何进行模块划分使得程序可以按需加载。模块划分主要包括“核心模块划分”和“子模块划分”。核心模块的划分思路是这样的:它们是游戏启动所必须的,相互之间是紧密联系的,还要经常的被子模块调用;而相对的,子模块的划分思路是:他们在游戏启动过程中不是必须的,可以在游戏过程中再加载,子模块相互之间基本上完全没有联系,一个子模块的增加和删除不会影响到任何其他子模块,子模块可能需要调用主程序的接口或者获得主程序的数据,但主程序绝对不应该依赖某个子模块。

明确了模块划分思路再具体看看哪些部分应该划分为核心模块,哪些部分应该划分为子模块。一般情况下,核心模块按照游戏启动顺序大致包括: 加载壳SWF 登录注册SWF 灰度控制文件 主程序SWF 配置文件包 公共素材包 UI需要的资源

注:

l 加载壳SWF一般很小(50K左右,小于100K),只包含2个功能:1)登录注册、灰度控制;2)加载主程序swf。加载完主程序swf,加载壳就完成自己的工作,主程序swf接管程序控制权。尽量最小化加载壳的功能,以保证调整或增加功能不用修改加载壳。

l 接入第三方平台时,如腾讯,”登录注册SWF“不需要,统一使用页面登录框。

l 公共素材包,除了抽取的普通资源swf包,还可以是共享库的形式:UI共享库、Font字体共享库。

l 把公告素材包、主UI需要的资源放在”注程序SWF“之后,否则需要把配置文件包、加载公共资源等工作放到加载壳中去做。如果其中使用到的公用类被修改、项目运营中频繁运营造成修改配置文件和资源管理方式,加载壳就得重新编译发布,违反了”最小化加载壳的功能“规则。

4. 资源缓存

Flash页游可用的缓存有以下几种形式:内存、浏览器缓存、ShareObject flash特有的)。游戏查找资源,通常按照:内存 ==> ShareObject / 浏览器缓存 ==> 服务器的顺序检查。缓存的使用可以给玩家非常好的体验(只在第一次加载时耗时久),这样整体游戏会感觉流畅,不会每次切换场景等都要等待从服务器加载资源的时间。

前面介绍过一般加载过的资源,我们会缓存在内存中(这样下次使用资源无需再次加载),加载过的资源使用一个Dictionary管理。但是内存资源是有限且宝贵的,通常只驻留常用的资源。对于其他资源,这时ShareObject / 浏览器缓存就很有用,比从服务器拉取速度快、并且节省流量。

4.1. 浏览器缓存

关于浏览器缓存可以参考文章:浏览器缓存机制。(http://goo.gl/SaHt0

4.2. ShareObject

这里需要理解下为什么有了浏览器缓存,as3还搞个ShareObject虽然有浏览器缓存,但实际上这种缓存持续不了几天,因为浏览器一向都有最大缓存限制。一般你看几个视频,这个缓存空间就消耗得差不多了。为了不让Flash加载的文件缓存被冲洗掉,你可以将加载的文件的二进制数据(LoadercontentLoaderInfo.bytesURLLoader则要用二进制方式加载获取其data属性)保存在ShareObject里,并添加版本号以便更新,下次加载就直接取这个数据。这个操作会请求大量ShareObject空间,因此FLASH会弹出提示让用户确认(ShareObject默认是100K的大小,超过这个大小需要用户确认)。如果你担心用户不确认,可以在游戏其他地方向用户说明情况并要求他们点击确认按钮,现在已经有很多MMO页游这么做了。

Shareobject示意

var so:SharedObject = SharedObject.getLocal("resName_v1");

if (so.size == 0)

{

// 共享对象不存在。

trace("created...");

so.data.res = bytes;

so.data.ver = “v1”;

}

trace("SharedObject is " + so.size + " bytes");

so.flush();

5. 资源预加载

空闲的时候,预加载核心资源;或者根据玩家特点预加载需要的资源。

l 根据玩家的操作,预判下一步要做的操作,预加载相应资源,这个要具体游戏具体分析。

l 帮核心玩家预加载所有核心资源。如核心QQ农场玩家同时会玩QQ牧场,并经常在这2个模块之间切换,在玩家进入QQ农场空闲时预加载牧场的资源。

资源预加载技术上不难,关键是要找到合适的时间,加载对的资源。

6. 使用CDN加速

关于CDN-内容推送系统可以文考文章:CDN-内容推送系统http://goo.gl/H7Llw)。 现在我所在公司所有的页游都使用CDN技术。CDN技术也在各大门户网站实践使用。

关于CDN加速页游其实和加速网站差不多,参考方案:《网页游戏加速解决方案交流》(百度文库)。

clip_image002

clip_image004

clip_image006

你可能感兴趣的还有:

ü 走在网页游戏开发的路上(一)

ü 走在网页游戏开发的路上(二)

ü 走在网页游戏开发的路上(三)

ü 走在网页游戏开发的路上(四)

ü 走在网页游戏开发的路上(五)

ü 走在网页游戏开发的路上(六)

ü 走在网页游戏开发的路上(七)

ü 走在网页游戏开发的路上(八)

ü 走在网页游戏开发的路上(九)




本文转自吴秦博客园博客,原文链接:http://www.cnblogs.com/skynet/archive/2012/12/20/2827236.html,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch基础(七)——线性层(全连接层)

一、概念 在神经网络中,我们通常用线性层来完成两层神经元间的线性变换。 按照官网的解释,Linear.weight也即A, 我们可以称之为权重矩阵,对其转置后乘以输入数据(一般都是一维张量),加上Linear.bias即b偏置。 二、P…

跨线程取出控件的值的写法(不是跨线程赋予控件值)

//这个方法是跨线程取出控件的值,不是跨线程赋予控件值private delegate void DelegateGetControl(各种参数);private void GetControl(各种参数,和委托的参数是一样的){try{if (this.InvokeRequired){//如果是跨线程的控件,就调用委托去实现…

使系统生成50个0-9之间的随机数,将每个数字出现的次数 存入一个一维数组中,统计出现次数最多和出现次数最少的数字,及出现次数 和出现频率。...

int [] numsnew int[10]; for(int i0;i<50;i){ int num(int)(Math.random()*10);//随机生成0-9 nums[num];//生成随机数 对应下标位置 自增 } int maxIndex0;//存储出现最多次数的下标 int minIndex0;//存储出现最少次数的下标 //循环数组 for(int i1;i<nums.length;i){ …

PureMVC(AS3)剖析:吐槽

PureMVC&#xff08;AS3&#xff09;剖析&#xff1a;吐槽 写在前面 世上没有银弹——不存在适用于所有情况的框架&#xff0c;只有适合的框架。再者任何一个好的东西&#xff08;语言、框架等&#xff09;最终还取决于用的人&#xff0c;语言和框架本身并不能保证用户的代码清…

Pytorch基础(八)——正则化

一、概念 正则化在深度学习领域是为了防止训练结果过拟合而采取的一种方法。 1.1 过拟合 过拟合表示模型的泛化能力较差&#xff0c;体现在实际训练模型上就是在训练集表现很好&#xff0c;但是在测试集的效果一般。 过拟合的原因&#xff1a;1&#xff0c;模型过于复杂。2&…

uva 11997 K Smallest Sums 优先队列处理多路归并问题

题意&#xff1a;K个数组每组K个值&#xff0c;每次从一组中选一个&#xff0c;共K^k种&#xff0c;问前K个小的。 思路&#xff1a;优先队列处理多路归并&#xff0c;每个状态含有K个元素。详见刘汝佳算法指南。 1 #include<iostream>2 #include<cstdio>3 #includ…

.net生成随机字符串

生成随机字符串的工具类&#xff1a; /// <summary>/// 随机字符串工具类/// </summary>public class RandomTools{/// <summary>/// 随机系数/// </summary>public static int _RandIndex 0;#region 获取某个区间的一个随机数/// <summary>///…

【图像处理】——Python鼠标框选ROI(感兴趣)区域并且保存(含鼠标事件)

鼠标交互切割矩形 接下来,就是本文重点了。先吐个槽,网上有资源,但搜到的都是C++的。本来有点气馁的,还好,有官网在,文档写得很清楚,而且接口函数名字变化不大,稍微做下修改就行了。 import cv2global img global point1, point2 def on_mouse(event, x, y, flags, pa…

c++ 11 override final

C 11添加了两个继承控制关键字&#xff1a;override和final。 override确保在派生类中声明的重载函数跟基类的虚函数有相同的签名。final阻止类的进一步派生和虚函数的进一步重载 出处&#xff1a;http://www.cnblogs.com/zhangdongsheng/ 作者&#xff1a;张东升

泛型方法与桥方法

Java泛型中有存在一种方式叫做类型擦除&#xff0c;也就是说泛型在编译期间进行类型检验上做到有效安全&#xff0c;但是在运行当中&#xff0c;会将该泛型类型用顶层父类&#xff08;若无继承关系则用Object&#xff09;代替&#xff0c;然后再进行强转换成目标类型&#xff0…

Pytorch基础(九)——损失函数

一、概念 损失函数在深度学习领域是用来计算搭建模型预测的输出值和真实值之间的误差。 具体实现过程&#xff1a;在一个批次&#xff08;batch&#xff09;前向传播完成后&#xff0c;得到预测值&#xff0c;然后损失函数计算出预测值和真实值之间的差值&#xff0c;反向传播…

用程序猿思维、程序设计师思维两种方式写求斐波那契数列的方法。

//用Java实现斐波那契数列(Fibonacci) public class Test {public int f(int n)//n代表第几个数字。程序返回它相应的值{return n>2?f(n-1)f(n-2):1;//看似如此优雅的一句程序}//程序设计师的思维&#xff1a;会重构上面的代码。让他们更易读。推荐&#xff01;&#xff01…

【图像处理】——图像的差集、并集、补集、交集以及两个图像相减出现负数的处理方法

目录 目录 1、交集 2、差集 3、并集 4、补集 5、差为负值,和超过255的解决办法

Pytorch基础(十)——优化器(SGD,Adagrad,RMSprop,Adam,LBFGS等)

一、概念 Pytorch中优化器的目的&#xff1a;将损失函数计算出的差值Loss减小。 优化过程&#xff1a;优化器计算网络参数的梯度&#xff0c;然后使用一定的算法策略来对参数进行计算&#xff0c;用新的参数来重新进行训练&#xff0c;最终降低Loss。 其中官网提供了13种优化算…

【图像处理】——改变图像的大小(降采样重采样)下采样和上采样

转载自:https://jingyan.baidu.com/article/a3a3f81139be1f8da2eb8ade.html 上采样、下采样和金字塔加速参考:https://blog.csdn.net/Eastmount/article/details/89341077 目录 1、拉伸图片——重采样 2、缩小图片 1)三次插值法cv2.INTER_CUBIC

一段代码到可执行程序所有经历

如果你写的代码是hello.c&#xff0c;你的程序将经历下面的步骤到达硬盘或者内存成为可执行文件。 第一步&#xff1a;hello.c&#xff08;文本&#xff09;经过预编译生成hello.i&#xff08;文本&#xff09; 第二步&#xff1a;hello.i&#xff08;文本&#xff09;经过编译…

js获取url参数值

今天碰到要在一个页面获取另外一个页面url传过来的参数&#xff0c;一开始很本能的想到了用 split("?")这样一步步的分解出需要的参数。 后来想了一下&#xff0c;肯定会有更加简单的方法的&#xff01;所以在网上找到了两个很又简单实用的方法&#xff0c;mark下 方…

[PyCharm]unindent does not match any outer indentation level解决方法

转载&#xff1a;https://www.jianshu.com/p/b34f30717eb2 问题出现原因 1、代码前后缩进量不一致 2、tab和space混用&#xff08;如果一段代码既使用space又使用tab进行缩进&#xff0c;会发生错误&#xff0c;这个时候PyCharm会自动进行判断&#xff0c;根据设置的预先缩进…

为什么要选择Apache Pulsar(二)

这是介绍Apache Pulsar关键特性系列文章的第二篇。Pulsar是由Yahoo开发并开源的下一代发布订阅消息系统。在第一篇文章里&#xff0c;我们介绍了Pulsar对消息模型的灵活支持、多租户、多地域复制和持久性。在这一篇文章里&#xff0c;我们将继续介绍Pulsar的IO隔离机制、伸缩性…