Нужна помощь в оптимизации кода чертежа ...

StackOverflow https://stackoverflow.com/questions/3040484

  •  27-09-2019
  •  | 
  •  

Вопрос

Мне нужна была некоторая помощь в попытке оптимизировать эту часть кода ... в основном вот дело. : Когда я обновляю регион Draw, используя обновление () после каждого ничьей наклонной линии, вывод правильный, в том смысле, что обновления выполняются своевременно, так что все «нарисовано», используя ручку сразу » «Рисунок. Однако, потому что много (100s из них) выполнения обновлений, программа немного замедляется, когда работает на N900 ...

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

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

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.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;
}

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

Это было полезно?

Решение

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

Другие советы

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

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

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**
    // ...
}

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top