J'essaie d'expérimenter certains OpenGL sur Android et je n'ai aucune expérience antérieure avec la programmation 3D. Donc, évidemment, j'ai fait quelques erreurs dans mon programme. p>
Lorsque j'ai rencontré un problème et j'ai trouvé que Y a-t-il un moyen de se débarrasser de tous ces appels explicites vers Glgeterror code> a produit un code d'erreur, je viens d'ajouter des appels sur glgeterror code> après chaque appel à une commande OpenGL dans mon code de dessin. Bien que cela ait travaillé et que j'ai trouvé mes erreurs de cette façon, mon code de dessin est maintenant deux fois plus grand et plus difficile à lire à mon avis. p>
Glgeterror Code> et appelez-le automatiquement? De préférence, mon application devrait juste abandonner avec une erreur indiquant quelle commande est responsable si une erreur opengl se produit. P>
5 Réponses :
Desktop OpenGL 4.3+ a prolongé les fonctionnalités de débogage et de rappel (bien que je n'ai aucune expérience avec celles). Mais en es il n'y a rien vraiment mieux. Malheureusement, la meilleure solution est toujours à ne pas écrire de autre que celui que vous pouvez également faire une emballage comme p> (en supposant que les autres langues devraient avoir Installations similaires) P> Mais je pense que ces solutions ne peuvent toujours pas être parfaitement équivalentes à no glgeterror code> S (ou peut-être seulement à certains points importants sélectionnés, comme la fin de chaque image ou quelque chose) et ne les introduisez que en masse lorsque quelque chose " ne fonctionne pas " em>. Glgeterror code> S du tout, concernant la lisibilité et la concision. P> P>
sur OpenGL ES Vous ne pouvez pas faire beaucoup mieux, si vous ciblez OpenGL ES 2.0, vous devez également utiliser certains outils de fournisseur (selon votre périphérique de référence / cible) pour vous aider dans le développement de Shader et le réglage de la performance.
vous. doit appeler Glerror dans une boucle forte>, par exemple en Java: p> mais laissant le code de production avec ces chèques est une mauvaise idée, Glerror est lent. Meilleure option consiste à encapsuler à l'intérieur d'une classe de journalisation qui désactive Glerror à moins qu'une erreur ait été trouvée dans la trame précédente. P> p>
à partir de la version 4.2 Android offre une option appelée "Activer OpenGL Traces" dans les options de développeur du téléphone. Si vous définissez cela sur "Call Stack sur Glgeterror", vous obtiendrez une sortie comme dans le journal. Dans ce cas, je passais une mauvaise énumération / int to GlenableclientState () code> pour déclencher l'erreur. Notez que l'erreur sera "consommée" en activant cette option et d'autres glgeterror () code> Les chèques ne signaleront plus cela. Au lieu de cela, vous pouvez maintenant enregistrer l'heure de mise en place glgeterror () code> dans votre code et juste grep la sortie du journal pour "Glgeterror:". P> P>
JIC, "Activer les traces OpenGL" est venu en 4.2 ... :)
Je ne suis pas capable de trouver "Activer les traces OpenGL" sur Oreo. Des idées pourquoi elles sont parties?
Il y a une meilleure approche de cette approche appelée AOP (programmation orientée forme). J'en ai eu une expérience en C # dans le passé (environ 7 ans de retour) avec Springframework et postSharp. Cette approche utilise de manière approfondie les techniques d'injection de code.
Ainsi, lorsque je suis confronté à ce problème (traçage des erreurs GL), il est apparu comme un problème classique pour AOP. Étant donné que l'injection de code introduit certaines pénalités de performance, je suppose que ce changement (activation de la journalisation GL) comme temporal et le gardera dans un correctif GIT pour les cas où je souhaite l'utiliser. P>
1) Tout d'abord, modifiez vos scripts de construction de grades:
Dans le script de construction de niveau supérieur, ajoutez ceci: p> dans le script de niveau d'application Ajoutez ceci: p> Ceci activera Plugin AspectJ en gradle. Ce projet (hébergé ici: https://github.com/uphyca/gradle-android-aspectj -plugin ) semble déprécié maintenant, mais cela fonctionne. Vous pouvez regarder une version plus récente ici: https://github.com/hujiangtechnology/gradle_plugin_android_aspecjx . Pour mes besoins (tissage de code Java de base), l'ancienne version a bien fonctionné.
Reconstruire pour trouver si vous avez des problèmes. P> 2) Ajoutez notre annotation que nous allons utiliser ultérieurement pour marquer des méthodes que nous voulons que notre aspect soit appliqué à: p> 07-18 12:34:37.715 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[<init>]: no error
07-18 12:34:37.715 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[draw]: no error
07-18 12:34:37.733 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[<init>]: no error
07-18 12:34:37.735 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[draw]: no error
07-18 12:34:37.751 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[<init>]: no error
07-18 12:34:37.751 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[draw]: no error
07-18 12:34:37.771 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[<init>]: no error
07-18 12:34:37.771 19167-19187/com.example.neutrino.maze D/GlEngine: GlState[draw]: no error
Vérifiez GLDEEBUNESSAGECALLBACK
void GLAPIENTRY
MessageCallback( GLenum source,
GLenum type,
GLuint id,
GLenum severity,
GLsizei length,
const GLchar* message,
const void* userParam )
{
fprintf( stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n",
( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ),
type, severity, message );
}
// During init, enable debug output
glEnable ( GL_DEBUG_OUTPUT );
glDebugMessageCallback( MessageCallback, 0 );
Cette fonction disponible à OpenGL 4.3+, qui est, Afaik, non portée à Android. khronos.org/registry/opengl-refpages/gl4/html/ ...
Il est disponible sous forme d'extension et utilisée dans le code XF86-Video-HwComposer.