博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flash中的隔离沙箱
阅读量:4595 次
发布时间:2019-06-09

本文共 1106 字,大约阅读时间需要 3 分钟。

推荐文章:

我在9ria上的提问:


背景

我们正在开发一个回合制的页游,战斗系统由我负责,目前正在开发战斗回放功能。

战斗回放功能分为这么几块:

1)战斗模块的剥离。将战斗系统对游戏的依赖都剥离出来,做成一个单独可以运行的个体。

2)网络数据包的存储。将所有发给战斗系统的网络包存成一个二进制数据,保存在Web服务器目录下。

当需要看录像的时候先去加载战斗模块,再加载录像文件。

这里还有个问题,因为我们的网络包里面包含了一个协议id的数据,从一开始为了安全考虑,我们的网络协议就设计为每次编译都会不同,由服务器做一些运算告诉客户端种子,而后进行一些校验来保证协议的安全。

所以我们的协议号实际上只能在当时生成这个录像文件的这个版本的游戏中使用,如果游戏更新,那老的录像文件就看不了,这就是录像文件的版本问题了。

所以这个地方还做了一步剥离,把协议也剥离出来,这样一份协议对应一个版本的录像文件。战斗模块就加载相应的协议以及相应的录像文件就可以正常播放了。


问题

Flash有一个覆盖的机制,即相同的路径的类,如果已经存在则不生效。举个例子:a.swf里面有一个类Test,b.swf也有一个类Test,运行a.swf,然后加载b.swf,这样b.swf里面的Test类是不生效的,使用是a.swf里面的声明。

而我们的协议文件实际上是一个类,因为存在上述这样的覆盖机制,那游戏中加载到的协议应该是不会生效的,而会被游戏中正在使用的这个类覆盖掉。

到这里我就在想有没有一种方法可以在Flash内部构建一个类似于沙箱的东西,以前玩游戏的时候经常会有些游戏想要双开,但却只能运行一个实例,这时候有一款软件就能帮上忙了,就是Sandboxie,而我想要的效果就是和这个软件类似。因此也有了我在9ria的提问,事实证明,群众的力量是强大的,Flash确实有这么个玩意可以办到这个事情,就是ApplicationDomain。


测试

我做了个测试,建立两个工程,然后里面都有一个相同路径的类,如下图:

Test类有一个静态变量 public static var flag:Boolean;

但是在两个工程中分别的初始值不同,一个是true,一个是false,然后用TestDomain1.swf去加载TestDomain2.swf,并分别打印两个Test.flag的值

下面是输出:

说明这个方法是有效的,我的目的也达到了,构建了一个和主程序完全不同的运行环境,Perfect ~

 

转载于:https://www.cnblogs.com/yili16438/archive/2013/01/23/2871578.html

你可能感兴趣的文章
安卓绘图引擎
查看>>
写一篇 Bootstrap弹窗确认的文章。本周完成
查看>>
【转】Sublime text 3 中文文件名显示方框怎么解决
查看>>
【数论】洛谷P1313计算系数
查看>>
台湾好市多概述
查看>>
tar、gzip、unzip命令的详细使用方法备忘
查看>>
hdu 1025
查看>>
jar war ear
查看>>
CheckBox自定义样式
查看>>
史上最全的程序猿面试资料
查看>>
什么是分布式消息中间件?
查看>>
linux命令 xargs
查看>>
pythonic operations
查看>>
idea如何打开右侧工具栏
查看>>
msyql数据库位置
查看>>
POJ 3253 Fence Repair 贪心+优先队列
查看>>
java导出csv 代码
查看>>
16个ASP.NET MVC扩展点【附源码】
查看>>
观察者模式(observer)
查看>>
路由处理生成响应
查看>>