2017-08-14 8 views
-2

Out of the blue (même si j'ai peut-être manqué une mise à jour automatique), la méthode flip() pyglet sur mon PC est devenu environ 100 fois plus lent (mon script va d'environ 20 à 0.2 FPS, et le profilage montre que flip() est à blâmer).La façon dont pyglet échange les buffers avant et arrière (`flip()`, wrapper pour wglSwapLayerBuffers d'OpenGL) sous Windows peut être 100 fois trop lent

Je ne comprends pas complètement cela mais comme mon système d'exploitation est Windows 10, la méthode semble juste être un moyen d'exécuter le cycle de double-tampon OpenGL wglSwapLayerBuffers en python. Tout le reste semble avoir une vitesse normale, y compris les programmes qui utilisent OpenGL. Cela s'est produit avant et s'est corrigé après un redémarrage, donc je n'ai pas vraiment cherché plus loin à l'époque.

Maintenant, redémarrer ne change rien. J'ai mis à jour mon pilote GPU, j'ai essayé de désactiver vsync, j'ai cherché des processus non liés qui pourraient utiliser beaucoup de mémoire et/ou de mémoire GPU. J'ai réinstallé la dernière version stable de pyglet.

Maintenant, je ne sais pas comment commencer même résoudre ce ...

Voici un exemple minimal qui me imprime 0,2s au lieu de 20 ans.

from pyglet.gl import * 

def timing(dt): 
    print(1/dt) 

game_window = pyglet.window.Window(1,1) 

if __name__ == '__main__': 
    pyglet.clock.schedule_interval(timing, 1/20.0) 
    pyglet.app.run() 

(Dans pyglet.app.run(), le profilage me montre que c'est la méthode flip() qui prend essentiellement tout le temps). Edit: mon vrai script, qui affiche des images fréquemment mises à jour avec pyglet, ne provoque aucune augmentation de l'utilisation du GPU (j'ai également vérifié l'effet d'un programme aléatoire (Minecraft) pour vérifier que l'outil de surveillance GPU que j'utilise fonctionne et cela provoque une augmentation). Je pense que cela exclut la possibilité que je n'ai pas assez de puissance de calcul disponible en raison d'un problème non lié.

Répondre

0

OK, j'ai trouvé un moyen de résoudre mon problème dans ce groupe Google conversation sur un autre problème avec la même méthode: https://groups.google.com/forum/#!topic/pyglet-users/7yQ9viOu75Y (les modifications proposées dans la réponse de claudio Canepa, à savoir faire flip() lien vers la version GDI du même fonction au lieu de wglSwapLayerBuffers, ramène les choses à la normale).

Je ne sais toujours pas pourquoi wglSwapLayerBuffers s'est comporté si bizarrement dans mon cas. Je suppose que des problèmes comme le mien font partie de la raison pour laquelle la version GDI est "recommandée". Cependant, comprendre pourquoi mon problème est encore possible serait toujours agréable, si quelqu'un obtient ce qui se passe ... Et avoir à se mêler d'une bibliothèque relativement fiable et respectée juste pour effectuer l'une de ses tâches les plus élémentaires se sent vraiment, vraiment sale, il faut être une solution plus sensible.