8
votes

Mise en route avec un jeu basé sur la tuile dans QT en utilisant QGraphicsSscene et QGraphicsView

Je vais commencer à programmer un jeu de carreaux 2D à Qt et lisez les classes QGraphicsScene et QGraphicsView destinées à l'affichage et à la manipulation de nombreux objets 2D.

Ma question est que ce sera réalisable de créer un monde avec beaucoup de carreaux utilisant QGraphicsSscene? Puis-je ajouter le monde entier à la fois tuile-by-cartiller ou devrais-je essayer de mettre en œuvre quelque chose pour limiter un peu la zone? J'ai lu que Qgraphicssscene peut gérer des "milliers d'articles", mais une carte de tuile 2D peut facilement être vraiment, vraiment grosse (200x200 carreaux? Pas que beaucoup, mais c'est déjà 40 000 objets qui sont beaucoup).

La carte va également être à peu près statique, il serait donc possible de le dessiner comme une grosse pixmap, mais cela vous empêche vraiment d'utiliser toutes les trucs de fantaisie dans QGraphicsscene, tels que manipulant des clics de souris sur des objets indépendants, etc. Au sommet de que je vais dessiner le joueur, les PNJ et ainsi de suite, qui ne seront pas alignés sur la grille de tuiles. Y a-t-il des trucs d'optimisation pour utiliser de nombreux objets statiques et certains dynamiques sur eux?

utilise qgraphicssscène et qgraphicsview View même une bonne idée du tout ou devrais-je essayer de rechercher une alternative à l'intérieur de Qt ou peut-être une bibliothèque différente et plus orientée jeu?

Merci d'avance


1 commentaires

Avec des versions récentes de QT, il est possible d'accroître de manière significative les performances en spécifiant OpenGL en tant que rendu au lieu du rendu de logiciel par défaut: u-> graphiqueview-> setviewport (nouveau QopenglWidget);


4 Réponses :


2
votes

qgraphicsscene a la capacité de peindre uniquement ce qui est représenté dans la vue, tout le reste se trouve dans l'index de la scène. Vous avez des options différentes pour la configuration de la scène et de la vue pour optimiser votre utilisation spécifique. Ce n'est pas parce que vous avez 40 000 carreaux dans votre indice de scène, cela ne signifie pas que vous devez peindre cela beaucoup. Vous n'avez vraiment que autant que possible dans la résolution de votre vue.

En outre, il existe des options de mise en cache si vos articles sont statiques, ils doivent alors être calculés une seule fois et peuvent être récupérés à partir d'une cache pixmap.

En fin de compte, je pense que c'est tout à fait valable de votre temps pour l'essayer. Il convient d'être assez facile pour vous de vous moquer d'un test où vous remplissez votre scène avec un très grand nombre de tuiles et essayez simplement de faire défiler la vue. Je pense que ce n'est pas tellement une préoccupation avec le nombre de carreaux que vous avez, mais plutôt à quel point les graphismes sont complexes dans la vue actuelle étant peinte.


1 commentaires

Merci pour la grande réponse! Je vais essayer de l'essayer. Comme vous l'avez dit, même si cela ne marche pas, ce n'est pas comme si j'avais perdu un peu de temps.



9
votes

Vous devez utiliser qgraphicsview.

the 40 000 jetons int La documentation QT est votre meilleur exemple pour examiner de près. Il traite de la complexité du grand nombre d'éléments, de les dessiner à plusieurs échelles et beaucoup plus.

jouer avec l'exemple et vous verrez que toutes les puces constituent une grande photo si vous effectuez un zoom arrière et que vous pouvez sélectionner et déposer plusieurs jetons à n'importe quelle vue, ou vous pouvez zoomer assez pour voir certains texte sur une puce individuelle. Il faudra du temps pour comprendre chaque partie, mais c'est un exemple très approfondi à regarder.

dans le chips.cpp Source, il montre comment il peut toujours fonctionner rapidement en utilisant une instruction "StevelofDEDetail" ou de la variable de LOD basée sur la transformation stockée dans une option de style.

La vue graphique QT a été optimisée pour faire beaucoup de choses que vous avez parlé de votre question, mais il faut un certain temps pour comprendre comment l'aborder.

Si vous avez toujours des problèmes avec la taille de la carte que vous souhaitez utiliser, je stockerais des mises en page de carreaux sur le disque dur et chargez celles dont vous avez besoin lorsque vous en avez besoin et enlevez celles que vous n'avez pas besoin de la scène si nécessaire.


2 commentaires

Les liens sont morts.


Liens fixes. Prendre plaisir.



2
votes

Je travaille sur un projet similaire et j'utilise une grille de 30x30 de QGraphicsPixMapitsPixMapitems persistants. Lorsque la vue de la carte change, le QGraphicsScene iTère sur la partie de la matrice de carte actuellement en vue, appelant SetPixMap sur chaque carreau pour la modifier vers le nouveau type de carreau. Cela fonctionne assez bien et je n'ai aucune plainte de performance jusqu'à présent.


0 commentaires

2
votes

Je suis d'accord avec ce qui a été dit. Je fais Jeux basés sur QGraphicsView pendant des années (si vous êtes sur Linux, demandez à votre colis. Gestionnaire de Kdiamond ou de Palapeli Si vous aimez), et pendant que le rendement rendu a été un problème lorsque Qgraphicsview a été lancé il y a d'abord des années, ces problèmes sont maintenant généralement résolus.

Ce que vous devriez vous préoccuper est la consommation de mémoire. L'exemple des puces peut avoir autant de puces que vous souhaitez avoir des carreaux, mais ces puces ne sont pas conservées en mémoire comme pixmaps. Si chaque tuile est une image de taille fixe 50x50px, c'est déjà xxx


0 commentaires