بحاجة إلى مساعدة في تحسين رمز الرسم ...

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

  •  27-09-2019
  •  | 
  •  

سؤال

كنت بحاجة إلى بعض المساعدة في محاولة تحسين جزء الرمز هذا ... هنا هو الشيء في الأساس .. أنا أصنع هذا "القلم الخط" الذي يعطي تأثير الخط من خلال رسم الكثير من الخطوط المائلة المجاورة ... المشكلة هي هذه : عندما أقوم بتحديث منطقة السحب باستخدام التحديث () بعد كل رسم من خط مائل ، يكون الإخراج صحيحًا ، بمعنى أن التحديثات تتم في الوقت المناسب ، بحيث يتم عرض كل شيء "باستخدام القلم على الفور" 'الرسم .. ومع ذلك ، لأن أ كثيرا (100s منهم) يتم إجراء التحديثات ، يتباطأ البرنامج قليلاً عند تشغيله على 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;
}

هل يمكن لأي شخص أن يرى ما قد تكون عليه المشكلة؟

هل كانت مفيدة؟

المحلول

كما أفهم ، يجب أن تجد min و max من 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 مع نفس القلم في كل مرة ، قم بتخزين القلم في صفك واحتفظ به. في شركتي ، وجدنا أنه لتقليل أوقات الرسم بشكل كبير حيث يمكننا الاستفادة منها. (مثيل واحد على أوقات رسم صورة كبيرة إلى نصفين.)

ملاحظة أخرى: لست متأكدًا من النوع image أنت ترسم ، لكنني أفترض أنها Qimage. عند الانتهاء من الرسم ، إذا كنت ستستخدم الصورة غير المعدلة بشكل متكرر ، فيمكنك تحويلها مرة واحدة إلى qpixmap. يتم تخزين فئة QPixMap بطريقة من المفترض أن تكون جاهزة للضرب مباشرة على الشاشة (لكنها أبطأ كثيرًا في التعديل في كثير من الحالات ، بسبب ذلك).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top