Нужна помощь в оптимизации кода рисования ... - PullRequest
2 голосов
/ 15 июня 2010

Мне нужна была некоторая помощь в попытке оптимизировать этот фрагмент кода ... В основном, вот в чем дело ... Я делаю эту "ручку для каллиграфии", которая дает эффект каллиграфии, просто рисуя множество соседних наклонных линий ...проблема заключается в следующем: когда я обновляю область рисования с помощью 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;
}

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

Ответы [ 3 ]

2 голосов
/ 15 июня 2010

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

1 голос
/ 15 июня 2010

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

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 хранится таким образом, что он должен быть готов к перетаскиванию прямо на экран (но из-за этого его модифицировать гораздо медленнее).

1 голос
/ 15 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...