Actionscript 3 如何将对炼金术asm声明变量的引用获取到flash中?

Actionscript 3 如何将对炼金术asm声明变量的引用获取到flash中?,actionscript-3,actionscript,alchemy,Actionscript 3,Actionscript,Alchemy,我在alchemy asm中声明了一个变量: asm("var buffer:Vector.<Number> = new Vector.<Number>(100, true);"); 我不明白的是如何将asm“buffer”变量的引用获取到actionscript中 (我确实想到了一种方法……我所做的是从alchemy asm中抛出“缓冲区”,然后在actionscript中捕获它,但不幸的是,它似乎泄漏了大量内存) 有没有更好的替代方法 请注意,性能至关重要,而使用默

我在alchemy asm中声明了一个变量:

asm("var buffer:Vector.<Number> = new Vector.<Number>(100, true);");
我不明白的是如何将asm“buffer”变量的引用获取到actionscript中

(我确实想到了一种方法……我所做的是从alchemy asm中抛出“缓冲区”,然后在actionscript中捕获它,但不幸的是,它似乎泄漏了大量内存)

有没有更好的替代方法


请注意,性能至关重要,而使用默认的alchemy封送太慢。

asm
仅用于来回传递数字,这意味着我们必须使用alchemy的内部int到对象映射。通过挖掘中间AS3代码(要查看它,请将
ACHACKS\u TMPS
环境变量设置为“1”),似乎
CTypemap.AS3ValType
会进行映射。因此,您可以返回asm创建的对象,如下所示:

static AS3_Val alc_return_obj(void *self, AS3_Val args) {

    int len= 100;

    // create custom data in AS3
    asm("var as3Buffer:Vector.<Number> = new Vector.<Number>(%0, true);" : : "r"(len));

    // populate the vector with multiples of pi (just for fun)
    for (int idx= 0; idx < len; idx++) {
        double value= 3.14159265 * idx;
        asm("as3Buffer[%0] = %1;" : : "r"(idx) , "r"(value));
    }

    // get a C reference to the AS3 object
    AS3_Val alcBuffer;
    asm("%0 CTypemap.AS3ValType.createC(as3Buffer)[0];" : "=r"(alcBuffer));

    return alcBuffer;    
}
static AS3_Val alc_return_obj(void*self,AS3_Val args){
int len=100;
//在AS3中创建自定义数据
asm(“var as3Buffer:Vector.=新向量。(%0,true);”::“r”(len));
//用pi的倍数填充向量(只是为了好玩)
for(int-idx=0;idx

注意:虽然这是有趣的黑客行为,但它可能不是解决此问题的最佳方法。这可能不是从炼金术中获取数据并进入Flash的最快方法。为此,我建议使用ByteArray将数据复制到Alchemy的RAM中或从中复制出来。有关该领域的一些技术,请参见本节。

在这种情况下,我需要调用Graphics.drawTriangles,不幸的是,它不采用ByteArray。啊,那么使用asm可能是最好的方法:)
static AS3_Val alc_return_obj(void *self, AS3_Val args) {

    int len= 100;

    // create custom data in AS3
    asm("var as3Buffer:Vector.<Number> = new Vector.<Number>(%0, true);" : : "r"(len));

    // populate the vector with multiples of pi (just for fun)
    for (int idx= 0; idx < len; idx++) {
        double value= 3.14159265 * idx;
        asm("as3Buffer[%0] = %1;" : : "r"(idx) , "r"(value));
    }

    // get a C reference to the AS3 object
    AS3_Val alcBuffer;
    asm("%0 CTypemap.AS3ValType.createC(as3Buffer)[0];" : "=r"(alcBuffer));

    return alcBuffer;    
}