一个未完成的简单AS3 eval实现

本文源码(on github):https://github.com/zrong/blog/blob/master/unfinished_as3_eval.md

AS3没有eval确实不方便,目前我所知有两种方法:

  1. 使用ActionScript 3 Eval Library来实现。但这个库比较大,debug编译越140KB。如果项目非常注重文件大小,则需要考虑;
  2. 如果swf部署在浏览器环境中,可以将eval交给Javascript来处理,然后获取Javascript的返回值即可。

我在工作中需要使用eval的地方,往往比较简单,且比较规律。这种情况下,完全可以自己写一些简单的逻辑来实现。

这个例子中的需求就很简单,是实现一个较为灵活的站位算法。我在外部配置文件中定位了12个站位坐标(包含xy值),人物进入界面后,基于这些站位点来站位。但由于舞台的大小是变化的,如果定义一个确定的值,无法根据舞台的大小进行变化。

如果让外部的配置文件中支持类似于 h/2 或者 w-100 这种语法,就非常灵活了。

这个实现仅支持一次运算,而且不支持单个的 w 这种类型的值,要获取 w,必须用 w+0 这种语法。但对当前的需求来说,足够了。

下面就是代码: 继续阅读 »

人情味

今天在OllyDbg的博客上看到这样一篇文章,心有所感,也来说两句。

OllyDbg的文章转载如下:

今天在KFC门口见了几个可爱的外国嫚,我看了她们一眼,她们冲我一笑,我冲她们一笑。我就感觉整个晚上都被幸福感包围着。其实人和人之间的感觉就是这么>简单,幸福也这么简单。但是我们自己人看自己人的时候,却那么的冷漠,所以才有了我这一篇文章。
我觉得咱们真的应该反思下了 ,为什么我们不停下来思考一下,然后再更好的往前走呢?我思考了自己,我们这么经常的各种被骗,各种交易,早就没有那颗容易接近的心,人与人之前的种种沟壑,让人淡漠了。
想起来小时候,那么的相信周围的人。人与一个陌生人基本上没有特别的隔阂。
我们的感觉去哪了呢?

看完后我突然想起自己的两件亲身经历:

有一次我坐火车上的比较早,整个车厢也就我一个人。后面上来了两个人拖着一大包东西。他们把东西搬到我的位置前面后,就下车去搬另外的东西,其中一个对我说:帮我们把东西看看吧。我当时的第一反应就是:是不是骗子?或者是“做笼子”的?所以我没吭声。

但我马上就反应过来,为什么我会有这样的想法?为什么我不能一口答应下来?是自己的谨慎,还是对当前的险恶社会的理解造成的?如果再碰到这样的事情,我该怎样去教育我的孩子?

我又想起10年前做老师的时候,我在学校门口例行执勤。当时还是BP机时代,我收到一个Call,找旁边的发廊(那时已经叫发廊了)打了个电话(大概5毛钱吧)。打完后才发现自己钱包放在办公室没有带出来。我当时就和发廊的理发师说,我是旁边学校的(我还戴着执勤的工作证),待会进去拿钱出来给你。结果他看了我一眼说道:把工作证押在这里吧。

我才发现,10年后,我已经变得和那个发廊的家伙一样了……

FlashPlayer在执行NetStream.play的时候崩溃的解决办法

Thank you again for sending us the Flash Player Netstream issue. This issue should be resolved in the upcoming release of Adobe Flash, currently planned for the next couple of weeks. Please let us know how you would like to be included in the Acknowledgements section of the upcoming Security Bulletin:

  • 2011-08-15:Adobe再次回复,并声称解决了此BUG:

这个bug已经在内部修复了,该修复会被包含在flash player 11正式发布版当中。谢谢使用flash player!

  • 2011-08-10:Adobe回复了此BUG:

Hello,
Thanks for your reporting of the issue flashplayer crash on netstream play. We could reproduce the issue and it has been filed in our internal bug system. We are going to >investigate it ASAP. And any update to the it, we will let you know quickly. Thanks!

  • 2011-08-09:向Adobe提交了此BUG

