Wohlstand
@Wohlstand
Инженер-программист С++

Как рендерить анимированный QGraphicsPixmapItem из одной общей картинки, размещённой вне QGraphicsPixmapItem?

Есть QGraphicsPixmapItem. Я его сделал анимированным за счёт хранения внутри него исходного спрайта и при каждом кадре QTimer переключает видимую картинку через setPixmap(), копируя туда часть исходного спрайта, соответствующую текущему кадру.
У меня возник этот вопрос потому что, при числе объектов больше 7000 и даже 5000 процесс расстановки из массива на сцену становится значительно дольше, а пока анимация всех объектов включена, общее быстродействие сильно замедляется, а почему, уже ясно, что каждую четверть секунды происходит перекопирование 10000 кадров одновременно, что крайне не оптимально.

Можно ли например через paint() вырисовывать только один экземпляр анимированной картинки из независимого аниматора, который анимирует одну картинку на все объекты своего типа на сцене?

(т.е. хранить в памяти анимацию для каждого вида объекта (Например, кошки, мышки, кролики...) а текущий кадр - элемент внешнего массива. Все размещённые на сцене объекты одного типа выводят именно эту картинку, а внутри себя её не хранят, а если она меняется - обновляет отрисовку).
  • Вопрос задан
  • 2604 просмотра
Решения вопроса 1
@DancingOnWater
Идти через paint это правильное решение: логика сцены такова, что любое изменение вызывает вызов paint.

Но я бы шел так: стандартные контейнеры хранят данные разделенным способом и любое вызывов оператора копирования или конструктора копирования меняет лишь счетчик ссылок.

Я-бы отнаследовался от QGraphicsObject (именно object), ну или и QGraphicsitem И QGraphicsObject создал бы метод аля setAnimation ( const QList & value)
И в переопределенным paint-е заставил painter рисовать следующую картинку через drawPixmap или drawPixmapFragments
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы