2012-02-02 4 views
7

Я собираюсь начать программирование двумерной черепичной игры в Qt и прочитать о классах QGraphicsScene и QGraphicsView, которые предназначены для отображения и обработки большого количества 2D объекты.Начало работы с основанной на плитке игрой в Qt с использованием QGraphicsScene и QGraphicsView

Мой вопрос в том, что будет возможно создать мир с большим количеством плиток с использованием QGraphicsScene? Могу ли я добавить весь мир сразу по черепице, или я должен попытаться реализовать что-то, чтобы немного ограничить область? Я читал, что QGraphicsScene может обрабатывать «тысячи элементов», но карта 2D-плитки может легко получить действительно, действительно большую (200x200 плиток? Не так много, но это уже 40 000 объектов, что много).

Карта также будет довольно статичной, поэтому ее можно будет нарисовать как одну большую pixmap, но это действительно мешает вам использовать все причудливые вещи в QGraphicsScene, как обработка щелчков мышью на независимых элементах и ​​т. Д. Наверх из этого я собираюсь привлечь игрока, NPC и т. д., которые не будут привязаны к сетке плитки. Есть ли какие-то элементы оптимизации для использования множества статических объектов и некоторых динамических поверх них?

Является ли использование QGraphicsScene и QGraphicsView вообще хорошей идеей или я должен попытаться найти альтернативу внутри Qt или, возможно, другую, более ориентированную на игры библиотеку?

Заранее спасибо

+0

С последними версиями Qt, можно увеличить производительность значительно, указав OpenGL в качестве визуализатора вместо программного обеспечения по умолчанию визуализатора в: 'ui-> GraphicsView -> setViewport (новый QOpenGLWidget); ' – vsz

ответ

8

Вы должны использовать QGraphicsView.

40,000 Chips int Qt Документация - ваш лучший пример для тщательного изучения. Он имеет дело со сложностью большого количества элементов, рисует их в нескольких масштабах и намного больше.

Играйте с примером, и вы увидите, что все фишки на самом деле составляют большую фотографию, если вы уменьшаете масштаб, и вы можете выбрать и перетащить несколько фишек в любом виде, или вы можете увеличить масштаб, чтобы увидеть некоторый текст на отдельном чипе. Потребуется время, чтобы понять каждую часть, но это очень подробный пример для изучения.

В источнике chips.cpp он показывает, как он может работать быстро, используя оператор переключателя переменных LevelOfDetail или lod, основанный на преобразовании, сохраненном в опции стиля.

Qt Graphics View был оптимизирован для того, чтобы многое из того, о чем вы говорили в своем вопросе, но требуется некоторое время, чтобы понять, как подойти к нему.

Если у вас по-прежнему возникают проблемы с размером карты, которую вы хотите использовать, я бы сохранил макеты плитки на жестком диске и загрузил те, которые вам нужны, когда они вам понадобятся, и удалите те, которые вам не нужны при необходимости.

+0

Ссылки мертвы. – mrgloom

+0

Исправленные ссылки. Наслаждаться. – phyatt

1

QGraphicsScene имеет возможность только рисовать то, что в настоящее время представлены в виде, все остальное просто сидит в индексе сцены. У вас есть разные опции для настройки того, как работает сцена и представление, чтобы оптимизировать ваше использование. Просто потому, что у вас есть 40k плитки в вашем индексе сцены, не означает, что вам нужно рисовать много. У вас действительно только столько, сколько отображается в разрешении вашего вида.

Кроме того, существуют кеширующие параметры, если ваши элементы являются статическими, тогда их нужно вычислять только один раз и их можно извлечь из кеша pixmap.

В конечном счете, я думаю, что это стоит того, чтобы попробовать. Для вас должно быть довольно легко продумать тест, в котором вы заполняете свою сцену очень большим количеством фрагментов, и попробуйте прокрутить вокруг нее. Я чувствую, что это не столько забота о том, сколько у вас плиток, сколько насколько сложна графика в фактическом видении.

+0

Спасибо за отличный ответ! Я собираюсь попробовать. Как вы сказали, даже если это не сработает, это не то, что я потерял огромное количество времени. – Maush

2

Я работаю над подобным проектом, и я использую сетку 30x30 постоянных QGraphicsPixmapItems. Когда вид карты изменяется, QGraphicsscene выполняет итерацию над той частью массива карт, которая в настоящее время находится в поле зрения, вызывая setPixmap на каждом фрагменте, чтобы изменить его на новый тип плитки. Это работает довольно гладко, и до сих пор у меня нет жалоб на производительность.

2

Я согласен с тем, что было сказано. Я делал QGraphicsView-based games в течение многих лет (если вы работаете в Linux, спросите своего менеджера пакетов для KDiamond или Palapeli, если хотите), и хотя производительность рендеринга была проблемой, когда QGraphicsView впервые появился много лет назад, эти проблемы в настоящее время в целом решена.

Что вы должны беспокоиться о потреблении памяти. В примере с чипами может быть столько фишек, сколько вы хотите иметь плитки, но эти чипы не хранятся в памяти в виде pixmaps. Если каждая плитка имеет фиксированный размер 50x50px образ, который уже

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

Спасибо вам большое, Palapeli очень приятно. Теперь, я должен еще попробовать KDiamond ... – CapelliC