Чтобы нарисовать несколько маленьких плиток на экране, следует ли использовать QQuickItem или QQuickPaintedItem?

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

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

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

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

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

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


person June    schedule 30.01.2020    source источник
comment
Вы имели в виду QSGNode вместо QQuickItem, потому что QQuickPaintedItem наследуется от QQuickItem. Возможно, это сообщение может вам немного помочь ?   -  person Amfasis    schedule 30.01.2020
comment
Я думаю, вам следует сначала попробовать QQuickPaintedItem, а затем использовать setRenderTarget(FramebufferObject). Этого должно быть достаточно для вашего варианта использования.   -  person reckless    schedule 30.01.2020
comment
Что ж, сейчас я изучаю QPixmap или QImage. Я имею в виду, что как только я отрендерю это в память, это не изменится, это еще одна причина, по которой я думаю, что OpenGL может быть несколько излишним. Проблема в том, что я не знаю, смогу ли я анимировать эти 2 плитки с помощью QPixmap или смогу ли я легко извлечь плитки. -- Что мне действительно нужно, так это тайлы, просто находящиеся в памяти (редко меняющиеся), и я создаю второй очень маленький образ из этих тайлов и отправляю его в Qt Quick. Однако я могу это сделать, но Qt Quick получит только завершенное изображение (С++ обрабатывает все остальное и сохраняет их активными в памяти)   -  person June    schedule 30.01.2020


Ответы (1)


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

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

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

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

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

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

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

person June    schedule 01.02.2020