注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

为着理想勇敢前进

 
 
 

日志

 
 

Flash 中的事件录制和回放  

2010-09-23 15:24:33|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

程序员写代码调试时一个很大的困难就是如何重现 bug ,即使使用了调试器,也只能让代码向前执行,而不可能退回过去的某个状态。

这个问题的最佳解决办法是录像,如果记录了所有的输入事件,那么只要回放依次序重新触发这些事件,就能让代码每次执行都相同。需要记录的事件包括鼠标键盘等外设,也包括网络通讯数据,以及定时器。

我写了一个 Flash 下的录像框架,http://as3recording.googlecode.com/。现在我们已经用上了,平时调试都用它。遇到问题的时候可以反复测试,而且播放速度还比正常游戏快得多。以后测试的时候,发现了什么 bug 也只需附带一个录像文件就可以重现。

其实对于 C 语言层次的游戏引擎来说,录像的实现并不难,只要在分发事件之前记录下来就可以了。但对 Flash ActionScript 编程来说,这却并不容易。首先,因为 Flash Player 提供的是上层 API ,并不存在一个统一的地方能截获所有事件。如果一个应用程序想要记录所有的事件,那么这个程序注册事件的代码势必要修改。要想非侵入式的提供录像功能是不可能的。其次,Flash Player 提供的上层 API 还是面向对象的,事件信息中包含了一些对象的引用(比如relatedObject),如果要在回放时也能够模拟这些事件,就必须实现某种机制来把引用序列化到录像文件中。最后,Flash Player 没有办法保存文件,所以录像文件的存放是个问题。

在我这个框架中,第一个问题只能算是部分解决,一方面是用 Stage 来拦截显示对象上发生的事件,另一方面是通过提供工厂方法产生对象实例,能够做到使用录像以后,大部分代码都不用改,少部分需要改的代码也只是创建对象的代码。第二个问题没办法,只能老老实实实现一套对象注册和查找的机制。第三个问题就只好改用网络来保存文件,我是使用 HTTP 协议保存文件的,自己实现一个 HTTP 的客户端,录制时就是一个 PUT 或者 POST 请求过去。需要自己实现 HTTP 客户端是因为原生的 URLLoader 必须一次性准备好所有要发送的数据,不能分多次发送数据(而录制时正需要截获到每个事件就立刻发送到服务器端记录下来,以免客户端崩溃了就没有机会发出去了)。

  评论这张
 
阅读(1214)| 评论(8)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018