2008-12-11 14 views
35

Quiero utilizar una biblioteca de señales/ranuras en un proyecto que no utiliza QT. Tengo requisitos bastante básicos:¿Qué biblioteca de señales/ranuras C++ debo elegir?

  1. Conecte dos funciones con cualquier cantidad de parámetros.
  2. Las señales se pueden conectar a múltiples ranuras.
  3. Desconexión manual de la conexión señal/ranura.
  4. Rendimiento decente: la aplicación está basada en marcos (es decir, no basada en eventos) y quiero usar las conexiones en cada cuadro.

He leído un comparison between libsigc++ and Boost.Signals. También he leído que Boost.Signals sufre un bajo rendimiento. Sin embargo, sé que hay otras bibliotecas y todavía no estoy seguro de qué biblioteca debería elegir.

¿Hay alguna recomendación para una biblioteca de señales/ranuras?

+0

¿Alguna de las soluciones solo implementaciones de encabezado? ¿Conoces una implementación que usa solo funciones/tipos de biblioteca estándar? Estamos utilizando señales boost :: pero queremos deshacernos de esta gran dependencia. – nietras

+0

El enlace está muerto ... – ManuelSchneid3r

+0

@ ManuelSchneid3r gracias, afortunadamente todavía está disponible en archive.org – kshahar

Respuesta

17

Primero, intente con la señal boost :: de todos modos. No suponga que no será lo suficientemente rápido hasta que intente en su caso específico que es su aplicación

Si no es lo suficientemente eficiente, tal vez algo como FastDelegate se adapte a sus necesidades? (No lo intenté pero escuché que era una buena solución en algunos casos donde boost :: signal no parece adecuarse).

De todos modos, si en su aplicación utiliza la señal de cada cuadro, puede valer la pena reemplazar el sistema de señal por algo más simple, como un contenedor que contenga objetos/funtores que se denominará cada cuadro. La señal está más hecha para permitir la administración inmediata de "eventos" que para hacer un ciclo de ciclo dinámico (lo que permite cambiar las funciones llamadas cada cuadro). (Tengo my own solution (ACTUALIZACIÓN: es muy antiguo y arcaico ahora) que uso mucho en un juego y, por ejemplo, no tengo ningún problema con el rendimiento, por lo que tal vez algo similar podría ayudar).

+0

El enlace de Google Code está muerto para su solución. – RegularlyScheduledProgramming

+0

@RegularlyScheduledProgramming Gracias, actualicé el enlace con la mudanza a github, pero ahora es un poco arcaico. Uso algo más moderno pero no es de código abierto ni está diseñado para ser genérico, es específico para el juego en el que estoy trabajando. – Klaim

3

He usado libsigC++ antes, y que era bastante sencillo. No creo que tenga mucho en el camino de las sanciones de rendimiento, y de hecho aprendí a gustar el uso de ranuras en lugar de punteros a las funciones en algunos lugares.

Una cosa a tener en cuenta era que a partir de la última vez que lo usé (hace 2 años o), se limita a un máximo de seis parámetros que se pasa a través de las conexiones.

que no tienen ninguna experiencia con la biblioteca de impulso, así que no puedo ayudarte.

5

Las dos que enumeró son las dos únicas que yo conozco. Todo lo que he visto ha demostrado que libsigC++ está en el mejor rendimiento. Como viste en la comparación, hay algunos casos en los que la sintaxis de boost es un poco más bonita, pero solo un poco.

, he utilizado libsigC++ y estoy feliz con él. LibsigC++ parece ser utilizado por muchos más proyectos. Una mirada rápida en mi administrador de paquetes enumera más de 100 proyectos que dependen de libsigC++ 2. Eso solo es suficiente en mi opinión para inclinar la balanza, especialmente teniendo en cuenta la ventaja de rendimiento y la falta de otras diferencias significativas.

Digo libsigC++ 2.

+0

