Начало работы с игрой на основе плитки в Qt с использованием QGraphicsScene и QGraphicsView

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

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

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

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

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

4 ответов


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

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

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

на фишки.cpp source, он показывает, как он все еще может работать быстро с помощью оператора "LevelOfDetail" или LOD variable switch на основе преобразования, хранящегося в опции стиля.

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

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


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


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

что вас должно беспокоить, так это потребление памяти. Пример чипов может иметь столько чипов, сколько вы хотите иметь плиток, но эти чипы не являются хранится в памяти как растровые изображения. Если каждая плитка является изображением фиксированного размера 50x50px, это уже

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

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

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

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