2010-03-04 5 views
0

Je crée un jeu graphique similaire à Java. Dans le jeu, je peins un tableau 2d d'objets Tile sur un JPanel. Ces objets Tile représentent le sol. J'ai une feuille de sprite .bmp qui contient toutes les textures que je veux utiliser pour peindre. Chaque fois que le joueur se déplace, les tuiles visibles par le joueur doivent être redessinées.Meilleure option de performance pour dessiner à partir d'une feuille de sprite en utilisant Java Swing

Ma question est une question de performance. J'ai implémenté ceci dans le passé où les Tiles étendent JPanel et chaque Tile affiche juste le segment approprié de la feuille de sprite en utilisant le bufferedImage.getSubImage(), alors que le parent JPanel appelle simplement paint() sur tous les Tiles dans le tableau 2d. Cela a bien fonctionné pour les petites cartes 30x20 dans le projet précédent, mais je ne suis pas sûr que cela fonctionnerait sur le jeu actuel.

Dois-je utiliser la même approche ou existe-t-il une autre solution possible pour accélérer les temps de tirage? Est-ce que la classe Tile devrait étendre un autre composant Swing ou AWT tel que BufferedImage ou cela n'aura-t-il pas d'effet?

Merci.

+0

Eh bien, je pense que c'est mieux pour vous d'essayer les choses d'abord, et puis quand un problème spécifique surgit de votre implémentation, revenez ici et demandez ... ce ne serait pas génial ... c'est vraiment difficile de travailler sur problème quand il n'y a pas de problème ... juste une pensée! – ultrajohn

+0

Je finirai probablement par le faire, mais je me suis dit que si je demandais d'abord un meilleur code pour commencer, je pourrais gagner du temps et ne pas avoir à revenir pour d'autres questions. – Wes

Répondre

2

Vous pouvez utiliser un seul composant pour le tableau (au lieu d'un par dalle) et faire en sorte que chaque tableau soit peint. Un moteur de rendu séparé peut gérer la peinture individuelle des carreaux pour rendre la solution plus modulaire. C'est une approche similaire utilisée par un JTable et le rendu de ses cellules.

Vous n'êtes pas sûr de la performance de getSubImage(), cela peut valoir la peine d'extraire (et de mettre en cache) les images individuelles au premier plan.

Regardez également uniquement les cellules repeintes qui changent (si ce n'est déjà fait).

+0

Si j'utilise un seul composant pour peindre le carreau, comment pourrais-je repeindre uniquement les carreaux visibles? Ne devrais-je pas simplement appeler repaint() sur le composant unique qui permettrait de repeindre le tout? Merci pour les suggestions. – Wes

+0

Vous définissez votre modèle pour stocker les détails du tableau, le composant (vue) obtiendrait alors les détails de chaque tuile du modèle. L'ajout du concept d'une fenêtre (une vue d'une partie du tableau) peut également aider à résoudre le problème. – objects

2

Ce tile-based game fonctionne bien sur les grands écrans: 1900 x 1200 pixels, 60 x 36 pixels. La mise à l'échelle des images vers le rectangle de destination semblait consommer la plus grande partie du budget de rendu. Il y a plus de discussion here.

+0

Merci, je vais vérifier. – Wes

Questions connexes