6

皆さん、Lua の状態を複製する方法はありますか?

私のゲーム アプリケーションでは、Lua 仮想マシンの初期化手順はかなり重いです (多くのスクリプトが一度に読み込まれるため、約 1 秒)。自律型エージェントごとに個別の Lua VM があり、エージェントが作成されると、Lua の初期化が FPS に大きな影響を与えます。

次のスキーマについて考えています。「事前にフォークされた」Lua の状態を維持し、エージェントごとに単純に複製するのはどうですか? 出来ますか?

4

4 に答える 4

4

完全に個別の VM ではなく、自律エージェントごとに Lua のコルーチンを使用することを検討したいと考えています。コルーチンはより軽量なソリューションですが、アプリケーションに適している場合と適していない場合があります。

アーキテクチャを変更できない場合は、LuaJITを試すことができます。目的に応じて初期化十分に高速になる場合があります。

より多くのオプション:

  1. Rings : "Rings は、Lua 内から新しい Lua 状態を作成する方法を提供するライブラリです。また、作成者 (マスター) と作成された (スレーブ) 状態の間で通信する簡単な方法も提供します。"

  2. Pluto : "Pluto は、ユーザーが "Lua ユニバース" の任意の大部分をフラット ファイルに書き込み、後でそれらを同じまたは別の Lua ユニバースに読み戻すことができるライブラリです。

于 2009-09-05T17:34:21.617 に答える
1

Lanes (ダウンロードドキュメント) もあり、私が知っているすべての同様の製品との比較内にあります。

Rings について、比較シートには次のように記載されています。

Rings は個別の Lua 状態を提供しますが、マルチスレッドは提供しません。これによりシンプルになりますが、複数の CPU コアを使用することはありません。

注: 比較シートによると、レーンは「非循環テーブル」のみをマーシャリングします。サイクルを実行し、関数のマーシャリング、値上げなどを行います。また、Lua 状態間のコピーを直接コピーとして実行し、途中でコンテンツを文字列化する必要はありません。これにより高速になります。

于 2009-09-06T08:26:03.560 に答える
1

注意、Lua 5.2 以降で動作します

この VM へのアクセスを制限するだけです。_G (グローバルな Lua 状態) に依存しない、必要なすべての機能を備えた 1 つのインスタンスを作成し、クライアントごとに個別のテーブルを作成します。グローバル名前空間として使用するもの。テーブルを現在の _G として設定するには、_ENV を使用します。これは、1 つの投稿で説明するのが非常に難しいトピックです。つまり、新しいクライアント用に「仮想」_G を準備し、クライアントのコードの _G を置き換えるだけです。始めるようにアドバイスするところがあります。

ここがポイントです。

local _ENV = t -- change the environment. without the local, this would change the environment for the entire chunk

削除するだけlocalで、それ以降のすべてのコードの _ENV を変更できます。実験頑張ってください!

PS _ENV および _G テーブルのメタテーブルを設定し、そのメタテーブルの変更を禁止できることを忘れないでください。Lua はここで非常に柔軟です。

于 2016-07-23T01:08:12.753 に答える
1

Linux を使用している場合は、Lua 作成者の 1 人によるLPSMベースの実験的ライブラリであるlperを試すことができます。

于 2009-09-06T09:12:47.793 に答える