Dirty Rechtecke
Wo kann man finden, Verweise auf die Implementierung eines Algorithmus zur Berechnung eines "dirty rectangle" für die Minimierung der frame-buffer updates? Ein display-Modell, die es erlaubt beliebige änderungen und berechnet die minimale Anzahl von "bit blit" Operationen erforderlich, um die Anzeige zu aktualisieren.
Eine Klärung der Sprache, Plattform und use-case, würde es ermöglichen, diese Frage zu beantworten, in eine weitere nützliche Art und Weise.
Die bounding-box-tag kann helfen.
Die bounding-box-tag kann helfen.
InformationsquelleAutor | 2008-09-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vexi ist eine Referenz-Implementierung dieser. Die Klasse ist org.vexi.util.DirtyList (Apache-Lizenz), und wird als Bestandteil von Produktionssystemen, d.h. gründlich getestet und ist gut kommentiert.
Einen VORBEHALT, die derzeit Klasse Beschreibung ist ein bisschen ungenau, "Ein Allzweck-Daten-Struktur zum halten einer Liste von rechteckigen Regionen, die müssen neu lackiert werden, mit intelligenten Koaleszenz." Eigentlich ist es derzeit noch nicht die Koaleszenz. Daher betrachten Sie diese eine grundlegende DirtyList Implementierung, dass es nur schneidet dirty () - Anfragen um sicherzustellen, gibt es keine überschneidungen dirty Regionen.
Die eine nuance zu dieser Umsetzung ist, dass, anstelle der Verwendung von Rect-oder anderen ähnlichen region-Objekt, die Regionen, die gespeichert sind in ein array von ints, d.h. in Blöcken von 4 ints in ein 1-dimensionales array. Dies geschieht zur Laufzeit, Effizienz, obwohl im Nachhinein bin ich nicht sicher, ob es viel Verdienst. (Ja, ich habe es umgesetzt.) Es sollte einfach genug zu ersetzen Rect für die array-Blöcken im Einsatz.
Den Zweck der Klasse ist, werden schnell. Mit Vexi, schmutzig bezeichnet werden kann bis zu tausend mal pro frame, also die Schnittpunkte der schmutzigen Regionen mit den schmutzigen Anfrage so schnell wie möglich. Nicht mehr als 4 Anzahl Vergleiche werden verwendet, um die relative position der beiden Regionen.
Es ist nicht ganz optimal wegen der fehlenden Koaleszenz. Während Sie es tut, damit keine überschneidungen zwischen verschmutzt/bemalt Regionen, Sie könnten am Ende mit Regionen, die line up und konnten zusammengeführt werden, in einer größeren region - und damit die Reduzierung der Anzahl der paint-Aufrufe.
Code-snippet. Vollständige code hier online.
InformationsquelleAutor Charles Goodwin
Bauen das kleinste Rechteck, das enthält alle Bereiche, die müssen neu lackiert werden:
Für jeden dirty-Bereich Hinzugefügt:
Windows, zumindest, unterhält eine update region von den änderungen, dass es schon informiert, und alle Malerarbeiten, die getan werden muss, um durch das Fenster verdeckt und enthüllt. Ein region ist ein Objekt, das aus vielen, möglicherweise diskontinuierliche Rechtecke, Polygone und Ellipsen. Teilen Sie Windows mit, über einen Teil des Bildschirms, muss neu lackiert werden InvalidateRect aufrufen - dort ist auch ein InvalidateRgn Funktion für kompliziertere Bereiche. Wenn Sie wählen, um zu tun einige Gemälde, bevor die nächste WM_PAINT-Nachricht eintrifft, und die Sie ausschließen möchten, dass von der schmutzigen Umgebung, es sind ValidateRect und ValidateRgn Funktionen.
Wenn Sie mit dem malen beginnen mit BeginPaint geben Sie eine PAINTSTRUCT, die Windows füllt sich mit Informationen darüber, was muss gestrichen werden. Eines der Mitglieder ist das kleinste Rechteck, das mit der ungültigen region. Sie können die region selbst mit GetUpdateRgn (müssen Sie dies vor BeginPaint, weil BeginPaint markiert das gesamte Fenster als gültig), wenn Sie möchten, minimieren Sie die Zeichnung, wenn es mehrere kleine ungültig Bereichen.
Ich würde davon ausgehen, dass, wie die Minimierung der Zeichnung war wichtig auf dem Mac und auf X, wenn diese Umgebungen wurden ursprünglich geschrieben, es gibt gleichwertige Mechanismen für die Aufrechterhaltung einer update-region.
InformationsquelleAutor Mike Dimmick
Es klingt wie das, was Sie brauchen, ist ein Begrenzungsrahmen für jede Form, die Sie sind-rendering auf dem Bildschirm. Denken Sie daran, dass eine bounding box eines Polygons kann definiert werden als "Links unten" (das minimum) und ein "oben rechts" (der höchste Punkt). Das heißt, die x-Komponente in dem minimalen Punkt ist definiert als das minimum aller x-Komponenten von jedem Punkt in einem polygon. Verwenden Sie die gleiche Methode für die y-Komponente (im Falle von 2D -) und der maximale Punkt der bounding box.
Wenn es reicht, eine bounding-box (aka "dirty rectangle") pro polygon, sind Sie fertig. Wenn Sie eine Allgemeine zusammengesetzten Begrenzungsbox können Sie den gleichen Algorithmus gilt, es sei denn Sie können einfach füllen Sie einen Karton mit minimalen und maximalen Punkte.
Nun, wenn du alles in Java, können Sie sich Ihre bounding box für eine
Area
(die Sie bauen können von jedemShape
) direkt mit dergetBound2D()
Methode.InformationsquelleAutor Bob Cross
Welche Sprache verwenden Sie? In Python, Pygame kann dies für Sie tun. Verwenden Sie die RenderUpdates Gruppe und einige Sprite-Objekte mit Bild und die rect Attribute.
Beispiel:
Wenn Sie nicht mit Python+Pygame, hier ist was ich tun würde:
move() etc. Methode setzt eine "dirty"
flag.
InformationsquelleAutor Martin W
Ich erst vor kurzem schrieb eine Delphi-Klasse zum berechnen der Differenz Rechtecke von zwei Bildern, und war ziemlich überrascht, wie schnell er lief, schnell genug zu laufen, in einem kurzen timer und nach Maus - /Tastatur-Nachrichten für die Aufzeichnung Bildschirm Aktivität.
Schritt für Schritt den Kern, wie es funktioniert:
Sub-Aufteilung des Bildes in logische 12x12 durch Rechtecke.
Schleife durch jedes pixel und wenn es einen Unterschied dann erzähle ich die sub-Rechteck, welches das pixel gehört, dass es einen Unterschied in einem der Pixel und wo.
Jedes sub-Rechteck merkt sich die Koordinaten der eigenen linken, oberen, rechten und unteren Unterschied.
Sobald alle Unterschiede gefunden wurden, habe ich eine Schleife durch alle sub-Rechtecke, die Unterschiede und bilden größere Rechtecke aus Ihnen heraus, wenn Sie stehen neben einander, und verwenden Sie die am weitesten Links, am weitesten oben, rechts und unten-die meisten Unterschiede dieser sub-Rechtecke zur tatsächlichen Unterschied Rechtecke, die ich benutze.
Diese scheint zu funktionieren ziemlich gut für mich. Wenn Sie nicht bereits implementiert Ihre eigene Lösung, lassen Sie mich wissen, und ich werde E-Mail Sie meinen code, wenn Sie möchten. Auch jetzt, ich bin ein neuer Benutzer von StackOverflow so dass, wenn Sie schätzen meine Antwort dann bitte Stimmen Sie bis. 🙂
InformationsquelleAutor CodeAndCats
Blick in Der R-tree und quadtree Datenstrukturen.
InformationsquelleAutor xan