1

私は錬金術asmで宣言された変数を持っています:

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

次のようなデータを入力できます。

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

私が理解できないのは、そのasm「buffer」変数の参照をactionscriptに取得する方法です。

(私は1つの方法を考えました...私がしたことは、錬金術asmから「バッファー」をスローし、それをactionscriptでキャッチすることでしたが、残念ながら、多くのメモリがリークしているようです)。

これを行うためのより良い代替手段はありますか?

パフォーマンスが重要であり、デフォルトの錬金術マーシャリングを使用するのは遅すぎることに注意してください。

4

1 に答える 1

2

asm数値をやり取りするためだけのものです。つまり、Alchemyの内部のintからオブジェクトへのマッピングを使用する必要があります。中間の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にデータをコピーしたり、RAMからデータをコピーしたりすることをお勧めします。その分野のいくつかのテクニックについては、このSOの質問を参照してください。

于 2011-03-30T20:24:33.877 に答える