performance optimieren...
Verfasst: 6. Oktober 2007 15:41
ich bastle etwas rum und wollte ein paar gezeichnete einheiten an der maus entlangbewegen, und falls ein bild vorhanden ist dieses statt einem kreis oder rechteck zeichnen. aber je größer das widget ist, desto langsamer wird die zeichenoperation. das zeichnen hängt der maus auch etwas nach. weil ich generell wenig erfahrung habe wollte ich mal fragen was man generell beim zeichnen optimieren kann...
bisher habe ich vorzugsweise schonmal qpixmaps statt qimages benutzt, aber viel wird das nicht ändern... da hauptsächlich berechnungen und mausabfragen eine rolle spielen. außerdem überlege ich ob timer nicht evtl. effektiver wären. bisher ist das event-gesteuert.
das ist mal ein ausschnitt aus einem event, das eintritt wenn man eine einheit bewegen will.
bisher habe ich vorzugsweise schonmal qpixmaps statt qimages benutzt, aber viel wird das nicht ändern... da hauptsächlich berechnungen und mausabfragen eine rolle spielen. außerdem überlege ich ob timer nicht evtl. effektiver wären. bisher ist das event-gesteuert.
das ist mal ein ausschnitt aus einem event, das eintritt wenn man eine einheit bewegen will.
Code: Alles auswählen
case bfa_move_unit:
painter.setPen(QPen(QColor(0,0,0)));
painter.setBrush(QColor(255, 255, 255));
double vect_ln;
unit_to_set.clear();
moving_unit_model_offsets.clear();
for(int i = 0; i < models_selected.size(); i++)
{
//!unit sizes
float width = units.at(models.at(models_selected.at(i) )->owner() )->get_ModelDym()->get_width();
float height = units.at(models.at(models_selected.at(i) )->owner() )->get_ModelDym()->get_height();
float radius = units.at(models.at(models_selected.at(i) )->owner() )->get_ModelDym()->get_radius();
//!entfernungsvektor
moving_unit_model_offsets.insert(models_selected.at(i), models.at(models_selected.at(i) )->position() - models.at(models_selected.first() )->position() );
UnitMovVect = models.at(models_selected.at(i) )->position() - (mouse_pos/zoom_factor + moving_unit_model_offsets[models_selected.at(i)] );
//!entfernung
vect_ln = sqrt ( pow(UnitMovVect.x(), 2.0f) + pow(UnitMovVect.y(), 2.0f) );
//!zeichne linien/modelle am zielort
if(vect_ln <= units.at(unit_selected)->get_movement() )
{
unit_to_set.append(models_selected.at(i) );
painter.drawLine(mouse_pos/zoom_factor + moving_unit_model_offsets[models_selected.at(i)], models.at(models_selected.at(i) )->position() );
//!kein pixmap
if(/*zoom_level < 2 &&*/ models.at(models_selected.at(i) )->get_pixmap() == NULL)
{
//!infantrie
if(!units.at(models.at(models_selected.at(i) )->owner() )->get_isVehicle() )
painter.drawEllipse(QRectF(mouse_pos.x()/zoom_factor + moving_unit_model_offsets[models_selected.at(i)].x() - radius/2, mouse_pos.y()/zoom_factor + moving_unit_model_offsets[models_selected.at(i)].y() - radius/2, radius, radius) );
//!fahrzeuge
if(units.at(models.at(models_selected.at(i) )->owner() )->get_isVehicle() )
{
//!zum modell bewegen, drehen, zurückbewegen
QPointF pnt(mouse_pos.x()/zoom_factor + moving_unit_model_offsets[models_selected.at(i)].x(), mouse_pos.y()/zoom_factor + moving_unit_model_offsets[models_selected.at(i)].y() );
painter.translate(pnt);
painter.rotate(models.at(models_selected.at(i))->getAngle() );
painter.translate(-pnt);
painter.drawRect(QRectF(mouse_pos.x()/zoom_factor + moving_unit_model_offsets[models_selected.at(i)].x() - width/2, mouse_pos.y()/zoom_factor + moving_unit_model_offsets[models_selected.at(i)].y() - height/2, width, height) );
//!zum modell bewegen, drehen, zurückbewegen
painter.translate(pnt);
painter.rotate(-models.at(models_selected.at(i))->getAngle() );
painter.translate(-pnt);
}
}
//!pixmap vorhanden
if(/*zoom_level >= 2 &&*/ models.at(models_selected.at(i) )->get_pixmap() != NULL)
{
float rel = zoom_factor/8;
//! infantrie
if(!units.at(models.at(models_selected.at(i) )->owner() )->get_isVehicle() )
px_painter.drawPixmap(mouse_pos - QPointF(8*rel, 8*rel) + moving_unit_model_offsets[models_selected.at(i)]*zoom_factor, models.at(models_selected.at(i) )->get_pixmap()->scaled(16*rel, 16*rel) );
}
}
}
//!bewegungsdistanz
px_painter.setPen(QPen(QColor(255,255,255)));
px_painter.drawText(mouse_pos + QPointF(25,20), (new QString)->setNum(vect_ln, 'f', 1) + "\"");
break;