2010-06-14 3 views
2

Мне нужна была помощь в попытке оптимизировать эту часть кода ... В основном вот что. Я делаю это «ручка каллиграфии», которая дает эффект каллиграфии, просто рисуя много смежных наклонных линий ... Проблема заключается в следующем: когда я обновляю область рисования с помощью update() после каждого отдельного нити наклонной строки, результат корректен, в том смысле, что обновления выполняются своевременно, так что все «нарисованное» с помощью пера сразу же «видно» на чертеже .. однако, потому что лот (100 из них) обновлений, программа немного замедляется при запуске на N900 ...Нужна помощь в оптимизации кода чертежа ...

Когда я пытаюсь сделать небольшую оптимизацию, запустив обновление после рисования все наклонные линии (так что все строки обновляются на чертежной доске через одно обновление()), выход ... нечетный .... То есть, сразу после рисования строк они выглядят сломанными (они имеют пустые пятна, в которых должен был произойти и рисунок) ... однако, если я инициирую перерисовку окна формы (скажем, изменив размер формы), сломанные пятна немедленно устраняются !! Когда я запускаю эту программу на своем N900, она получает исходный сломанный результат и остается таким, поскольку я не знаю, как обеспечить повторное перерисование в этом случае ...

Вот первый «оптимизированный» код и выход (частично правильно/неправильно)

void Canvas::drawLineTo(const QPoint &endPoint) 
{ 
QPainter painter(&image); 
painter.setPen(QPen(Qt::black,1,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin)); 
int fx=0,fy=0,k=0; 
qPoints.clear(); 
connectingPointsCalculator2(qPoints,lastPoint.x(),lastPoint.y(),endPoint.x(),endPoint.y()); 
int i=0; 
int x,y; 
for(i=0;i<qPoints.size();i++) 
{ 
x=qPoints.at(i).x(); 
y=qPoints.at(i).y(); 
painter.setPen(Qt::black); 
painter.drawLine(x-5,y-5,x+5,y+5); **// Drawing slanted lines** 
} 
**//Updating only once after many draws:** 
update (QRect(QPoint(lastPoint.x()-5,lastPoint.y()-5), QPoint(endPoint.x()+5,endPoint.y()+5)).normalized()); 

modified = true; 
lastPoint = endPoint; 
} 

изображение сразу после строчить на экране:

http://img823.imageshack.us/img823/8755/59943912.png

после повторной корректировки размера окна, все неработающие ссылки выше фиксированы, как они должны быть. .

Вот второй не-оптимизированный код (его выход правильно сразу после рисования, так же, как на втором рисунке выше):

void Canvas::drawLineTo(const QPoint &endPoint) 
{ 
QPainter painter(&image); 
painter.setPen(QPen(Qt::black,1,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin)); 
int fx=0,fy=0,k=0; 
qPoints.clear(); 
connectingPointsCalculator2(qPoints,lastPoint.x(),lastPoint.y(),endPoint.x(),endPoint.y()); 
int i=0; 
int x,y; 
for(i=0;i<qPoints.size();i++) 
{ 
x=qPoints.at(i).x(); 
y=qPoints.at(i).y(); 
painter.setPen(Qt::black); 
painter.drawLine(x-5,y-5,x+5,y+5); **// Drawing slanted lines** 
**//Updating repeatedly during the for loop:** 
update(QRect(QPoint(x-5,y-5), QPoint(x+5,y+5)).normalized());//.adjusted(-rad,-rad,rad,rad)); 
} 
modified = true; 
int rad = (myPenWidth/2) + 2; 
lastPoint = endPoint; 
} 

Может кто-нибудь увидеть, что может быть проблема?

ответ

1

Как я понимаю, вы должны найти минимальную и максимальную х и у обработанного в вашем для цикла и использовать их в update(QRect(QPoint(minX-5, minY-5), QPoint(maxX+5, maxY+5)).normalized());

+0

Хорошо, я только что пробовал ... Хорошо, что теперь он работает на моем ПК ... с одним обновлением после цикла for, он все равно отлично работает на ПК ... однако, когда я запускаю его на N900, результат не очень хорош ... При рисовании 100% вертикальных линий, независимо от того, насколько быстро они всегда сплошные, без «перерывов». Однако, когда я рисую горизонтальные четные полу-горизонтальные линии, есть перерывы , даже если я рисую линию * очень медленно ... – Ahmad

2

Извини, если я неправильно понял, но вы пытались использовать «двойной буфер» подход? Вместо того, чтобы рисовать непосредственно на экране, вы «рисуете» свои точки и линии в буфер памяти. После этого вы просто копируете буфер на экран. Это быстрее и позволяет избежать мерцания.

+0

Вы хоть представляете, как это можно сделать в Qt, поскольку я все еще изучаю Qt ... – Ahmad

+0

Я не специалист по Qt, Вы нашли эту ссылку: http://doc.trolltech.com/qq/qq06-flicker-free.html. Я думаю, что это может быть полезно. – Juliano

+0

Начиная с версии 4.0 Qt дважды выполняет буферизацию чертежа по умолчанию. Вам нужно явно отключить его, если вы хотите не-двойной буферизованный чертеж. http://doc.trolltech.com/4.0/qt4-arthur.html –

1

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

for(i=0;i<qPoints.size();i++) 
{ 
    // ... 
    painter.setPen(Qt::black); 
    painter.drawLine(x-5,y-5,x+5,y+5); **// Drawing slanted lines** 
    // ... 
} 

сделать это:

QPen black_pen(Qt::black); 
for(i=0;i<qPoints.size();i++) 
{ 
    // ... 
    painter.setPen(black_pen); 
    painter.drawLine(x-5,y-5,x+5,y+5); **// Drawing slanted lines** 
    // ... 
} 

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

Другое примечание: Я не уверен, какой тип image вы рисуете, но я предполагаю, что это QImage. Когда вы закончите рисование, если вы будете использовать немодифицированное изображение несколько раз, вы можете преобразовать его один раз в QPixmap.Класс QPixmap хранится таким образом, что предполагается, что он будет готов к блиттингу непосредственно на экране (но из-за этого он намного медленнее модифицировать).

Смежные вопросы