2011-03-16 10 views
23

私は現在ゲームサーバー(エンジンではありません)を構築しており、プラグインシステムのように拡張可能にしたいと考えています。
私が見つけた解決策は、スクリプト言語を使用することです。ここまでは順調ですね。RubyとC++のスクリプト言語としてのLua

RubyまたはLuaを使用するかどうかはわかりません。 Luaは埋め込みが簡単ですが、Rubyにはより大きなライブラリと構文があります(私の意見では)。問題は、C++でスクリプト言語としてRubyを使用するのは簡単なことではありませんが、Luaでは非常に簡単です。

これについてタフしますか? Rubyをスクリプト言語として使用するための提案(私はSWIGを試しましたが、Luaを使うほどうまくはありません)

ありがとうございました。

+5

ルアがあまりに単純すぎると思って、Rubyを組み込むのが難しいと思うなら、おそらくあなたはPythonを考慮する必要がありますか? – Macke

+2

コードベース(特にサーバー)を公開する場合、本当に大きなライブラリが必要ですか?あなたは、サンドボックス化に関してユーザが悪用できる危険なライブラリ機能を取り除くために、より多くの努力を費やすことができます。 –

答えて

8

私はこれまでLuaを広く使用してきました。

Luabindは本当に使いやすいですが、SWIGのような外部生成器は必要ありません。docは素晴らしいです。コンパイル時間はまともです。

私が見た最大の問題:luaは主に書き込み専用です。あなたは本当にクラスを持っていませんが、構文的な砂糖(オブジェクト['key']はobject.keyと書くことができます)を持つ連想配列しかないので、あまり知られていない関数で 'メンバ'それについては、後で副作用があります。

この理由から、私はPythonを好むでしょう。 Boost :: PythonはLuabindの基礎であるため、どちらも同様のAPIを持っています(Luabindは以前よりも簡単に構築できましたが、もう使用できませんでした)。機能面では、かなり同等です。

直接関係はありません。これらは、マルチスレッド環境で確実に使用することはできません(サーバーの複雑さによって異なります)。

  • N個のPythonスレッド:GIL(グローバルインタープリタロック)が途中にあります。長いI/O操作とC関数への呼び出しを除いて、スレッド内の変数を使用するたびにロックされています。
  • ルアにはコルーチンがありますが、並列化はできません。
  • Rubyのスレッドは本当にスレッドではありませんが、あなたはまだスレッドごとに1つのenvironementを作成することができますが、彼らは(Cの++機械を除いて)通信することができません

ノートのLuaのコルーチンに似て。これは特にLuaでは簡単です。

+1

Luaでは、マルチスレッドのことは[LuaLanes](http://kotisivu.dnainternet.net/askok/bin/lanes/)を使って解決できます。 – jpjacobs

+4

@ Calvin1602 Ruby(1.9以降)の最新バージョンは、実際のシステムレベルのスレッドを使用しています。それはまだGILを持っていますが、これはPythonと同等の立場にあります。 – dunedain289

+0

@ dunedain289:ありがとう、ありがとう。 @jpjacobs:私はLuaLanesを知っていますが、私はそれを試したことはありません。ちょっと "不自然"な感じがしますが、私はそれに行きましょう。 – Calvin1602

0

私は学ぶのが最も簡単だった/ほとんどのゲーマーがそれを使っています。あなたはそれがあなたの顧客に可能な限りアクセス可能であることを望んでいます。

+0

なぜゲーマーの数は関係がありますか? –

5

Squirrelについて知りたいことがあります。私はそれがLeft 4 Dead 2によって使用されるスクリプト言語だと信じています。これはlua(オブジェクトとクラスを使用する)よりも進歩しており、探しているもののように聞こえるC++アプリケーションに簡単に埋め込まれることを意図しています。

+0

ありがとうございます。 Squirrel言語をC++に埋め込む方法についての書籍はありますか? – bl00dshooter

+0

私が知る限り、それはまったく新しいスクリプト言語です。 '3.0'はあなたをばかにさせてはいけません。2004年以来ずっと使われていましたが、他のスクリプト言語ほど使われていません。ドキュメント(メインページにリンクされている)は良いようです。 – James

10

以前はRubyをC/C++に埋め込んでいましたが、それは非常に難しいようでした。あなたが直面するだろう課題がたくさんあります:C/C++からRubyのに呼び出し

  • が書き込まれる(呼び出すための一つの層を、例外をキャッチする1)機能の2層を必要と
  • バックを呼び出しますRubyはそれが

は、私は確信していることができごみにしたいものを収集しますので、ルビーからC/C++は、割り当てを慎重に追跡する必要が前後にデータを移動する通常のSWIG型作業

  • を必要とし、このことできますが完了しますが、それは電子のようでした私にとっては非常に難しいですが、あなたがエントリポイントの最小限でRubyにジャンプすることができる場合にのみ実行可能です。

  • 2

    私はluajitを推奨しますが、スピードだけでなく、新しいffiライブラリのために、最大限の相互通信を促進することをお勧めします。 Luaにはモジュールの音色もあり、新しいものは作成が非常に簡単です。これはstdlibの欠如を補うものです。

    1

    ルアは、C++(またはC)とそれ自身の間でデータを非常に簡単にシャトルする機能を持っています。基本的には、データをスタックにプッシュ/ポップするだけで、2つの間で通信することができます。同時に複数のLua環境を稼働させることは非常に簡単です(その機能が必要な場合)。 Luaはガベージコレクトされた言語ですが、C++コードに固執する必要があるデータに対してはLuaがそのようにするのを防ぐのは簡単です。拡張可能なプラグインシステムを作成するには、Luaを土台にしておくのが簡単です。実行時にプラグイン(この場合はスクリプト)を入れ替えることもかなり簡単です(これはRubyでも当てはまるかもしれませんが、私は知っているほど十分に分かりません)。

    あなたのスクリプトで扱えるオブジェクト指向のものがどれくらいのものであるかを考えてください。 Luaは関数、テーブル、メタテーブル、プロトタイプを使用して、オブジェクト指向プログラミングを実装します。それを好む人もいるし、そうでない人もいる。個人的に私はそれが時にはちょっとしたものであれば、面白いと思った。 Rubyを使用していないので、私はそれについて話すことはできませんが、オブジェクト/クラスのサポートの必要性を測りたいかもしれません。

    あなたの状況では、プロジェクトをどの程度速く実行したいのかを考慮する必要があります。あなたと他の人が指摘しているように、RubyはC++に埋め込むのが難しいのに対し、Luaは埋め込みにくいです。時間はいつも貴重なもので、できるだけ早く何かをしたいのなら、おそらくルアが最善の策です。

    関連する問題