Bonjour,
Je fais un jeu complexe et multithreadé. J'ai décidé de faire communiquer les différents threads de manière asynchrone et générique par un système d'events. Mais j'ai l'impression d'avoir construit une usine a gaz, et j'ai peur que la performance finale ne soit très affectée par ce système.

Les particularités de mes besoins sont qu'un même event doit pouvoir être multicasté sur plusieurs threads différents, et doit être effacé proprement quand tout le monde l'a traité.

Je suis donc parti sur une classe Event qui ressemble a cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
class Event
{
private:
   unsigned m_refCount;
protected:
   Event();
   virtual ~Event();
public:
   void grab();
   void release();
   unsigned getCount();
};
je dérive ensuite event autant que nécessaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
class InputEvent : public Event;
class KeyboardEvent : public InputEvent;
class KeyboardKeyEvent : public KeyboardEvent;
class GameEvent : public Event;
...
Je créé ensuite des classes EventReceiver et EventSender afin de gérer le routage et le stockage des events, ainsi que le comptage des référence. Elles seront templatées afin que la file puisse ne traiter qu'une catégorie d'events plus ou moins précise.

Quand je recois un event, j'utilise typeid et dynamic_cast pour récupérer les informations.


Ce design est idéal en terme de fonctionnalités, je sais que ce système d'events s'adaptera à tout ce que je vais lui balancer. par contre, entre le RTTI (dynamic_cast, destructeur virtuel) et le comptage de références, j'ai bien peur que ca ne soit beaucoup trop intensif. Il y a aussi le problème de la fragmentation mémoire, car j'aurais beaucoup d'events créés et détruits. Je pensais utiliser un allocateur pour limiter les dégâts.

D'une manière générale, mon approche est elle réaliste ? Existe t il des optimisations afin d’alléger la charge ? Qu'utilisez vous pour transmettre des informations entre threads dans des programmes complexes ?