2012-04-25 64 views
5

我试图使用“ExternalInterface.call()”来调用一个返回画布内容的javascript函数。但是,对于相对较小的画布(256x256),这非常缓慢(大约2秒),看起来是因为参数/返回值的编组。如何高效地将html5画布的内容导入到Flash中?

即使我将画布数据分解为更小的块,正如Brad Neuberg在较早的帖子(2006年)中所建议的那样:http://codinginparadise.org/weblog/2006/02/how-to-speed-up-flash-8s.html,我仍然得到糟糕的表现。无论如何,块的大小不应该是Flash 9的问题。

我想我仍然可以尝试覆盖执行参数编组/评估的Flash JavaScript函数,但这似乎非常复杂,并且我想知道在尝试之前是否缺少了更简单的任何东西。

我也试过一个老办法做沟通Flash和JavaScript:

var req : URLRequest = new URLRequest("javascript:getImage()"); 
var loader : Loader = new Loader(); 
loader.load(req); 

其中“的getImage()”是返回画布内容为图像的javascript函数。但是这会引发某种安全违规错误,因为没有浏览器脚本被允许用作目标URL,除非使用“navigateToURL()”而不是“Loader.load()”函数。不幸的是,前者不会返回价值。

我也看到了使用“com.macromedia.javascript.JavaScriptProxy”类的一些旧的代码,但我没有测试它,它似乎并没有在Flash可用11

任何想法,将不胜感激。谢谢!

+2

前段时间,我写了[flashcam](http://code.google.com/p/flashcam/)在Flash上​​捕捉网络摄像头视频,并使用JavaScript在HTML5画布上绘制了它。经过一些测试后,我终于使用了一个复杂的模式,用逗号隔开一串连续的像素差值,并使用基数36进行编码。检查代码时,不要过于强硬地颠倒过程。 – 2012-05-03 14:38:15

+1

@JuanMellado,谢谢你的提示。当然,对图像数据进行编码的方式会产生巨大的差异,字符串是最好的选择,因为最终所有内容都以XML格式传递。我最终使用了PNG压缩+ Base64编码,这可以通过画布函数'canvas.toDataURL('image/png')'非常有效地完成。与将图像数据作为像素或字节数组传递(这涉及客户端上的每个像素的__flash__toXML()调用)相比,该性能提高了一些数量级。也许我应该张贴这个答案,不确定,我是新来的。 – elyuro 2012-05-16 15:39:42

+0

太好了。是的,然后回答你自己的问题。 – 2012-05-16 16:38:51

回答

1

我能想到2个选项:一个简单,一个很难。

1)往返回到服务器。它可能同样缓慢,但不会锁定Flash或导致脚本超时。

2)看看你是否可以编写一个可以连接到Flash的LocalConnection的HTML5 WebSocket。这是不小的壮举。 This guy似乎已经破解了C中的那个坚果。他制作了一个可以“说出”LocalConnection的应用程序。

+0

感谢您的回复。 1)肯定比在浏览器端处理所有内容更没有效率,所以在这种情况下它就不存在了。 2)我快速浏览了一下,它似乎没有任何真正的方法来在JS中执行任何TCP通信。我发现的一切都是在http上进行模拟TCP或者像你给出的链接那样的一些破解。前者绑定的开销与ExternalInterface Flash对象的开销相似,后者我甚至无法想象让它在所有平台上工作的麻烦。不过,谢谢你的建议。 – elyuro 2012-06-04 19:51:47

+0

Websockets可以从JS完成,看这个解释http://www.html5rocks。com/en/tutorials/websockets/basics /,但我不认为websockets与您的用例很好地匹配,这听起来像是一次性连接,而不是长时间运行的打开连接套接字。 – Eddie 2012-12-28 01:39:57

相关问题