2

我很好奇,使用字节码构建 SWF 比常规动作脚本有什么优势吗?

正如我所读到的,有一些方法可以稍微加快代码速度,但是有一些 as3code 不能做的事情吗?

编辑:请不要专注于编码风格、问题、类型检查和语法,假设我有外部 SWF 和 1 个用字节码编写的类,现在我想知道我可以从较低级别的编码中获得什么好处。

4

2 回答 2

2

Flash 编译器不会使用 Flash 播放器中所有可用的操作码,因此理论上,您确实可以通过“手动”编写操作码来提高性能。

例如,与 Flash 相比,Haxe 编译器可以利用 Alchemy OpCodes 并提供性能提升:

访问 Alchemy 操作码

Adobe Alchemy 使用的 SWF 播放器中隐藏有用于内存分配的操作码。Haxe 能够访问它们,从而为您提供低级内存访问,从而可以极大地提高速度。

http://haxe.org/doc/why

不过,我不知道使用这些操作码有多安全。由于官方 Flash 编译器不支持它们,因此它们可能会在 Flash Player 的未来版本中被删除。

于 2012-04-24T09:16:15.623 回答
2

只是添加到 Laurent 发布的内容。ASC 是目前 Adob​​e 产品使用的 ActionScript 编译器(MXML 使用来自 ASC 的代码,Flash CS 中的编译器对其进行了自定义构建,但对实际编译器没有太大影响,而是充当前端/“胶水”链接器和其他实用程序)。

ASC 不是优化编译器。这意味着它在编译为低级语言时通常不会进行任何优化。它只对生成的字节码进行分析,以确保没有错误。(编译器仍有可能从有效的 AS3 代码生成错误代码)。

您可以在字节码和 AS3 中编写的所有有效代码之间没有一一对应的关系。这意味着 AS3 将您限制在字节码中可能的子集。绝对有可能在生成的字节码中,当它在堆栈上时,您会看到如何更容易获得某个值,但 AS3 中没有工具可以从那里获取它。例如,如果您知道循环内的其余代码将永远不会读取/写入第一个寄存器,那么您可以避免创建依赖于第一个寄存器包含迭代器的循环迭代器。显然,当您分析字节码的处理方式时,您可以发现更多“功能”。

但是,重要的是要了解,除非您的目标是细粒度且非常具体的,否则本地优化几乎不会取得任何重大成果。例如,例如某些特定的密码算法或字符串解析例程等。手动优化较大的程序确实很困难。事实上,这太难了,你需要一个工具来至少验证你自己是否真的在优化。最后,你会发现自己使用这个工具来生成优化的代码变体并测试它们——这就是编译器的构建方式:)

于 2012-04-24T10:17:30.540 回答