作者:唐声福时间:2012年2月邮箱:slicol@qq.comQQ:45402939VFS在大型FLASH项目中的应用目录•Flash项目规模的演化1•VFS是什么?2•基本原理及论证3•基本框架及实现4•对其它系统的助力5•部署及工具61、Flash项目规模的演化广告、贺卡和动画演示简单休闲的单机小游戏多种类型的复杂游戏(在线、回合、策略、SNS等)几乎全类型的大型游戏(3D、MMOG、FPS等)2、VFS是什么?Linux中的概念•VFS是一个可以让open()、read()、write()等系统调用不用关心底层的存储介质和文件系统类型就可以工作的粘合层。2、VFS是什么?Windows的问题•“Windows游戏软件在发布时,通常会把所有数据文件打包。这通常出于两个目的:一是保护数据文件不被昀终用户直接查看,二是Windows的文件系统一度相对低效。尤其是在处理非常多小文件的时候,无论是安装、分发还是运行时处理都有性能问题。”2、VFS是什么?案例:WOW•10+G的客户端应该有多少个文件?•MPQ是Blizzard公司将游戏数据包装在一起的一种档案格式•VFS即相当于用来管理读写这些数据包的底层模块。•也许在Blizzard,它不叫VFS。管它呢!2、VFS是什么?引自「云风」的话•“我需要从不同的介质中读取文件。从操作系统提供的文件系统中访问文件。也可以创建一个内存文件系统,把临时资源放在内存。也可以从数据包中检索文件。数据包可以是自定义格式,也可以是标准的zip格式(方便开发期使用)。如有可能,我希望支持嵌套的包结构,即可以将一组文件打包成一个zip文件,再将这个zip文件打包到另一个zip包中。程序可以用多层目录的形式直接访问到内层包内的数据。”2、VFS是什么?PCGame旧的概念(Linux)新的概念(PCGame)2、VFS是什么?WebGame•前面讲的,都是PCGame的事儿,那么…3、基本原理及论证•论述HTTP请求的底层原理?•论述HTTP请求的详细过程?•太抽象了!要命!3、基本原理及论证•一些事实(以下来自Chrome的抓取)•稍大一点的文件(10KB以上,并行请求)3、基本原理及论证•一些事实(以下来自Chrome的抓取)•比较大的文件(100KB以上,串行请求)3、基本原理及论证•一些发现1、每次请求都会有2、与文件大小无关这才是真正下载数据的耗时3、基本原理及论证•一些计算•(1)在串行请求时,如下例子,有7%的时间额外消耗了。如果平均每个文件都是250KB,则10M的客户端要额外消耗15S。3、基本原理及论证•一些计算•(2)若并行请求,由于HTTP昀大请求数是有限的,则必定会有阻塞(Blocking),这时A阶段的时耗会大大增加。如下例子。在请求数量达到一个阀值时,总体额外消耗依然可观。3、基本原理及论证•一些数据(实验对比数据,后续补充)3、基本原理及论证•基本原理•(1)HTTP请求是十分低效的,在处理非常多小文件的时候,HTTP的请求会有很多时间上的冗余消耗。•(2)我们需要将海量零散的小资源文件打包成多个大资源文件。减少这种冗余消耗。4、基本框架及实现•基本框架4、基本框架及实现•虚拟目录结构RootDir1File1:包AFile2:包BDir2File3:包AFile4:包Root4、基本框架及实现•VFS包存储器包路径索引包Root包A包B包…4、基本框架及实现•文件映像缓冲池文件路径索引File1File2File3File…4、基本框架及实现•预加载VFS包4、基本框架及实现•从缓冲池请求文件4、基本框架及实现•从VFS包里请求文件4、基本框架及实现•性能分析•(1)内存消耗•一张比较极端的3200*2400的JPG图片在被使用的时候,会消耗3200*2400*32/(8*1024*1024)=30MB左右内存,而其文件只占1.8MB左右。多了6%的消耗。•一张优化得比较好的PNG图片670*600,会消耗1570KB内存,则其文件只有12KB。多了0.7%的消耗。4、基本框架及实现•性能分析•(2)加载时耗•单体加载时耗:由于是从内存中请求文件,加载时耗比从服务器(甚至IE缓存)要快数倍。•【表格,后续补充】•总体加载时耗:已经在上一节的基本原理中得到论证。4、基本框架及实现•性能分析•(3)综合评估•VFS在需要加载海量资源的大型Flash项目中,是能够提高系统的整体性能的。4、基本框架及实现•具体实现•(1)VFS包存储格式•ZIP–BytesArray自带算法–FZip开源库–资料全,工具多•MPQ•VFS•自定义的4、基本框架及实现•具体实现•(2)虚拟目录管理部分算法•Root.Zip:一开始创建一个空的ZIP文件。•挂接/展开:在虚拟目录对应节点起始,从对应的ZIP文件里取出子目录树,挂接在该节点上。如果该节点已经有同名的子目录,则逐级覆盖。•映射:每一个叶子节点,建立【文件名,ZIP文件名】的映射。不直接映射到ZIP文件的引用。4、基本框架及实现当前目录结构挂接A.Zip后的目录结构RootDir1File1:B.ZipFile2:B.ZipDir2File4:Root.ZipRootDir1File1:A.ZipFile2:B.ZipDir2File3:A.ZipFile4:Root.Zip4、基本框架及实现•具体实现•(3)文件映像缓冲池部分算法•淘汰:对长时间未被请求的映像进行删除,或者回写。•回写:对于零散加载的文件,以一定策略回写到对应目录节点下挂接的ZIP文件里,如果该节点没有ZIP文件,则回写到Root.zip。4、基本框架及实现当前目录结构回写Root/Dir3/File5RootDir1File1:A.ZipFile2:B.ZipDir2File3:A.ZipFile4:Root.ZipRootDir1File1:A.ZipFile2:B.ZipDir2File3:A.ZipFile4:Root.ZipDir3File5:Root.Zip5、对其它系统的助力•版本管理及升级(1)增量升级:如果本地已经有旧版本Ver.zip,那么版本管理系统判定需要打补丁后,只需要下载PatchX.zip-PatchY.zip即可,VFS会自动用PatchX.zip-PatchY.zip里的新文件替换Ver.zip里的同路径旧文件。(2)全量升级:如果本地没有旧版本资源包,或者版本管理系统判定需要全量升级,则只需要从服务器下载新的Ver.zip,而不需要重复下载PatchX.zip-PatchY.zip。5、对其它系统的助力•资源管理(1)资源管理器不直接从服务器加载文件,而是从VFS请求文件。(2)在开发中,由于资源没有打包成ZIP,VFS会直接从本地或者服务器加载文件。(3)在发布后,资源被打包成ZIP,且被预加载进VFS。VFS会从内存中高速加载文件。(4)整个过程对资源管理是透明的。5、对其它系统的助力•反外挂(1)敏感资源被多重封装。(2)ZIP文件可以设置密码。(3)VirtualFile对应的BytesArray可以去除文件头等标识字段,干扰内存扫描。6、部署及工具•根据具体项目而定,大概分为如下几个包:–基础资源包–运营资源包–每个场景的资源包–独立的模块资源包–每个副本的资源包•其余可作为零散资源6、部署及工具•Windows自带的ZIP压缩工具•第三方的、功能更强大的ZIP压缩工具