0

LuaBind を使用して自分のゲームに Lua スクリプトを実装していますが、明確でないことの 1 つは、ゲーム内でスクリプトをライブでリロードするロジスティクスです。

現在、LuaBind C++ クラスluabind::objectを使用して、Lua コールバックへの参照を、それらを使用するクラスに直接保存しています。次にluabind::call_function、そのオブジェクトを使用して、C++ コードから Lua コードを呼び出すことができます。

これはまだテストしていませんが、スクリプトをリロードすると、すべての関数が再定義されると思いますが、古い関数への参照はluabind::object、C++ コードによって保持される形式で引き続き存在します。ゲーム内のスクリプト フックごとに手動で管理する必要なく、古いものを新しいものに交換できるようにしたいと考えています。

プロセスが機能するようにこれを変更するにはどうすればよいですか?

私が最初に考えたのは、関数への参照を直接保存するのではなく、代わりに関数名を保存し、呼び出すたびに名前で関数を取得することです。より良いアイデアを探しています!

4

1 に答える 1

2

私が最初に考えたのは、関数への参照を直接保存するのではなく、代わりに関数名を保存し、関数を呼び出すたびに名前で関数を取得することです。

クラスが既知の名前でグローバル関数を呼び出している場合、それで問題はほとんど解決します。事前に参照を取得する必要はありません。測定可能なパフォーマンスの違いはありません。call_functionとにかく、関数名を文字列として渡すことをサポートしていると思いますよね?


通常、Lua スクリプトがコールバックを登録するときに、関数値への参照を保存します。その場合、Lua スクリプトがローカル、匿名などの関数を登録できるため、名前を保存するよりもはるかに優れています。


現在行っているように、実際に前もって値を取得する必要がある場合 (実際にそれを行う理由はありませんが、必要であると仮定します)、間接的なレイヤーを追加します。グローバル名をカプセル化する LuaFunctionReference クラスを持つことができます。インスタンス化中に、グローバルに含まれる関数への参照を取得します。これらのオブジェクトは、そのようなすべての参照のリストを維持するファクトリから取得できます。スクリプトをリロードすると、factory/manager/pool/etc. オブジェクトは参照を繰り返し処理し、それ自体を更新するため、システム全体のクラスに隠れているすべての参照が更新されます。

于 2012-05-04T19:21:55.947 に答える