« 搞清楚“为什么” | 返回首页 | 以人为本,美术资源的归档 »

利用 Cache 减少传输的数据量

今天研究 wow 时候发现,他 cache 了很多的信息。我们可以在 WDB 目录下找到这些 cache 文件。没有仔细去研究这些文件到底放了些什么,但是由此却想到一些东西。

我们在做 mmo 的服务器的时候,有些信息,数据量很大,却并非经常变动。比如物品的细节描述,工会/帮派信息,甚至还有好友列表等等。在 IM 软件中, cache 住朋友列表到本地硬盘是很常用的手法,不过我参与的几个 MMO 项目都没有这样做。

其实,这些不易变的信息,在 client 需要获取的时候,只需要在请求协议中加入一个自己 cache 的信息包的校验值过去就可以了。server 校对自己一方的校验值,当判断与 client 相同的时候,就不需要重发这些信息了。

很多信息都可以如法炮制,扩展开看,还可以是 npc 对话,任务描述等等。

Comments

没错, 有点意思, 是可以CACHE..又学到一招:d

wow 本地存的主要是item的描述,属性,人物对话,物品 tooltip, 任务描述和id
每次server 更新后会从头再来,由于wow的live patch不多,每个版本之间对item 修改也不多,所以还是够用的

cache和包的聚合是一回事吗?

TCP 是基于流的,服务器应该做包的聚合,(当然有些游戏应该做却没做,比如大话)。逻辑的包十几个字节,但是聚合以后,每次 send 的数据就不只了。

ps. cache 主要减少服务器发送的负担,而现在游戏服务器一般不会拿 windows 做 ;)

但是实际上,网络在转发一个512字节的数据包和16字节的数据包开销是一样的?

一样的?不缓存应该确实差不多,但是ws2_32.dll会做缓冲。

同意云风的这个想法,很多东西一开始就可以Canche到客户端的.而且也是可随着服务器的变化而变化的,只要做好相应的版本管理功能就差不多了.就像SVN、VSS这些文件管理系统一样。

好友信息可以save到local的,但是好友列表不用,因为好友列表是变化的。

物品描述信息是从服务器发送到客户端的,但是记录在本地没有太大意义,因为:

描述信息是合在属性信息中一起发送的,如果有时候发送,有时候不发送,会使得机制变得复杂;似乎不发送描述信息可以节省网络带宽,但是实际上,网络在转发一个512字节的数据包和16字节的数据包开销是一样的,而物品描述信息一般都是单独发送的,大部分情况下是小包,如果试图去优化掉这些内容,实际上并没有获得任何结果。减少拼装的次数或许能节约服务器端的CPU资源,但是实际上服务器的CPU资源瓶颈并不是这里。

Cache只有缓存那些很少变化,但是频繁交互的或交互数据量大的才有意义。

好友列表这些数据放到本地不太合适把,因为用户有可能会在其他机器上修改自己的好友列表,这样就要同步数据。物品的细节描述什么的倒可以放在本地.

理论上想cache什么都可以,只要你有相应的cache体系(主要就是更新同步,游戏中很多东西之间都有依赖关系,所以说是cache体系),毕竟cache同临时文件有区别。

当然搭建一个对应的cache体系是有代价的...

可惜flash能在本地硬盘放的信息太少了,只能适合这些大型游戏。RIA和Ajax还是不行

还有一个Super cache,就是Skype。

可以有个比较时不时上次推出时的信息包

固定不一定是恒定,有更新和同步的问题。

NPC的对话、任务描述这种东西如果是固定的话不是可以放在客户端吗?

Post a comment

非这个主题相关的留言请到:留言本