1

我在炼金术 asm 中声明了一个变量:

asm("var buffer:Vector.<Number> = new Vector.<Number>(100, true);");

我可以用这样的数据填充它:

asm("buffer[%0] = %1;" : : "r"(index) : "r"(value));

我想不通的是如何将该asm“缓冲区”变量引用到actionscript中。

(我确实想到了一种方法......我所做的是从炼金术 asm 中抛出“缓冲区”,然后在 actionscript 中捕获它,但不幸的是它似乎泄漏了很多内存)。

这样做有更好的选择吗?

请注意,性能至关重要,使用默认的炼金术封送处理太慢了。

4

1 回答 1

2

asm仅用于来回传递数字,这意味着我们必须使用 Alchemy 的内部 int-to-object 映射。挖掘中间的 AS3 代码(要查看它,将ACHACKS_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;    
}

注意:虽然这很有趣,但它可能不是解决此问题的最佳方法。这可能不是从 Alchemy 中获取数据并进入 Flash 的最快方法。为此,我建议使用 ByteArray 将数据复制进和复制出 Alchemy 的 RAM。有关该领域的一些技术,请参阅此SO question

于 2011-03-30T20:24:33.877 回答