皆さん、Lua の状態を複製する方法はありますか?
私のゲーム アプリケーションでは、Lua 仮想マシンの初期化手順はかなり重いです (多くのスクリプトが一度に読み込まれるため、約 1 秒)。自律型エージェントごとに個別の Lua VM があり、エージェントが作成されると、Lua の初期化が FPS に大きな影響を与えます。
次のスキーマについて考えています。「事前にフォークされた」Lua の状態を維持し、エージェントごとに単純に複製するのはどうですか? 出来ますか?
完全に個別の VM ではなく、自律エージェントごとに Lua のコルーチンを使用することを検討したいと考えています。コルーチンはより軽量なソリューションですが、アプリケーションに適している場合と適していない場合があります。
アーキテクチャを変更できない場合は、LuaJITを試すことができます。目的に応じて初期化が十分に高速になる場合があります。
より多くのオプション:
Lanes (ダウンロード、ドキュメント) もあり、私が知っているすべての同様の製品との比較内にあります。
Rings について、比較シートには次のように記載されています。
Rings は個別の Lua 状態を提供しますが、マルチスレッドは提供しません。これによりシンプルになりますが、複数の CPU コアを使用することはありません。
注: 比較シートによると、レーンは「非循環テーブル」のみをマーシャリングします。サイクルを実行し、関数のマーシャリング、値上げなどを行います。また、Lua 状態間のコピーを直接コピーとして実行し、途中でコンテンツを文字列化する必要はありません。これにより高速になります。
注意、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 はここで非常に柔軟です。
Linux を使用している場合は、Lua 作成者の 1 人によるLPSMベースの実験的ライブラリであるlperを試すことができます。