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 :
je d�rive ensuite event autant que n�cessaire :
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 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.
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; ...
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 ?
Partager