Je travaille sur un petit jeu PC à base de tuiles / sprites avec une équipe de personnes et nous rencontrons des problèmes de performances. La dernière fois que j'ai utilisé OpenGL, c'était autour de 2004. Je me suis donc appris à utiliser le profil principal, et je me trouve un peu confus.
Je dois dessiner environ 250-750 dalles 48x48 sur l’écran à chaque image, ainsi qu’environ 50 images-objets. Les tuiles ne changent que lorsqu'un nouveau niveau est chargé et les sprites changent tout le temps. Certaines des tuiles sont composées de quatre pièces 24x24, et la plupart (mais pas toutes) des images-objets ont la même taille que les tuiles. Beaucoup de tuiles et d'images-objets utilisent le mélange alpha.
En ce moment, je fais tout cela en mode immédiat, ce qui, je le sais, est une mauvaise idée. Néanmoins, quand l'un des membres de notre équipe essaie de l'exécuter, il obtient des taux de trame très mauvais (~ 20-30 ips), et c'est bien pire quand il y a plus de tuiles, en particulier lorsque beaucoup de ces tuiles sont du genre sont coupés en morceaux. Tout cela me fait penser que le problème est le nombre d'appels de tirage effectués.
J'ai pensé à quelques solutions possibles à ce problème, mais je voulais les présenter à des personnes qui savent de quoi elles parlent, pour que je ne perde pas mon temps en une chose stupide:
CARRELAGE:
- Lorsqu'un niveau est chargé, dessinez toutes les tuiles une fois dans un tampon d'images associé à une grande texture de klaxon, puis dessinez un grand rectangle avec cette texture sur chaque image.
- Placez toutes les tuiles dans un tampon de sommets statique lorsque le niveau est chargé et dessinez-les de cette façon. Je ne sais pas s'il existe un moyen de dessiner des objets avec différentes textures avec un seul appel à glDrawElements, ou si c'est même quelque chose que j'aimerais faire. Peut-être que juste mettre toutes les tuiles dans une grande texture géante et utiliser des coordonnées de texture amusantes dans le VBO?
SPRITES:
- Dessinez chaque image-objet avec un appel séparé à glDrawElements. Cela semble impliquer beaucoup de changement de texture, ce qui me dit que c'est mauvais. Les tableaux de texture sont-ils utiles ici?
- Utilisez un VBO dynamique en quelque sorte. Même question de texture que le numéro 2 ci-dessus.
- Point sprites? C'est probablement idiot.
Certaines de ces idées sont-elles raisonnables? Y a-t-il une bonne mise en œuvre quelque part sur laquelle je pourrais regarder?