2010-07-14 9 views
1

Je travaille sur le développement d'un moteur de jeu 2D assez robuste comme base pour que d'autres jeux puissent être construits en tant que projet for fun (je sais qu'il y a déjà des choses qui font ça, mais c'est pas drôle).C++ passage de message de type exception

J'essaie de trouver un bon moyen de faire passer des messages entre les classes dans le moteur. Au début, je pensais à utiliser une hiérarchie d'exceptions et à les lancer chaque fois que quelque chose l'exigeait. Mais au fur et à mesure que je me développais, je me suis rendu compte qu'il y avait un grand nombre d'exceptions jetées, car elles étaient utilisées pour des choses assez courantes (une partie des sous-routines qui traitent la pathfinding et la localisation des unités). le plateau de jeu beaucoup). Les exceptions étaient utilisées pour des choses comme le chemin parcouru par une unité dans le chemin et devait contourner cela, il lancerait une exception TileOccupied et le pathfinding pourrait gracieusement gérer cela et continuer. Comme on peut s'y attendre, cela a créé beaucoup d'exceptions.

Internet m'a dit que les exceptions sont coûteuses en raison de tout le traitement d'exécution dont elles ont besoin. Mais ils gèrent parfaitement ce dont j'ai besoin, c'est-à-dire pouvoir renvoyer un message à l'appelant même à travers des sous-routines de branchement pour indiquer quand quelque chose s'est passé ou quelque chose n'était pas comme prévu.

Existe-t-il un moyen propre/efficace de le faire en C++? Ou suis-je en train de structurer les choses très mal si j'utilise ce type de notification? Je suis encore à apprendre, donc toutes les suggestions seraient grandement appréciés (et je suis prêt à lire/apprendre toutes les références que vous pouvez jeter mon chemin)

Modifier Je suis en train de le faire dans la norme C++ BTW . Je l'écris sur linux, et je veux qu'il compile et soit exécutable indépendamment de la plate-forme. J'utilise actuellement Boost.

+1

Des exceptions doivent être utilisées pour des conditions exceptionnelles. Ne les utilisez jamais pour une logique de programme "normale". – Cogwheel

+0

Je m'en rends compte maintenant. C'est pourquoi j'essaie de trouver une meilleure façon de gérer le même style d'utilisation sans avoir à utiliser des exceptions – Veaviticus

+0

Utilisez-vous un cadre? Boost, .Net, etc? – Caladain

Répondre

2

Bien que cela nécessite un enregistrement explicite, cela sonne comme si vous vouliez des rappels (facilités par exemple par Boost.Function) ou des signaux (comme Boost.Signals/Signals2).

+0

Après un peu de recherche, recommanderiez-vous d'utiliser l'implémentation de Boost ou tout simplement en utilisant libsigC++? Je cherche autant d'efficacité que possible au moment de l'exécution, et cet article semble rendre le coup moins efficace. http://marc.info/?l=libsigc-list&m=112279476018630 ​​ – Veaviticus

+0

@vea: Si vous vous souciez de la performance, vous devriez le mesurer pour votre cas d'utilisation, notez également que ces mesures sont de 2004. Personnellement, je resterais avec Boost si vous utilisez déjà des composants à moins qu'il y ait vraiment un problème de performance dans cette partie. –

+0

@George Je sais que c'est un peu hors sujet et sur la route d'une façon, mais avez-vous des suggestions sur la façon de faire des timings comme ça? – Veaviticus

0

Y a-t-il une raison pour laquelle vous n'avez pas utilisé une file d'attente d'événements et/ou une configuration d'observateur?

+1

La raison principale serait que je n'ai aucune idée de ce que ce sont. Je vais commencer à chercher – Veaviticus

0

Les exceptions sont la mauvaise façon de procéder. La suggestion habituelle serait la conception directe d'événements/d'auditeurs, mais cela devient rapidement incontrôlable dans tout système non trivial. Je vous dirigerais vers un whiteboard design pour les communications lâches.

Questions connexes