Y a-t-il un moyen de définir un point d'arrêt symbolique qui déclenchera lorsqu'un appel de fonction OpenGL définit n'importe quel état autre que GL_NO_ERROR code>? Preuves initiales suggère
OpenGL_Error_break code> est destiné à servir à ce sujet, mais cela ne casse pas. P>
3 Réponses :
Je pense que ce qui pourrait vous empêcher de sortir du problème consiste à Capture OpenGL es images (faites défiler jusqu'à "Capture OpenGL ES Cadres"), qui est maintenant prise en charge par XCode. Au moins c'est comme ça que je débrouge mes jeux OpenGL. P>
En capturant les cadres lorsque vous connaissez une erreur, vous pouvez identifier le problème dans la pile OpenGL sans trop d'effort. P>
espérons que cela aide! p>
Ouais, la capture des cadres est une capacité très fraîche et je l'utilise de manière approfondie. Malheureusement, je dois d'abord remarquer que OpenGL est dans un état d'erreur, puis capturer manuellement le cadre, puis marcher les appels pour le cadre pour isoler l'erreur. Cela fonctionne, mais j'aimerais vraiment simplement vous casser automatiquement. Cela me ferait un peu de temps et semble que cela devrait être possible. Merci pour votre temps.
Oui, je comprends que vous voulez le faire automatiquement ... Je ne sais pas si cela est possible avec Xcode. Va voir si je trouve autre chose
Enveloppez vos appels OpenGL pour appeler détails: em> p>
Ajouter cette macro à votre projet (du projet Oolongengine): P>
Recherchez tous vos appels OpenGL manuellement ou avec une regex appropriée. Ensuite, vous avez deux options exemplaires affichés pour le Glgeterror code> après chaque appel en mode de débogage. Dans la méthode Wrapper crée un point d'arrêt conditionnel et vérifiez si la valeur de retour de
Glgeterror code> est quelque chose de différent de
GL_NO_ERROR code>. P>.
#define check_gl_error () ({Glenum __Error = Glgeterror (); if (__ __ error) printf ("Opengl 0x% 04x en% S \ N", __Error, __fonction__); (__Error? Non: oui );}) code> p>
glviewport () code> appel: p>
Glviewport (...); CHECK_GL_ERROR () CODE> LI>
GLDEEBUNVIEWPORT (...); code> et implémentez
gldebugviewport code> comme indiqué dans (1). Li>
ol>
Cela fonctionnerait certainement, mais remontant à travers un grand projet de saupoudrer de manière conditionnelle glgeterror code> partout est exactement ce que je ne veux pas avoir à faire. Je suis surpris qu'il n'y ait pas un symbole que je peux juste casser.
Basé sur l'approche de Lars, vous pouvez réaliser ce suivi des erreurs automatiquement, il est basé sur une magie de préprocesseur et générant des fonctions de stub.
J'ai écrit un petit script python qui traite l'en-tête OpenGL (j'ai utilisé le Mac OS X un dans l'exemple, mais il devrait également fonctionner avec celui de l'IOS). p>
Le script Python génère deux fichiers, un en-tête à inclure dans votre projet Partout où vous appelez OpenGL comme ceci (vous pouvez nommer l'en-tête, mais vous voulez nommer l'en-tête, vous le souhaitez): P>
GLuint _gl_debug_error_glGenLists(GLsizei range) { GLuint var = glGenLists(range); CHECK_GL_ERROR(); return var; }
Truc cool! @Mattwilding: Je pense que Torsten mérite plus la prime que moi. S'il vous plaît changer si c'est toujours possible!
@Larsschneider, les 24 heures ont expiré, donc c'est à vous pour toujours. Le mieux que je puisse faire est de déplacer la coche verte. Merci à vous deux pour votre contribution.
Comment utilisez-vous ce script Python en Xcode?
@Jonny Le plus facile devrait être de simplement ajouter le en-tête et
Vous pouvez créer un arrière-plan NSTIMER qui incendie tous les 3 images ou permet de surveiller les codes d'erreur et de faire une exception / avoir un point d'arrêt.
Cela s'approcherait de me alerter immédiatement des conditions d'erreur, mais l'objectif principal est de me donner une pipetack au moment de l'erreur afin que je puisse facilement suivre l'appel incriminé.
Pour référence, le code ne semble pas fonctionner. J'ai roulé mon one: Gist.github.com/3352303