7
votes

Comment arrêter Open Gl Renderer

Pour une raison quelconque, j'ai besoin de redémarrer un GLSURFACEVIEW.Renderer pour que je souhaite un peu de temps dans mon application pour appeler setgrenderer (NewRenderer) une seconde fois, que Android n'aime pas et jette une exception illégale qui dit "Setrenderer a déjà été appelé "...

Maintenant, je sais que c'est parce que le rendu est attaché à la GLSurfaceView et j'ai besoin d'engourdi ce rendu à la vue de la surface, afin que je puisse appeler à nouveau setrenderer.

Quelqu'un a un Solution pour cela?

PS: Le code ressemble à ceci: xxx

merci!


0 commentaires

3 Réponses :


4
votes

4 commentaires

Eh bien, il y a une fuite de mémoire dans l'application et nous n'avons plus de temps pour trouver la cause (nous la recherchons depuis deux semaines). Nous devons redémarrer le fil de rendu toutes les x secondes afin de ne pas geler. Pause du rendu (c.-à-d. Appel de l'onpause avant le deuxième Setrenderer) ne vous aide pas et l'application jette encore cette exception lorsque le thread de rendu est en pause


Comme le DOC mentionne, il n'est pas autorisé à appeler SetRenderer deux fois. Vous devez trouver une autre façon d'atteindre ce que vous voulez. La seule façon (sale) de faire cela serait de détruire la vue et de créer une nouvelle (puis, appelez SetRenderer pour la 2e fois)


Déjà fait ça, Boss! Mais toujours d'une exception illégale. C'est comme si ça ne réinitialise pas le graphiqueView après Ceci.GraphcView = NULL; ceci.graphicview = (glsurfaceview) this.findviewyID (r.id.graphicview);


Cela ne réinitialisera pas votre glsurface. Il suffit de définir votre PTR local sur NULL, puis vous obtenez la même vue que avant. Vous devez appeler this.graphicview = New GlsurfaceView (); et remplacer la vue avec ID r.id.graphicview par ce nouveau. Ensuite, vous pourrez appeler à nouveau Setrenderer



5
votes

a trouvé la réponse ici , ce "Lemondev" a sauvé ma vie:

On peut arrêter / détruire une vue sur la surface OpenGL et définir la nouvelle GLSURFACEView un nouveau rendu en appelant l'onpace () et postdelayed La destruction avec un gestionnaire et une runnable, comme celle-ci: < Pré> xxx

Ceci créera un nouveau rendu et mettra en pause la GLSURFACEView. L'application "détruira" "détruire" quelques articles internes que vous ne pouvez pas toucher avec le SDK ... Après cela, vous pouvez détruire le GLSURFACEView, en créer un autre et définir le nouveau rendu à celui-ci.

My Le problème est maintenant que les textures ne sont pas encore rafraichies mais, toujours, c'est génial!


0 commentaires

2
votes

J'ai trouvé un moyen plus facile d'actualiser les textures. Dans votre appel d'activité, invalide () puis dans votre classe de visualisation de la surface, votre onddrawframe continuera à être appelé à chaque fois que vous pouvez charger votre texture ici et ainsi que votre travail sera effectué!


0 commentaires