这是个隐藏非常深的BUG,我都怀疑如果再做一次,我能不能把它找出来。它耗费了我宝贵的三天时间,三天啊……

BUG表现

在使用NetStream连接FMS发布的流,并执行NetStream.play(‘streamName’)方法时,FlashPlayer会崩溃。独立版、调试版以及基于浏览器的插件版均如此。

但是,这还不是全部。必须满足以下几点,该BUG才会出现。

  • 使用Windows 7操作系统。也就是说,Windows XP不会出现这个问题;
  • 播放的必须是RTMP流,RTMP流可以由Flash Media Server或者Red5来发布。也就是说,使用NetStream播放本地的flv/f4v/mp4视频不会出现这个问题;
  • 播放的流包含音频。也就是说,如果该流只包含视频,不会出现这个问题;
  • 播放的流中包含的音频声音较大。也就是说,即使该流包含音频,但如果发布方没有发出声音,或者发出的声音很小,该问题不会出现;当然,不需要很大的声音就能让播放端立即崩溃;
  • 使用了Frame标签来做预加载。不了解Frame标签预加载的,看这篇文章:Preloaders in AS3;
  • 在预加载完毕之后,使用removeChild移除了预加载类的实例(BUG就在这里)。

继续阅读 »

Google Code 开始支持 Git

Google code 支持 Git

Google code 开始支持Git了!

从现在开始,新建code项目就可以选择Git作为版本管理系统;

或者在Administer的Source面板中,也能将现有的项目转换成Git系统来管理。

不过,目前仅支持Https协议来clone,这速度就有点慢了啊。

Google应该早点动手,否则也不会那么多人将项目转到github上去了 继续阅读 »

Socket服务器性能测试器+源码

socket_performance_tester

2011-08-05升级:加入自定义数据发送的功能,规则:s字符串,b字节,i长整数,u无符号整形,n短整形。例如:n1000,b1,i65555,s你懂的

为了测试新服务器的连接承载能力,我花了点时间写了这个测试器,但其实这只能算个雏形而已。

后来测试器使用C#重写,所以这个测试器就没再修改和更新,里面已有的BUG也没怎么解决。

目前的版本实现了以下功能:

  • 指定连接数量;
  • 允许指定连接间隔时间;
  • 发送指定大小的测试数据包;
  • 自动写入log文件(不要妄想用TextArea显示Log,最后程序会直接被log信息的更新拖死……)
  • 加入自定义数据发送的功能,规则:s字符串,b字节,i长整数,u无符号整形,n短整形。例如:n1000,b1,i65555,s你懂的

继续阅读 »

[转]老程序员的建议

本文转自