Una adición. Hay un proyecto adicional para 'libsigC++' que es seguro para subprocesos: [extras de libSigC++] (http://libsigcx.sourceforge.net/) –

13

Very, very fast event library en GameDev.formas netas

Al perfilar un cierto código que había estado trabajando en recientemente, me sorprendió y consternado al ver a impulsar :: señales funciones que flotan en la parte superior. Para aquellos de ustedes que no son conscientes, impulso :: señales es una biblioteca señal/ranura maravillosamente útil que se puede utilizar junto impulso :: unen para manejar tales como se ve en C# evento basado delegado. Es robusto, funcional y flexible. También es, He aprendido, increíblemente, terriblemente lento. Para mucha gente que usa señales boost :: esto está bien porque llaman eventos muy raramente. Estaba llamando a varios eventos por cuadro por objeto, con resultados predecibles.

Así que escribí el mío. Un poco menos flexible y con características. Es optimizado para que todos tiendan a realmente usar eventos. Y la invocación al evento es de quince a ochenta veces más rápido que las señales boost ::.

ver enlace

+4

Aquí hay un enlace fijo para futuros espectadores. http://www.gamedev.net/topic/456646-very-very-fast-event-library/ –

1

No he utilizado libsig ++ pero he leído en ella. Mi experiencia previa con señales y ranuras es de Qt y un poco de Boost. Si no tiene ninguno de ellos disponible, puede probar mi propia biblioteca de señales y ranuras (ksignals) que existen tanto para código incrustado (sin asignación dinámica de memoria) como para código C++ "normal" (asignación dinámica de memoria al conectarse).

Se puede encontrar en: www.kjellkod.cc/signalandslots

A la página también se puede encontrar una comparación: KSignals Vs señales de Boost.

Speed ​​vise ksignals es muy rápido y extremadamente liviano. Debe ser muy fácil de usar, comprender y, si es necesario, modificarlo.

Buena suerte Saludos Kjell H

4

votaría por Sigslots, he intentado un par de las otras alternativas (impulso, libsig ++, FastDelegates) y ninguno parecía hacer simplemente lo que quería: funciones de unión juntos de una manera anónima con cambio automático de objetos -destrucción desconectada.

Sigslots fue genial para nosotros porque es perfectamente legible C++, es rápido, simple y hace el trabajo sin interponerse en el camino. Una cosa menor, si desea utilizarlo de varias bibliotecas puede que tenga que añadir:

COREEXTERN template class COREIMPEXP has_slots<SIGSLOT_DEFAULT_MT_POLICY>; 

para evitar problemas de enlace relacionadas con el objeto-ya definidos.

+1

Prefiero este también. Para que funcione con Clang y libC++ tuve que aplicar algunos parches encontrados en los foros de Sourceforge y hacer algunos ajustes yo mismo: https://github.com/catnapgames/SigSlot –

+1

Y como veo en la página de Sourceforge, también es seguro para hilos ! –

+0

parece que este tiene pérdida de memoria. – Jichao

3

He utilizado la biblioteca boost signals2, y es muy lenta. En la construcción del objeto con señales de refuerzo, el 99% del tiempo de procesador consumido por la pila de señales de refuerzo. En las señales que emiten con una sola ranura simle también tenía una sobrecarga muy grande. Intento libsigC++ y es significativamente más rápido. LibsigC++ parece ser muy rápido y flexible 40000 Creación de objetos con 9 señales de impulso y señales 9 libsigC++:

5

Recientemente heredado un proyecto donde connect estaba produciendo demasiado trabajo para nuestros objetivos del proyecto. El perfilado reveló el uso de un mutex en la señal, que no era necesario dado nuestro uso de señal. Se reemplazó con un mutex ficticio por documentation con éxito. El mutex es "drásticamente más lento", así que asegúrese de que lo necesita. Esto puede ser útil para otros que roban esta publicación.

original typedef boost::signals2::signal_type<void()>::type signal_type;

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

Cuestiones relacionadas