2008-12-11 104 views
35

我想在不使用QT的項目中使用信號/插槽庫。我有相當基本的要求:我應該選擇哪個C++信號/插槽庫?

  1. 連接兩個函數與任意數量的參數。
  2. 信號可以連接到多個插槽。
  3. 手動斷開信號/插槽連接。
  4. 體面的表現 - 應用程序是基於框架的(即不基於事件),我想在每個框架中使用連接。

我讀過comparison between libsigc++ and Boost.Signals。我還讀過Boost.Signals的糟糕表現。但是,我知道還有其他庫,我仍然不確定應該選擇哪個庫。

是否有任何信號/插槽庫的建議?

+0

是任何解決方案頭只實現?你知道僅使用標準庫函數/類型的實現嗎?我們使用boost :: signals但是想擺脫這個相當大的依賴。 – nietras 2015-07-09 08:35:08

+0

鏈接已死亡... – ManuelSchneid3r 2016-10-03 18:31:59

+0

@ ManuelSchneid3r感謝,幸運的是,它仍然可以從archive.org – kshahar 2016-10-04 11:44:29

回答

17

首先,試試boost :: signal。不要認爲它會不夠快,直到你嘗試在你的應用中的特定情況下

如果效率不夠高,也許像FastDelegate這樣的東西將滿足您的需求? (我沒有嘗試過,但聽說在某些情況下boost :: signal似乎不適合)。無論如何,如果在你的應用程序中使用每一幀的信號,可能需要用更簡單的東西代替信號系統,就像容納將被稱爲每一幀的對象/函子的容器。信號更多地用於允許立即的「事件」管理,而不是使循環週期動態化(允許改變稱爲每個幀的功能)。 (我有my own solution(更新:現在非常陳舊),我在遊戲中大量使用,例如我對性能沒有任何問題,所以也許類似可能會有所幫助)。

+0

谷歌代碼鏈接已經死了你的解決方案。 – RegularlyScheduledProgramming 2016-11-28 16:56:05

+0

@RegularlyScheduledProgramming謝謝,我更新了轉到github的鏈接,但現在有點過時了。我使用更現代化的東西,但它不是開源的,也不是通用的,而是我正在使用的遊戲。 – Klaim 2016-11-30 10:22:58

3

我以前使用過libsigC++,它非常簡單。我認爲它不會對性能造成太大影響,而且我確實在一些地方學會了使用槽而不是函數指針。

有一點需要注意的是,截至上次我使用它(2年前)時,它被限制爲通過連接傳遞的最多六個參數。

我對增強庫沒有任何經驗,所以我無法幫到你。

5

你列出的兩個是我知道的唯一兩個值得。我看到的所有內容都顯示了libsigC++以最佳性能出現。正如您在比較中看到的那樣,有些情況下boost的語法稍微漂亮一些,但只是一點點。

我個人使用過libsigC++,很滿意。 LibsigC++似乎被大量更多的項目所使用。快速查看我的軟件包管理器列出了100多個依賴於libsigC++ 2的項目。在我看來,這足以讓平衡傾斜,特別是考慮到性能優勢和缺乏其他顯着差異。

我說libsigC++ 2。

13

Very, very fast event library on Gamedev。淨形式

如果在分析了一些代碼,我一直 工作最近,我很驚訝 並遺憾地看到的boost ::信號 功能浮到頂部。對於 那些你們誰不知道, 的boost ::信號是可以用來 旁邊的boost ::綁定的 基於委託的事件處理諸如 一個在C#中看到一個奇妙的有用 信號/插槽庫。它功能強大,靈活。這也是,我學到了,令人難以置信的是, 恐怖地慢。對於很多使用boost :: signals的人 而言,這很好,因爲他們很少調用事件。 我打電話給每個對象每幀 幾個事件,並有可預測的結果。

所以我寫了我自己的。略小於 靈活而有特色。它爲 進行了優化,以便大家傾向於實際使用事件。而且事件 的調用次數比boost :: signals快十幾倍到八十倍。

見鏈接

1

我沒有使用過libsig ++,但我讀了它。我以前的信號和插槽經驗來自Qt,而Boost則有點不足。如果你沒有它們中的任何一個,那麼你可以嘗試用於嵌入式代碼(無動態內存分配)和「正常」C++代碼(連接時動態內存分配)的自己的信號和插槽庫(ksignals)。

你可以找到它:www.kjellkod.cc/signalandslots

在頁面還可以找到一個比較:Vs的加速信號KSignals。

速虎鉗ksignals是非常快速和非常輕巧的代碼明智的。它應該很容易使用,理解並且如果需要修改它。

好運 問候 謝爾^ h

4

我會投票支持Sigslots,我已經嘗試了幾個其他的替代品(升壓,libsig ++,FastDelegates)和似乎沒有做只是我想要的東西:在一個匿名的方式與自動對對象的綁定功能整合在一起 - 破壞斷開。

Sigslots對我們來說非常棒,因爲它非常易於讀取C++,它非常快速,簡單,而且不會妨礙工作。一個次要的事情,如果你想從幾個圖書館使用它,你可能需要添加:

COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>; 

,以避免已定義的相關對象聯的問題。

3

我已經使用boost signals2庫,它非常慢。在使用升壓信號構建物體時,升壓信號堆棧消耗了99%的處理器時間。在信號發出單個simle插槽也有非常大的開銷。我嘗試libsigC++,它顯着更快。 LibsigC++似乎是非常快速和靈活 創造40000個對象與9個升壓信號和9 libsigC++信號:

5

最近那裏繼承了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;