web-dev-qa-db-ja.com

どのC ++シグナル/スロットライブラリを選択する必要がありますか?

QTを使用しないプロジェクトでシグナル/スロットライブラリを使用したい。私にはかなり基本的な要件があります:

  1. 2つの関数を任意の数のパラメーターで接続します。
  2. 信号は複数のスロットに接続できます。
  3. 信号/スロット接続の手動切断。
  4. まともなパフォーマンス-アプリケーションはフレームベース(つまり、イベントベースではない)であり、各フレームで接続を使用したいと思います。

libsigc ++とBoost.Signalsの比較 を読みました。 Boost.Signalsのパフォーマンスが低下していることも読みました。ただし、他にもライブラリがあることはわかっており、どのライブラリを選択すればよいかまだわかりません。

シグナル/スロットライブラリに関する推奨事項はありますか?

38
kshahar

まず、とにかくboost :: signalを試してみてください。アプリケーションである特定のケースで試すまで、十分な速度が得られないと思い込まないでください。

それが十分に効率的でない場合、多分 FastDelegate のようなものがあなたのニーズに合うでしょうか? (私はそれを試しませんでしたが、boost :: signalが適していないように見えるいくつかのケースではそれが素晴らしい解決策であると聞きました)。

とにかく、アプリケーションで各フレームのシグナルを使用する場合は、シグナルシステムを、各フレームと呼ばれるオブジェクト/ファンクターを保持するコンテナーなど、より単純なものに置き換える価値があるかもしれません。シグナルは、ループサイクルを動的にする(各フレームと呼ばれる関数を変更できる)よりも、即時の「イベント」管理を可能にするように作られています。 (私は 私自身の解決策 (更新:それは非常に古くて古風です)私はゲームで頻繁に使用し、たとえばパフォーマンスに問題はないので、似たようなものが役立つかもしれません)。

18
Klaim

非常に高速なイベントライブラリ Gamedev.netフォーム

最近取り組んでいたコードをプロファイリングしたとき、boost :: signals関数が一番上に浮かんでいるのを見て驚いてがっかりしました。知らない人のために、boost :: signalは、C#で見られるようなデリゲートベースのイベント処理のためにboost :: bindと一緒に使用できる非常に便利なシグナル/スロットライブラリです。堅牢で、機能的で、柔軟性があります。それはまた、信じられないほど、恐ろしく遅いことを学びました。 boost :: signalを使用する多くの人にとって、イベントを呼び出すことはめったにないので、これは問題ありません。私はオブジェクトごとにフレームごとにいくつかのイベントを呼び出していましたが、予測可能な結果が得られました。

だから私は自分で書いた。柔軟性がやや劣り、機能的です。誰もが実際にイベントを使用する傾向に合わせて最適化されています。また、イベントの呼び出しは、boost :: signalよりも15〜80倍高速です。

リンクを参照してください

15
Dustin Getz

あなたがリストした2つは、私が知っている間、唯一の価値があります。私が見たすべてのものは、libsigc ++が最高のパフォーマンスで出てくることを示しています。比較で見たように、boostの構文が少しきれいですが、少しだけである場合があります。

私は個人的にlibsigc ++を使用していて、満足しています。 Libsigc ++は、はるかに多くのプロジェクトで使用されているようです。私のパッケージマネージャーをざっと見ると、libsigc ++ 2に依存する100以上のプロジェクトがリストされています。私の意見では、特にパフォーマンスの利点と他の重要な違いがないことを考慮すると、それだけでバランスを傾けるのに十分です。

私はlibsigc ++ 2と言います。

5
Catskul

最近、connectがプロジェクトの目標に対してあまりにも多くのオーバーヘッドを生み出していたプロジェクトを継承しました。プロファイリングにより、シグナルでのミューテックスの使用が明らかになりました。これは、シグナルの使用法を考えると不要です。 documentation ごとにダミーのミューテックスに置き換えられ、成功しました。ミューテックスは「大幅に遅い」ので、必ず必要です。これは、この投稿をざっと読む他の人にとって役立つかもしれません。

オリジナルtypedef boost::signals2::signal_type<void()>::type signal_type;

新しいtypedef boost::signals2::signal_type<void(), boost::signals2::keywords::mutex_type<boost::signals2::dummy_mutex> >::type signal_type;

5
fionbio

私は Sigslots に投票します、私は他のいくつかの選択肢(boost、libsig ++、Fas​​tDelegates)を試しましたが、どれもjust私が望んでいたこと:自動on-object-destruction切断を使用して、匿名の方法で関数をバインドします。

Sigslotsは、完全に読み取り可能なC++であり、高速でシンプルであり、邪魔にならずに作業を実行できるため、私たちにとって素晴らしいものでした。複数のライブラリから使用する場合は、次の追加が必要になる場合があります。

COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;

すでに定義されているオブジェクト関連のリンクの問題を回避するため。

4
Rodrigo Lopez

私は以前にlibsigc ++を使用しましたが、それは非常に簡単でした。パフォーマンスのペナルティはそれほど大きくないと思います。実際、いくつかの場所で関数ポインターの代わりにスロットを使用するのが好きになることを学びました。

注意すべき点の1つは、最後に使用したとき(2年以上前)、接続を通過するパラメーターは最大6つに制限されていたことです。

私はブーストライブラリの経験がないので、そこであなたを助けることはできません。

ブーストsignals2ライブラリを使用しましたが、非常に遅いです。ブースト信号を使用したオブジェクトの構築では、ブースト信号スタックによって99%のプロセッサ時間が消費されます。単一の単純なスロットで信号を発する場合も、非常に大きなオーバーヘッドがありました。 libsigc ++を試してみましたが、かなり高速です。 Libsigc ++は非常に高速で柔軟なようです。9つのブースト信号と9つのlibsigc ++信号を使用した40000オブジェクトの作成:

3
asaenko

考慮すべきもう1つのsig-slot実装:

http://code.google.com/p/ting/wiki/SignalSlotUsage

それは最高のものであるふりをしませんが、それでも、存在する権利を持っている別のものです。

1
Ivan

私はlibsig ++を使用していませんが、それを読みました。シグナルとスロットに関する私の以前の経験は、Qtからのものであり、Boostからのものです。どちらも利用できない場合は、埋め込みコード(動的メモリ割り当てなし)と「通常の」c ++コード(接続時の動的メモリ割り当て)の両方に存在する独自のシグナルおよびスロットライブラリ(ksignals)を試すことができます。

あなたはそれを見つけることができます:www.kjellkod.cc/signalandslots

このページでは、KSignalsとBoost信号の比較も確認できます。

Speed vise ksignalsは非常に高速で、コード的には非常に軽量です。非常に使いやすく、理解しやすく、必要に応じて変更できる必要があります。

頑張ってよろしくKjellH

1
user200188

見栄えのするこの代替実装についてはどうですか: http://endl.ch/content/fastsig

0
Vincent Rich

別のオプションは YSignalSlot です。使ってみました。かなりいいと思います。

0
yigityuce