2012-02-02 15 views
7

Comenzaré a programar un juego basado en mosaico 2D en Qt y leeré sobre las clases QGraphicsScene y QGraphicsView que están destinadas a mostrar y manejar gran cantidad de 2D objetos.Primeros pasos con un juego basado en mosaico en Qt usando QGraphicsScene y QGraphicsView

Mi pregunta es si será factible crear un mundo con muchas teselas usando QGraphicsScene? ¿Puedo agregar todo el mundo de una vez, azulejo a azulejo, o debo tratar de implementar algo para restringir un poco el área? He leído que QGraphicsScene puede manejar "miles de elementos", pero un mapa de mosaicos en 2D puede ser muy, muy grande (200x200 tiles, no tantos, pero eso ya son 40,000 objetos, que es mucho).

El mapa también será bastante estático, por lo que es posible dibujarlo como un gran mapa de píxeles, pero esto realmente le impide usar todas las cosas elegantes en QGraphicsScene, como manejar clics del mouse en elementos independientes, etc. de eso voy a dibujar al jugador, a los NPC, etc., que no estarán alineados con la cuadrícula. ¿Hay algo de optimización para usar muchos objetos estáticos y algunos dinámicos encima de ellos?

¿Está utilizando QGraphicsScene y QGraphicsView incluso una buena idea o debería tratar de buscar una alternativa dentro de Qt o quizás una biblioteca diferente, más orientada a juegos?

Gracias de antemano

+0

pasa con las versiones recientes de Qt, es posible aumentar el rendimiento de manera significativa mediante la especificación OpenGL como el procesador en lugar del software de render por defecto: 'ui-> graphicsView -> setViewport (nuevo QOpenGLWidget); ' – vsz

Respuesta

8

Debe usar QGraphicsView.

El 40,000 Chips en la documentación de Qt es su mejor ejemplo para examinar de cerca. Se trata de la complejidad de un gran número de elementos, dibujándolos en múltiples escalas y mucho más.

Juega con el ejemplo y verás que todas las fichas realmente componen una foto grande si alejas y que puedes seleccionar, y arrastras y sueltas varias fichas en cualquier vista, o puedes acercar lo suficiente para ver algo de texto en un chip individual. Tomará tiempo entender cada parte, pero este es un ejemplo muy completo para analizar.

En la fuente chips.cpp, muestra cómo todavía se puede ejecutar rápidamente mediante el uso de una instrucción de conmutación variable "LevelOfDetail" o lod basada en la transformación almacenada en una opción de estilo.

Qt Graphics View ha sido optimizado para hacer muchas de las cosas que usted ha mencionado en su pregunta, pero lleva un tiempo entender cómo abordarlo.

Si aún tiene problemas con el tamaño del mapa que desea usar, almacenaría diseños de mosaicos en el disco duro y cargaría los que necesite cuando los necesite y eliminará los que no necesita. de la escena como sea necesario.

+0

Los enlaces están muertos. – mrgloom

+0

Enlaces fijos. Disfrutar. – phyatt

1

QGraphicsScene tiene la habilidad de pintar sólo lo que se está representando en la vista, todo lo demás sólo se sienta en el índice de la escena. Tiene diferentes opciones para configurar cómo funcionan la escena y la vista para optimizar su uso específico. El hecho de que tenga 40k fichas en su índice de escena, no significa que necesite pintar tantas. Realmente solo tiene tantos como se muestran en la resolución de su vista.

Además, existen opciones de almacenamiento en caché si sus artículos son estáticos, solo se deben calcular una vez y se pueden recuperar de un caché de pixmap.

En última instancia, creo que vale la pena su tiempo para probarlo. Debería ser bastante fácil para ti simular una prueba donde puedes poblar tu escena con una gran cantidad de fichas y simplemente intenta desplazarte por la vista. Creo que no se trata tanto de la cantidad de fichas que tienes, sino de cuán complejos son los gráficos dentro de la vista real que se está pintando.

+0

¡Gracias por la gran respuesta! Voy a probarlo. Como dijiste, incluso si no funciona, no es como si hubiera perdido una gran cantidad de tiempo haciéndolo. – Maush

2

Estoy trabajando en un proyecto similar y estoy usando una cuadrícula de 30x30 de QGraphicsPixmapItems persistentes. Cuando la vista del mapa cambia, el QGraphicsscene itera sobre la parte de la matriz de mapas que está actualmente a la vista, llamando a setPixmap en cada tesela para cambiarla al nuevo tipo de mosaico. Ha estado funcionando bastante bien y hasta el momento no tengo quejas de rendimiento.

2

Estoy de acuerdo con lo que se ha dicho. He estado haciendo QGraphicsView-based games durante años (si está en Linux, pregunte a su gestor de paquetes por KDiamond o Palapeli si lo desea), y aunque el rendimiento de representación ha sido un problema cuando QGraphicsView apareció por primera vez hace años, ahora estos problemas son en general resuelto

Lo que le debe preocupar es el consumo de memoria. El ejemplo de las fichas puede tener tantos chips como quieras tener fichas, pero esos chips no se guardan en la memoria como mapas de píxeles. Si cada baldosa es una imagen de tamaño fijo 50x50px, que ya

32bits*50px*50px*200*200 = 381,9 MiB 
+0

Muchas gracias, Palapeli es muy amable. Ahora, todavía tengo que probar KDiamond ... – CapelliC