Чтобы нарисовать небольшие плитки на экране, я должен использовать QQuickItem или QQuickPaintedItem? - PullRequest
0 голосов
/ 30 января 2020

По сути, мне нужно загрузить в память 4-цветную карту тайлов размером точно 16 КБ, анимировать 2 плитки, возможно, 3 раза в секунду, и вывести несколько плиток в довольно маленькую коробку, я бы сказал, может быть 100 или около пикселей в ширину и, возможно, 80 пикселей в высоту (очень приблизительно из памяти) для отображения в QML / Qt Quick, который я мог бы использовать свойство scale, чтобы увеличить его в QML

В любом случае я В некотором смысле не знаю, как это сделать, но я собираюсь предположить, что C ++ - лучшая ставка для этого, что мне подходит, и после изучения я вижу, что есть 2 основных варианта, QQuickItem и QQuickPaintedItem.

Теперь я понимаю, что QQuickPaintedItem старше и медленнее, потому что сначала он запускает aws в процессоре, а затем копирует на видеокарту, так что это не лучшее решение. Наиболее рекомендуемый вариант - QQuickItem, который рендерится на графической карте с OpenGL.

Но мне не нужно что-то лишнее, я имею в виду, что здесь я имею дело с ~ 100 x 80 пикселей, здесь нет линий или форм операции, нет шейдеров, ничего из этого. Это просто набор пикселей, поэтому мне интересно, будет ли лучше просто использовать QQuickPaintedItem.

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

Любая помощь в выяснении этого была бы великолепна, спасибо заранее.

1 Ответ

0 голосов
/ 01 февраля 2020

Как обычно, я ищу простейшее решение, которое соответствует моим потребностям, и я нашел его.

Я создал класс TilesetEngine, который загружает плитки в QImages (потому что это так просто), обрабатывает их и затем преобразует их в QPixmaps, где они разбиваются на отдельные тайлы и кэшируются в памяти для скорости (льготы крошечных простых тайлов 8x8, нет места для памяти). Движок позволяет вам напрямую запросить номер кадра, и он будет отображать изображение stati c с анимированными плитками, соответствующими запрошенному номеру кадра.

Это была сложная часть, потому что было довольно много обработки и постобработка, но на этом пути я создал QQuickImageProvider, который служит своего рода свободным мостом и допускает дополнительные параметры в «id», такие как указание размера масштаба в id, так как Qt Quick не вызывал const QSize& requestedSize. Это было довольно легко сделать.

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

Затем, для большего удовольствия, я включил таймер в QML и запросил все кадры в анимации один за другим, и у него было l oop. Здесь я мог наблюдать, как анимация и набор плиток или плиток оживают и оживляют.

Все это было очень просто, легко и доставило массу удовольствия. Единственной трудной частью был движок, который получил реальные преимущества в манипулировании пикселями, но QImage, QPaint, QPixelmap и QColor взяли на себя большую часть работы, так что это могло бы быть сложнее, если бы не классы удобства Qt.

Я так рад, что никогда не искажал ничего из OpenGL или моего первоначального плана, QQuickItem или QQuickPainted Item. Это решение было идеальным и простым и подходит для всего, что мне нужно,

...