26

アプリのさまざまな部分を単純なスクリプトに移動して、C++ に関する十分な知識を持たないユーザーがさまざまな機能を編集および実装できるようにしたいと考えています。

これはリアルタイム アプリであるため、これらのスクリプトにはある種のマルチタスクが必要です。理想的には、C++ アプリがスクリプト関数を呼び出し、一時停止ポイント (Wait(x)) まで、または復帰するまで (C++ スレッドの下で) 実行し続けるようにしたいと考えています。待機中の場合は、期間が経過した後にアプリが次にループしたときにスクリプトを再開できるように、状態を保存する必要があります。

スクリプトは、理想的には、c++ クラスの単純なラッパー関数ではなく、c++ クラスを使用して、c++ クラス メソッドを呼び出すことができる必要があります。

これを実装するために膨大な時間を費やしたくないので、独自のスクリプト言語を作成するよりも、既存のスクリプト言語を使用することをお勧めします。Python と Lua を C++ アプリに統合できると聞きましたが、目標を達成するためにこれを行う方法がわかりません。

  • スクリプトは C++ 関数を呼び出せる必要があります
  • スクリプトは、特定の関数が呼び出されたときに「一時停止」できる必要があり (例: 待機)、C++ スレッドによって再び再開できる必要があります。
  • 高速である必要があります。これはリアルタイム アプリ用であり、多数のスクリプトが実行される可能性があります。

スクリプトを保存して再起動できる場合 (元のスレッドとは別のスレッドを使用する可能性があります)、マルチタスキング コードをかなり簡単にロールバックできます。

4

9 に答える 9

26

LuaまたはPythonのいずれかを使用できます。LuaはPythonよりも「軽量」です。Pythonよりもメモリフットプリントが小さく、私たちの経験では統合が簡単でした(この点での人々のマイレージは異なる場合があります)。同時に実行される一連のスクリプトをサポートできます。Luaは、少なくとも、希望する方法でスレッドの停止/開始をサポートします。

Boost.pythonは素晴らしいですが、私の(限られた)経験では、さまざまな環境用にコンパイルするのは難しく、かなり重いものでした。(私の意見では)Boostが必要になるという欠点があります。一部の人にとっては、それは問題ではないかもしれませんが、Boostが必要ない(またはBoostを使用していない)場合は、Boost.pythonを機能させるために大量のコードを導入しています。YMMV。

Luaは、複数のプラットフォーム(win32、Xbox360、PS3)のアプリに組み込まれています。x64で動作すると思います。Luabindを使用することをお勧めします。結局、2つの間に独自のインターフェイスを作成しましたが、それほど複雑ではありませんが、そのグルーコードを使用すると、多くの時間とおそらく悪化を節約できます。

ただし、どちらのソリューションでも、デバッグは面倒な場合があります。現在、アプリに埋め込まれているLuaスクリプトをデバッグするための適切なソリューションはありません。アプリでPythonを使用していないため、そこで利用できるツールについて話すことはできませんが、数年前は状況はほぼ同じで、デバッグが不十分でした。機能を拡張するためのスクリプトを用意するのは良いことですが、スクリプトのバグが問題を引き起こす可能性があり、見つけるのが難しい場合があります。

Luaコード自体は、そこで変更を加える必要がある場合に操作するのが面倒です。Luaコードベース自体に、追跡が困難なバグがあります。Boost::Pythonにも同様の問題があるのではないかと思います。

また、どのスクリプト言語でも、「プログラマー以外の人」が機能を拡張するためのソリューションであるとは限りません。そのように思えるかもしれませんが、スクリプトのデバッグまたはおそらくLuaのいずれかでかなりの時間を費やすことになるでしょう。

とはいえ、Luaには非常に満足しており、2つのゲームで出荷しています。現在、この言語から離れる予定はありません。全体として、数年前に利用可能だった他の代替手段よりも優れていることがわかりました。Python(およびIronPython)は他の選択肢ですが、経験に基づくと、Luaよりも手が重いようです。でも、そこで他の経験について聞いてみたいです。

于 2008-09-15T16:56:52.113 に答える
9

Luabindをご覧になることを強くお勧めします。これにより、Lua を C++ コードに統合することが非常に簡単になり、その逆も同様です。Lua で使用する C++ クラス全体を公開することもできます。

于 2008-09-15T15:19:01.600 に答える
5

最善の策は、lua (www.lua.org) または python (www.python.org) を埋め込むことです。どちらもゲーム業界で使用されており、どちらも extern "C" 関数に比較的簡単にアクセスでき、ここでは lua が有利です (データ型は lua と C の間で変換しやすいため)。C++ オブジェクトへのインターフェースは、あなたの側ではもう少し手間がかかりますが、Google、または lua または python ディスカッション フォーラムでこれを行う方法を調べることができます。

それが役立つことを願っています!

于 2008-09-15T15:27:16.040 に答える
3

Python を使用すると、やりたいことを確実に実行できます。 アプリケーションへの Python の組み込みに関するドキュメントは次のとおりです。 Luaもうまくいくと確信していますが、あまり詳しくありません。

スクリプトが Break または Wait 関数を定期的に呼び出す必要がある協調的なマルチタスクについて説明しています。おそらく、より良い解決策は、スクリプト言語を独自のスレッドで実行し、スクリプト言語とプログラムの残りの部分との間のインターフェイスにミューテックスまたはロックフリー キューを使用することです。そうすれば、Break() を頻繁に呼び出さないバグのあるスクリプトが誤ってプログラムをフリーズさせることはありません。

于 2008-09-15T15:22:44.413 に答える
2

SWIGを見てください。Pythonとのインターフェースに使用しましたが、他の多くの言語をサポートしています。

于 2008-09-15T17:04:42.577 に答える
2

Luaのデバッグ(そのルートに行く場合)に関しては、私はDeCodaを使用していますが、悪くはありません。IDEのふりをしますが、sortaは失敗しますが、デバッグプロセスをVisual Studioにアタッチして、ブレークポイントでコールスタックを下に移動することができます。そのバグを追跡するのに非常に便利です。

于 2008-12-20T17:54:31.383 に答える
2

ルアにもう一票。小さく、高速で、多くのメモリを消費しません (ゲームの場合、初期化時に大きなバッファを割り当て、そこにすべての Lua メモリ割り当てをリダイレクトするのが最善の策です)。tolua を使用してバインディングを生成しましたが、他にもオプションがあり、そのほとんどは boost.python よりもはるかに小さく/使いやすい (IMO) ものです。

于 2008-09-15T17:22:06.327 に答える
2

Boost.Pythonライブラリを見てください。あなたがやりたいことをするのはかなり簡単なはずです。

于 2008-09-15T15:18:15.767 に答える
1

Chを使用して C/C++ スクリプトを埋め込むこともできます。私が取り組んでいるゲーム プロジェクトに使用してきましたが、うまく機能しています。パワーと適応性の素晴らしいブレンド。

于 2008-09-15T16:08:43.650 に答える