Flash Player 10中添加了对泛型的支持(目前只有Vector.<*>,并称为Adobe的'postfix类型参数'),但唯一的AVM2文档没有描述如何访问这些对象.
具体来说,我注意到一个新的操作码(0x53)和一个看似相关的新的多种类型(0x1D),但它们的用法没有记录.
注意:这个问题是用已经知道的答案创建的,因为它比我的博客或Adobe Bug DB更容易找到.
在我的游戏引擎中,我使用Box2D进行物理.Box2D的命名惯例和糟糕的评论破坏了我的引擎的一致且记录良好的剩余部分,这有点令人沮丧并且当你使用它时表现不佳.
我考虑过为Box2D制作一套包装类.也就是说,扩展每个常见Box2D对象并重写其功能的类遵循我的引擎其余部分的命名约定,并使它们更清晰,更一致地进行评论.我甚至考虑构建一些类的ontop并添加一些零碎(比如b2Vec2
类中的基于像素的测量的getter ).
这很好,但我不能100%确定这会产生什么负面影响以及这些影响我应用程序和游戏的程度.我不确定编译器是否在一定程度上减轻了我的一些顾虑,或者为了可读性和一致性而添加一些不必要的类时我是否需要考虑周全.
我有一些怀疑:
我特别询问运行时影响.
我正在为Flex/AS3开发一个动态模拟框架,并且在使用私有/支持类型(即在类文件中的包{}之外声明的那些)时遇到问题.
在我的ABC"文件"中,我使用PROTECTED_NAMESPACE类标志和PRIVATE_NS多个名称声明实例.我还尝试给它提供与子类化相同的命名空间(例如,PRIVATE_NS("ContainerClass.as $ 123")).
无论我做什么,我总是在loadBytes之后得到以下错误:
VerifyError:错误#1014:Class ContainerClass.as $ 123 ::找不到PrivateClass.
我已经尝试将生成的字节码加载到与私有类相同的ApplicationDomain中(我默认使用子域).我甚至尝试在加载之前注册一个类别名(虽然这有点拉伸).
我忘了什么,或者只是AVM的限制?
请注意,我完全清楚这在ActionScript 3.0中是非法的,我正在寻找这是否在AVM中实际可行.
编辑:对于那些对目前工作感兴趣的人来说,该项目是asmock并且在sourceforge上.
我最近为AVM2/AS3制作了一个反编译器,我注意到Flash编译器往往会发出大量不必要的代码.例如,对于某个应用程序,我删除了大约10%的代码而没有任何功能损害.它只是一个肯定死的代码,没有被条件操作码和异常处理块引用.
另外,请看这个片段:
...
313 setproperty y
315 getlocal 12
317 returnvalue
318 jump L9
L3:
322 getlocal 8
324 returnvalue
L9:
325 jump L10 ; L10 (opcode #331) does not ever exist.
; Technically, it is a jump beyond
; the end of function. This is invalid code!
L2:
329 pushnull
330 returnvalue
Run Code Online (Sandbox Code Playgroud)
好吧,当然这是无效的代码,它也是死的,因此不会造成任何不利影响(代码库膨胀除外).但为什么它会发出那些代码呢?为什么验证者会接受?
我一直在玩ABC字节码,并希望有人可以为我解决一个混乱点.我有一个简单的Flash文件,可以在舞台上放置一个剪辑,并有一个小脚本来更新它在每个帧上的位置.代码看起来像:
package
{
import flash.display.MovieClip;
import flash.events.Event;
public class RedCircle extends MovieClip
{
public function RedCircle()
{
this.addEventListener(Event.ENTER_FRAME, moveit);
}
function moveit(e:Event)
{
this.x -=1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
其编译类似于:
protected package protected RedCircle
{
class RedCircle extends flash.display.MovieClip
{
static () : Void
{
getlocal_0();
pushscope();
returnvoid();
}
RedCircle () : Void
{
getlocal_0();
pushscope();
getlocal_0();
constructsuper(0);
getlocal_0();
getlex(flash.events.Event);
getproperty(ENTER_FRAME);
getlex(internal .moveit); // ###1
callpropvoid(addEventListener, 2);
returnvoid();
}
function (anonymous) (flash.events.Event param1) : Void // ###2
{
getlocal_0();
pushscope();
getlocal_0(); …
Run Code Online (Sandbox Code Playgroud) 从AVM2概述PDF我遇到了两种类型的堆栈的引用 - Scope Stack和Operand Stack.
1)我假设这是两个不同的内存堆栈,每个堆栈处理不同的东西.还有更多的堆栈吗?
2)pushstring"hello" - 这将推动内存地址的开始,其中"hello"字符串位于Operand Stack上.对?
3)setlocal 0 - 这将通过弹出它将堆栈(上面)中的值存储到register0中.对?
4)PushScope() - 嗯,docs说堆栈的pop值,将值推到Scope Stack上.为什么?
我知道一点NASM,但ABC看起来比这更复杂.特别是我对Scope Stack和多个堆栈的整个概念感到困惑.
我想知道,AVM2(ActionScript 3 VM)支持哪种优化?我知道它使用JIT,但它支持死代码消除,常量折叠,内联等.
对我来说,ActionScript编译器也做了一些优化也很有趣.AFAIK C#编译器执行非常小的优化集(只有语言支持需要),JIT完成所有工作.而且它的工作速度非常快.
谢谢.
感谢MPD.AVM2支持:
谷歌在这方面让我失望.
假设我有一些ECMA脚本,我使用Open Source Flex SDK中的编译器将其编译为ABC字节码文件.
是否在使用条款(我似乎无法找到)中使用adobe的AVM2规范为该文件创建新的解释器?
我能管理的最好的是维基百科中的一句话,说明闪存规范是"无限制"的.我不是制作flash播放器,AFAIK AVM2规格与SWF规格是分开的.
如果我的意图合法,有没有人知道副手?
avm2 ×8
apache-flex ×3
bytecode ×2
flash ×2
actionscript ×1
adobe ×1
generics ×1
javascript ×1
licensing ×1
memory ×1
performance ×1
vector ×1