Interessenfrage -> GDI -> ungültiges Rechteck
-
Liebe Progger !
Mich würde mal interessieren was es so auf sich hat mit Clipping , ungültigen Rechtecken , Blitgeschwindigkeit und Blitvorgängen im Bezug auf GDI Aktionen.
Bsp.:
Man erhält eine Nachricht WM_PAINT , fängt diese Nachricht ab und zeichnet
in den DC der von BeginPaint zurückgegeben wird(oder auch in PAINTSTRUCT gespeichert ist).// .... case WM_PAINT: hdc = BeginPaint(hWnd,&ps); // Zeichenaktionen mit hdc ..... EndPaint(hWnd,&ps); return(0);
BeginPaint liefert einen Kontext(hdc)zurück der einerseits meine "Leinwand" darstellt,andererseits aber auch das ungültige Rechteck bezeichnet(zBsp.: durch verschieben eines darüberliegenden Fensters),bei der automatisch darauffolgende Zeichenaktionen auf dieses ungültige Rechteck begrenzt oder zugeschnitten (geclippt)werden.Was ja durchaus Sinn macht,da man hier einiges an Zeit einsparen kann,indem man den Blitvorgang auf das eigentliche Rechteck beschränkt.
Meistens ist es ja so,zumindest bei mir,daß man auf die Nachricht WM_PAINT mit einem kompletten Neuzeichnen des Fensters reagiert,wenn auch nur der ungültige Bereich,aufgrund des von BeginPaint zurückgegebenen Handle,gezeichnet wird.
Nun liest man in diverser Literatur,unteranderem auch im Charles Petzold Buch,im Internet etc.,daß auch Ausgaben(Blitvorgänge) ins "Nichts" Zeit kosten und man daher mit Blitvorgängen,die von vornherein nur den Teil des ung.Rechtecks blitten,eine Menge Zeit sparen kann(gespeichert wird das ungül.Recht.in PAINTSTRUCT in der RECT Structur RECT rcPaint).Logischerweise wird dieser Zeitaufwand bei größeren Datenmengen,sprich Bitmaps,mehr ins Gewicht fallen als zBsp.bei Textausgaben etc.An diesem Punkt happerts aber an meinem Verständniss.
Wieso den zu blittenden Teil auf das Rechteck "zurechtstutzen" wenn es intern ohnehin geclippt wird,und woher kommt hier der Geschwindigkeitsgewinn zustande
wenn ich nur den nötigen Teil blitte oder was verursacht intern mehr Verwaltungsaufwand wenn ich den gesamten Bereich blitte,obwohl schlußendlich doch nur der Bereich des zu blittenden hdc's,der mit dem ungültigen Bereich übereinstimmt,gezeichnet wird ?Vielleicht kann mir das einer sagen,interessieren würde es mich sehr.
Mfg Giga
-
Wieso den zu blittenden Teil auf das Rechteck "zurechtstutzen" wenn es intern ohnehin geclippt wird
Du blittest das gesamte Bitmap auf den Device Context! Wo wird Deiner Meinung nach für jedes Pixel entschieden, ob es zur Clipping-Region gehört oder nicht?
Richtig, im Device Context. Und wenn dieser das für jedes Pixel machen muss (es gibt ja auch Clipping-Regionen, welche nicht rechteckig sein müssen), dauert das natürlich dementsprechend lange!
-
Danke für Deine Antwort.
Läßt sich das Eingrenzen des nötigen Blitbereiches nicht auch leicht intern erledigen,ohne daß ich ein kleineres Blitrechteck übergeben muß der etwas an Performance einspart ?
Genauso wie bei einer Kollisionserkennung bei einem Spiel,bei der ich zuerst abfrage ob sich das Objekt überhaupt in einer bestimmten Area befindet,bevor ich meine zahlreichen Abfragen starte,so könnte ich auch hier intern nur den Teilrechtecksbereich an Pixeln überprüfen,der überhaupt in Frage kommt.
.Auch wenn die Clippingregion kein Rechteck ist,würde sich dennoch jeder ungültige Bereich in einem Rechteck einschließen lassen.
Mfg Giga
-
Dafür gibts dann 2D-Engines, die Bitmaps als Objekte mit bestimmten Positionen betrachten und die Kollisionsabfrage für Dich erledigen. Das GDI macht das nicht, denn was bringt es, eine Kollisionsabfrage einzubauen für einen Drucker-DC, auf dem ich alle 2 Wochen mal was ausdrucke? Hier geht's nicht um FPS.
-
Das muß man erst mal wissen,jetzt ist mir natürlich alles klar
Vielen herzlichen Dank !Mfg Giga