Я использую C ++ и QT Creator с 32-битным MinGW QT 5.0.2 на Windows 8.
У меня есть обычай QGraphicsItem
состоящий из нескольких (около 20) горизонтальных линий разной длины и ширины. На концах каждой строки есть несколько цифр, нарисованных в виде текста. Внутри paint(...)
Функция моего пользовательского элемента рассчитывает несколько тригонометрических вещей, но это не должно быть так дорого. Я также попытался частично перекрасить предмет. Функция рисования выглядит так:
void myCustomItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
с этим псевдо телом:
//set brush and pen etc
...
//partially repaint
painter->setClipRect( option->exposedRect );
//draw some lines
for(int i=0; i < lines; ++i)
painter.drawLine(...);
//calculate arithmetic and trigonometric stuff
....
//draw some text
for(int n=0; n < texts; ++n)
painter.drawText(...);
это QGraphicsItem
Объект отображается внутри QGraphicsScene
на QGraphicsView
с активированным сглаживанием.
Каждые 30 мс (при QTimer
) его вращение задается с помощью следующего кода, где (x,y)
центр вращения, degrees
значение вращения и item
мой пользовательский элемент подкласс QGraphicsItem
,
item.setTransform(QTransform().translate(x, y).rotate(roll).translate(-x, -y))
Таким образом, каждые 30 мс paint(...)
функция называется.
Это приводит к высокой загрузке ЦП более 20%. Больше ничего не нужно визуализировать в представлении и больше ничего не нужно вычислять вне представления. Я не уверен, является ли использование этого процессора нормальным для таких операций (с довольно плохим процессором (APU AMD A4-4355M с Radeon HD Graphics)) … в любом случае, процессор мне кажется довольно высоким.
Вообще говоря, есть ли способ минимизировать вычислительные затраты на вращение и / или перевод QGraphicsItem
?
Задача ещё не решена.
Других решений пока нет …