簡體   English   中英

我應該選擇哪個C ++信號/插槽庫?

[英]Which C++ signals/slots library should I choose?

我想在不使用QT的項目中使用信號/插槽庫。 我有一些基本的要求:

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

我已經閱讀了libsigc ++和Boost.Signals之間比較 我還讀過Boost.Signals的性能不佳。 但是,我知道還有其他圖書館,但我仍然不確定應該選擇哪個圖書館。

對於信號/插槽庫有什么建議嗎?

首先,嘗試使用boost :: signal。 不要以為它不會足夠快,直到您嘗試適合您的特定情況的應用程序為止

如果效率不夠高,也許像FastDelegate這樣的東西會滿足您的需求? (我沒有嘗試過,但聽說在某些情況下boost :: signal似乎不合適,這是一個不錯的解決方案)。

無論如何,如果在您的應用程序中每幀使用信號,則可能有必要用更簡單的方法來代替信號系統,例如容納將被稱為每幀的對象/函數的容器。 使信號更多以允許立即進行“事件”管理,而不是使循環動態化(允許更改稱為每個幀的功能)。 (我有自己的解決方案 (更新:它現在已經非常古老和陳舊),我經常在游戲中使用它,例如,我對性能沒有任何問題,因此類似的東西可能會有所幫助)。

Gamedev.net表單上的非常非常快的事件庫

在分析一些我最近正在研究的代碼時,我驚訝和沮喪地看到boost :: signals函數浮動到頂部。 對於那些不知道的人來說,boost :: signals是一個非常有用的信號/插槽庫,可以與boost :: bind一起用於基於委托的事件處理,例如C#中的sees。 它功能強大,功能強大且靈活。 據我所知,它的運行速度也非常慢。 對於許多使用boost :: signals的人來說,這很好,因為他們很少調用事件。 我在每個對象的每個幀中調用了多個事件,並且結果可預測。

所以我寫了我自己的。 靈活性和功能稍差。 它針對每個人實際使用事件的方式進行了優化。 而且事件調用比boost :: signals快十五到八十倍。

見鏈接

您所列出的兩個是我所知道的僅有的兩個值。 我所看到的一切都表明libsigc ++在性能方面表現出色。 正如您在比較中所看到的,在某些情況下,boost的語法稍微好一點,但只是一點點。

我個人使用過libsigc ++,並對此感到滿意。 Libsigc ++似乎被更多的項目使用。 在我的包管理器中快速瀏覽,列出了100多個依賴libsigc ++ 2的項目。 在我看來,僅憑這一點就足以平衡平衡,尤其是考慮到性能優勢和缺乏其他顯着差異的情況。

我說的是libsigc ++ 2。

最近繼承了一個項目,其中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;

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

Sigslots對我們來說很棒,因為它是完全可讀的C ++,它快速,簡單,並且可以正常工作。 一件小事,如果要在多個庫中使用它,可能需要添加:

COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>;

避免已經定義的對象相關的鏈接問題。

我已經使用了boost signal2庫,但是它非常慢。 在構建帶有增強信號的對象時,增強信號會消耗99%的處理器時間。 在具有單個模擬時隙發射的信號上,其開銷也很大。 我嘗試使用libsigc ++,它的速度明顯更快。 Libsigc ++似乎非常靈活快速地創建帶有9個boost信號和9個libsigc ++信號的40000個對象:

我以前使用過libsigc ++,這非常簡單。 我認為這不會對性能造成太大影響,事實上,我學會了喜歡在一些地方使用插槽而不是函數指針。

要注意的一件事是,自上次使用它(2年前)以來,它僅限於通過連接傳遞的最多六個參數。

我沒有使用Boost庫的任何經驗,所以我在這里不能為您提供幫助。

我沒有使用過libsig ++,但已經閱讀了。 我以前在信號和插槽方面的經驗來自Qt,而Boost則來自。 如果您沒有它們可用,則可以嘗試使用我自己的信號和插槽庫(ksignals),它們既適用於嵌入式代碼(無動態內存分配)又適用於“普通” c ++代碼(連接時的動態內存分配)。

您可以在以下網址找到它:www.kjellkod.cc/signalandslots

在該頁面上,您還可以找到一個比較:KSignals Vs Boost信號。

Speed Vise ksignals是非常快速且極其輕巧的代碼。 它應該非常易於使用,理解並在需要時進行修改。

祝你好運Kjell H

要考慮的另一種信號槽實現:

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

它並不假裝是最好的,但仍然是擁有生存權的另一個。

另一個選項可以是YSignalSlot 我用了 我覺得還不錯。

這個看起來不錯的替代實現又如何呢: http : //endl.ch/content/fastsig

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM