質問

このコード部分を最適化しようとするのに助けが必要でした...基本的にここにあります。私はこの「書道ペン」を作っています。 :更新がタイムリーに行われるという意味で、スラントラインの抽選ごとにupdate()を使用してdraw領域を更新すると、出力は正しいです。 '図面..しかし、a 多く (それらの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

ウィンドウサイズを再調整した後、上記の壊れたリンクはすべて、あるべきであるように固定されています。

2番目の非最適化コードは次のとおりです(上の2番目の写真のように、描画直後に出力が正しいです):

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

誰もが問題が何であるかを見ることができますか?

役に立ちましたか?

解決

私が理解しているように、あなたはあなたのfor-loopで処理されている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**
    // ...
}

さらに、毎回同じペンでdrawlineto関数を繰り返し呼んでいる場合は、クラスにペンを保管して、それを保持してください。私の会社では、それを利用できる描画時間を大幅に削減するために、それを発見しました。 (大きな画像の1つの例は、描画時間を半分にカットします。)

もう1つのメモ:どんなタイプがわかりません image あなたは絵画ですが、私はそれがQimageだと思っています。描画が完了したら、変更されていない画像を繰り返し使用する場合は、qpixmapに一度変換する場合があります。 QPIXMAPクラスは、画面に直接描く準備ができていると思われる方法で保存されます(ただし、そのため、多くの場合、変更するのはずっと遅くなります)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top