39

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

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

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

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

4

11 に答える 11

18

まず、boost::signal を試してみてください。アプリケーションである特定のケースで試すまで、十分に高速でないと想定しないでください

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

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

于 2008-12-13T21:07:08.383 に答える
15

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

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

だから私は自分自身を書きました。柔軟性と機能がわずかに劣ります。誰もが実際にイベントを使用する傾向があるように最適化されています。また、イベントの呼び出しは、boost:: シグナルよりも 15 倍から 80 倍高速です。

リンクを参照

于 2009-09-11T22:34:11.277 に答える
5

最近connect、プロジェクトの目標に対してオーバーヘッドが多すぎるプロジェクトを継承しました。プロファイリングにより、シグナルでのミューテックスの使用が明らかになりました。これは、シグナルの使用法を考えると不要でした。ドキュメントに従ってダミーのミューテックスに置き換えて成功しました。ミューテックスは「大幅に遅い」ため、必要であることを確認してください。これは、この投稿をスキミングする他のユーザーに役立つ場合があります。

オリジナル 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;

于 2014-08-28T16:54:31.757 に答える
5

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

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

libsigc++2 と言います。

于 2009-09-11T22:30:07.563 に答える
4

私はSigslotsに投票しますが、他のいくつかの選択肢(boost、libsig ++、Fas​​tDelegates)を試しましたが、私が望んでいたことを実行しているようには見えませんでし

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

COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;

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

于 2010-12-30T09:39:14.427 に答える
3

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

于 2013-12-08T04:43:39.650 に答える
3

以前に libsigc++ を使用したことがありますが、非常に簡単でした。パフォーマンスが大幅に低下することはないと思います。実際、いくつかの場所で関数ポインタの代わりにスロットを使用することを好むようになりました。

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

ブースト ライブラリの使用経験がないため、お手伝いできません。

于 2008-12-11T16:57:07.247 に答える
1

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

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

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

于 2010-03-11T13:32:45.193 に答える
1

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

www.kjellkod.cc/signalandslots で見つけることができます。

このページでは、比較も見つけることができます: KSignals Vs Boost シグナル。

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

幸運を祈ります Kjell H

于 2010-01-07T14:48:02.237 に答える
0

http://endl.ch/content/fastsigという、見栄えの良い代替実装についてはどうでしょうか。

于 2014-11-26T17:08:59.940 に答える