2012-03-19 4 views
4

Donc je fais un jeu en C++. Et je suis à une fourchette sur la route.Meilleure façon de rendre/animer 2d en utilisant openGL?

Je planifie maintenant comment je vais gérer l'animation et optimiser le rendu. Je rends en utilisant le mode immédiat qui m'a été dit était très lent. Je vais à la recherche d'alternatives et puis il y a un tas de façons différentes, et cela dépend de la façon dont vous gérez les animations, alors j'ai pensé que je demanderais juste ce qui serait un bon moyen de faire les deux. Pour les animations, j'ai pensé à utiliser des séquences d'images stockées en mémoire, mais seulement tester avec une séquence de 50 images, la mémoire a sauté à 200 mb, alors qu'il était 30 auparavant. (Il n'y a pas de fuite, il reste à 200, mais si j'ai de gros niveaux, il semblerait que je manquerai de mémoire). Est-ce que les feuilles de sprite pourraient aider dans ce cas? On m'a dit que la raison pour laquelle les atlas ou les feuilles de sprite étaient utilisées était parce que la liaison de différentes textures était une opération coûteuse, donc la seule façon de travailler serait de mettre toute la texture que j'utiliserais pour le niveau 1 par exemple texture donc je ne lie qu'une fois. Est-ce possible dynamiquement?

L'utilisation d'un PNG gigantesque serait-elle meilleure en mémoire que le chargement de 50 PNG?

Toute aide concernant l'optimisation du rendu ou des informations sur les inconvénients de ces techniques d'animation serait vraiment appréciée!

Répondre

4

On m'a dit était très lent

Je recommande d'ignorer cela. À moins d'utiliser un nombre démesuré de sprites (des dizaines de milliers), votre goulot d'étranglement lira les données des textures, ce qui est limité par le taux de transfert de la mémoire de la carte vidéo. En d'autres termes, si vous avez une fenêtre d'affichage de 1280x1024 et que vous dessinez une texture de 1280x1024 qui couvre toute la fenêtre (et toutes les cartes de texels à pixel d'écran), votre FPS va chuter et les VBO ne vous aideront pas. Le mode immédiat est également plus facile à utiliser pour les 2D que les VBO. Continuez donc à utiliser le mode immédiat jusqu'à ce que vous décidiez d'utiliser un nombre important de sprites.

Je pensais à l'aide de séquences d'images stockées dans la mémoire

Vous devez entasser autant de sprites que vous pouvez dans la texture unique. Changer de textures produira un grand ralentissement, donc la meilleure idée serait d'utiliser une texture énorme (4096x4096 ou plus - 16384x16384 serait bien) et charger tous les sprites que vous pouvez y intégrer.Cela peut être fait en utilisant glSubTexImage2D. Stocker chaque texture distincte de trame produira un énorme ralentissement. Veuillez noter que vous n'avez pas besoin de stocker des sprites sur un disque fusionné en une seule texture. Vous pouvez les coller ensemble pendant le chargement.

L'utilisation d'un PNG gigantesque serait-elle meilleure en mémoire que le chargement de 50 PNG?

Format de fichier d'image PNG stocké sur le disque. Cela n'a rien à voir avec OpenGL. Une fois que vous chargez la texture, ce n'est plus un "png" - il est complètement décompressé. Donc, comment vous stockez des données d'image sur le disque est à peu près hors de propos. Cela affectera la vitesse de chargement de l'image mais la performance de la texture/l'utilisation de la mémoire n'a rien à voir avec le format de stockage de l'image. Si vous êtes à court de mémoire, vous devrez faire quelque chose à ce sujet - mettre en œuvre le streaming d'actifs de jeu, ou ajuster le «budget» sprite/texture du niveau.

+1

Merci pour votre aide! Heureux de savoir que je n'ai pas à passer ma technique de rendu aux VBO. A propos de la partie PNG, c'est bon à savoir! Mais je faisais simplement référence au fait de savoir si charger 1 énorme serait mieux que de charger 50 images plus petites et de les garder en mémoire, mais je suppose que les deux prendraient la même quantité d'espace dans la mémoire, n'est-ce pas? –

4

Utilisez plutôt de VBO du mode immédiat: http://www.opengl.org/wiki/Vertex_Buffer_Object

feuilles Sprite ont deux avantages, tout d'abord, comme vous avez remarqué, il vous suffit de lier une texture. En termes de mémoire, les feuilles ne vous donnent que l'avantage d'être continues en mémoire (pas de fragmentation), mais la quantité réelle de mémoire ne sera pas moindre. Le chargement d'un grand .png serait certainement beaucoup plus rapide en termes de vitesse de chargement comparé à 50 plus petits. Une chose que vous devez savoir est que vous pouvez libérer la mémoire réelle de l'image après l'avoir chargée sur votre texture openGL. Sinon, vous l'avez dans la mémoire RAM et GPU, ce qui n'a pas beaucoup de sens. Une autre chose que vous pouvez faire est d'utiliser différentes techniques d'animation comme les images clés ou l'animation squelettique (également une approche valide en 2D) pour déplacer les sprites au lieu d'enregistrer une image/sprite supplémentaire pour chaque état. Cela réduirait certainement beaucoup l'utilisation de la mémoire GPU et RAM!

Espérons que cela a aidé!

+0

Merci pour l'explication! Cela fait vraiment la lumière. –

Questions connexes