本文是《Learn Python the Hard Way》(中译《笨办法学Python》)一书的尾声部分。(在线阅读该书

你已经完成了这本书而且打算继续编程。也许这会成为你的一门职业,也许你只是作为业余爱好玩玩。无论如何,你都需要一些建议以保证你在正确的道路上继续前行,并且让这项新的爱好为你带来最大程度的享受。

我从事编程已经太长时间,长到对我来说编程已经是非常乏味的事情了。我写这本书的时候,已经懂得大约 20 种编程语言,而且可以在大约一天或者一个星期内学会一门编程语言(取决于这门语言有多古怪)。现在对我来说编程这件事情已经很无聊,已经谈不上什么兴趣了。当然这不是说编程本身是一件无聊的事情,也不是说你以后也一定会这样觉得,这只是我个人在当前的感觉而已。 继续阅读 »

[转]判断计算机显卡是否支持Adobe Flash Stage3D

本文转自Perter’s Blog,稍作修改

Adobe Flash Player支持GPU加速的Stage3D功能无疑对未来的Web game渲染性能带来质的飞跃。目前包含这一功能的Flash Player 11 Beta版本已经发布在Adobe Labs。

或许很多开发者都有这样的问题,我如何知道哪些设备支持Stage3D呢?按下面方法即可获取到:

运行这个工具 http://zp.amsnet.pl/cdragan/d3dcaps.html 得到一个叫 ‘devcaps.txt’ 的文件。 查看两个着色器的值。如:

VERTEX_SHADER_VERSION FFFE0300
PIXEL_SHADER_VERSION FFFF0300

忽略FFFE/FFFF, 只看红色部分的值,这个值必须都大于0200 才能支持molehill, 否则就软解。

注意,这两个值会在devcaps.txt文件中出现两次,用后面出现的那一组 (第一组的值是0101/0104,忽略即可)。

Beta(Flash Player 11+AIR3)新功能简介(中文版)

7月13日,Adobe Labels发布了Flash Player 11和AIR3的Beta,简介如下:

共同所有的新功能

  • 基于显卡的3D渲染加速
    给力啊……网页游戏界要洗牌了
  • 支持对摄像头视频流进行H.264/AVC编码
    基于FMS的视频聊天室可以更加清晰了
  • 原生JSON格式支持
    这个早就该有了,Adobe真是不思进取
  • 支持手机设备上的G.711音频压缩
  • 垃圾回收通告
    虽然不能手动GC,但有这个也不错
  • 三次贝塞尔曲线
  • 安全的随机数生成器
  • 受保护的HTTP动态流(HDS)和Flash访问增强
  • 提供Socket进度事件
  • JPEG-XR格式支持
  • 高分辨率位图支持
    呵呵,终于可以不受那个该死的1677万像素的限制了
  • 更高压缩比的SWF格式
    改为LZMA(7z)压缩了,压缩比高达40%
  • DisplayObjectContainer.removeChildren 和 MovieClip.isPlaying
    有总比没有好,不是么?

仅Flash Player所有的新功能

  • 原生的64位操作系统支持
    拖了这么多年,总算出来了
  • 支持异步位图解码
  • TLS安全套接字支持

仅AIR3所有的新功能

详细pdf下载链接(鸟语版,不喜勿下)

话说Flash Player 11 beta的reference,原来在这里:http://help.adobe.com/en_US/FlashPlatform/beta/reference/actionscript/3/index.html

AS3中正则表达式对反斜杠的替换

本文源码

一个有趣的小问题,下面的正则表达式能替换成功么?

?View Code ACTIONSCRIPT
var __str:String = '1234\6789';
trace(__str.replace(/\\/g, '5'));

答案是:不能。trace出来的结果为:

[trace] 12346789

其实正则本身并没有写错,错在被替换的字符串。反斜杠“\”在AS3中是转义符,会将其后的任何值转换为本身,因此看到的字符串其实本身就是12346789,也就是没有反斜杠,当然无法搜索到。

直接trace(__str),结果和上面的trace相同。

希望得到正确的结果,需要将字符串设置为:1234\\6789,我们看到的是两个反斜杠,而AS3认为它是一个反斜杠。 继续阅读 »

并非SleepMode之错——IE9对Flash Player的影响

本文源码

Flash Player从版本10.1开始加入了Sleep Mode(睡眠模式),具体表现为在浏览器中的Flash Player窗口不可见(最小化、被完全遮挡,或被滚动条带到不能显示的地方)时,自动将帧率降低到4帧/秒。我原来也写过一篇文章介绍FPS对Socket链接的影响

睡眠模式给游戏开发者带来很大的麻烦,但并非不可解决。目前最常用的两种解决方式是这样:

  1. 在JS中写一个计时器,每隔一段时间调用SWF提供的方法,可以避免进入睡眠模式;
  2. 在swf中播放一段不间断的声音,可以让帧频维持在8帧/秒。

但是,即使是使用了这两种方法,**在IE9中,依然会受到“睡眠模式”的影响!**而且,这个“睡眠模式”的提供者是IE9,我们无法绕过。

继续阅读 »