需要帮助优化绘图代码......

时间:2010-06-14 20:04:42

标签: c++ qt

我需要一些帮助来尝试优化这个代码部分...基本上就是这样的东西......我正在制作这个'书法笔',通过简单地画出许多相邻的斜线来给出书法效果......问题是这样的:当我在斜线的每一次绘制之后使用update()更新绘制区域时,输出是正确的,因为更新是及时完成的​​,因此使用笔“绘制”的所有内容都是立即“看到”了图...但是,因为更新的很多(其中100个),在N900上运行时程序会慢一点......

当我尝试通过在绘制 all 斜线后运行更新来进行一些优化(以便通过单个update()将所有行更新到绘图板上),输出为。 ..奇怪....也就是说,在绘制线条之后,它们的线条看起来很破碎(它们有空白的补丁,其中也应该发生绘图)...但是,如果我触发重绘窗体窗口(比如说) ,通过改变表格的大小),破碎的补丁立即修复!!当我在我的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 个答案:

答案 0 :(得分:2)

很抱歉,如果我误解了,但您是否尝试过使用“双缓冲”方法?您可以将点和线“绘制”到内存缓冲区,而不是直接在屏幕上绘制。之后,您只需将缓冲区复制到屏幕即可。这样更快,避免闪烁。

答案 1 :(得分:1)

根据我的理解,您应该在for-loop中找到处理x和y的最小值和最大值,并在update(QRect(QPoint(minX-5, minY-5), QPoint(maxX+5, maxY+5)).normalized());中使用它们

答案 2 :(得分: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类以一种应该可以直接在屏幕上进行blitting的方式存储(但在很多情况下修改速度要慢得多,因为这样)。