performance optimieren...

Alles rund um die Programmierung mit Qt
Antworten
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

performance optimieren...

Beitrag von slash-ex »

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.

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;
Dateianhänge
Bildschirmphoto1.png
Bildschirmphoto1.png (103.22 KiB) 1150 mal betrachtet
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

laut meinem qtimer, scheint der letzte teil, der dass bild malt, den größten teil der malzeit einzunehmen!

0-2 ms ohne bildchen und 6-8 ms mit!
Antworten