Wenn Java etwas außerhalb der Zeichenfläche zeichnet, wirkt sich dies auf die Leistung aus?

8

Wenn ich etwas mit Koordinationen wie -80 und -90 zeichne, beeinflusst es die Performance genauso, als ob es tatsächlich in das Innere gezogen wäre?
Lohnt es sich wirklich zu prüfen, ob das endgültige Bild auf dem Bildschirm erscheint? (und nicht zeichnen, wenn nicht)

    
Valli3 16.05.2015, 22:40
quelle

3 Antworten

7

Wenn ich etwas mit Koordinationen wie -80 und -90 zeichne, wirkt sich das genauso auf die Performance aus, als wäre es tatsächlich innen gezeichnet worden?

Etwas, aber nicht annähernd so viel wie im Bildschirm.

Lohnt es sich wirklich zu prüfen, ob das endgültige Bild auf dem Bildschirm erscheint? (und nicht zeichnen, wenn nicht)

Es ist praktisch nie es wert, ein eigenes Culling / Clipping in einer Bibliothek zu implementieren, in dem das Ausgrenzen nicht zu einer Fehler- / Zugriffsverletzung führt, da die Bibliothek diese Überprüfung bereits vornehmen müsste, um das Schreiben zu vermeiden in der Erinnerung außerhalb der Grenzen, und es wäre im Allgemeinen klug zu wetten, dass die Art und Weise, wie die Bibliothek dies überprüft, schlau und schnell ist.

Wenn Sie also oben Ihren eigenen Basis-Check hinzufügen würden, machen Sie jetzt nur noch die regelmäßige Zeichnung auf dem Bildschirm, um zwei solcher Checks durchzuführen (Ihre eigenen über dem, was unter der Haube passiert), und Für Offscreen-Fälle wäre es wahrscheinlich, dass Ihre Überprüfung tatsächlich langsamer (oder zumindest nicht besser) wäre als die der Bibliothek.

Jetzt muss ich hier auf basic culling / clipping setzen. Mit "Einfach" meine ich, dass Sie für jede Form, die Sie zeichnen, auf einer Form-Basis prüfen. Da wird die Leistung eher beschädigt.

Beschleunigungsstrukturen und Clipping / Culling in Bulk

Dennoch gibt es Fälle, in denen Sie eine Datenstruktur haben, um effizient Tausende von Dreiecken auf einmal mit einer einzigen Bounding-Box-Prüfung zu durchsuchen, um zu sehen, ob sie sich im Kegelstumpf befindet, zum Beispiel in einem 3D-Fall mit Strukturen wie Begrenzungsvolumen Hierarchien. Spiele verwenden diese Art von Datenstrukturen, um die Anzahl der Zeichnungsanforderungen, die pro Frame benötigt werden, mit sehr wenigen Überprüfungen massiv zu reduzieren, und Sie erhalten dadurch möglicherweise einen enormen Leistungsvorteil. Eine einfachere Version von diesem ist einfach zu überprüfen, ob das Objekt / Mesh, das die Dreiecke enthält, eine Bounding Box hat, die sich innerhalb des Bildschirms befindet, wodurch potenziell Tausende von Dreiecken einzeln mit einer einzelnen Bounding Box überprüft werden können.

In 2D mit Clipping können Sie möglicherweise etwas wie einen Quad-Tree oder ein festes Raster verwenden, um nur selektiv zu zeichnen, was sich auf dem Bildschirm befindet (und außerdem die Kollisionserkennung oder Klickerkennung beschleunigen). Dort können Sie tatsächlich einen Leistungsschub bekommen, wenn Sie viele überflüssige Zeichnungsaufrufe mit einem einzigen Check eliminieren können. Aber auch hier wird eine Datenstruktur verwendet, die unnötige Zeichnungsaufrufe mit einem single check überflüssig macht. Dies sind räumliche Partitionierungsstrukturen, deren einziger Punkt es ist, Dinge nicht auf einer Form zu überprüfen.

Für ein einfacheres 2D-Beispiel, wenn Sie sagen, ein 2D- "Widget", das, um es zu zeichnen, das Zeichnen Dutzender verschiedener Formen auf den Bildschirm erfordert, können Sie möglicherweise einen Leistungsgewinn erzielen, wenn Sie können Vermeiden Sie das Anfordern von Dutzenden von Formen mit einer einzigen Überprüfung, um zu sehen, ob das Rechteck, das das gesamte Widget umfasst, auf dem Bildschirm angezeigt wird. Auch hier machen Sie einen Check, um viele Zeichenaufrufe zu eliminieren. Sie erhalten keinen Leistungsgewinn auf einem Level-Playing-Feld, wo Sie diese Prüfung auf einer Form-Basis durchführen, aber wenn Sie viele Schecks in einen einzigen Scheck verwandeln können, haben Sie eine Chance.

    
Team Upvote 17.05.2015, 07:14
quelle
4

Laut der Graphics-Implementierung für die meisten gängigen Draws / Füllungen (zB drawRectangle: Quelle von Grafiken auf grepcode.com beginnen sie mit der Überprüfung, ob die Breite und Höhe größer als Null sind und dann machen sie mehr Operationen, deshalb macht die Überprüfung auf x, y & lt; 0 im ungünstigsten Fall die gleiche Anzahl von Operationen Denken Sie daran, dass ein Rechteck, das bei -80 und -90 beginnt, wie Sie sagten, aber Breite und Höhe, d. H. 200, auf dem Bildschirm angezeigt wird.

    
Dawid Bugajewski 16.05.2015 22:48
quelle
3

Ja, es wirkt sich immer noch auf die Leistung aus, da es immer noch im Programm vorhanden ist, es ist nur auf dem Bildschirm nicht sichtbar

    
user4907890 16.05.2015 22:45
quelle

Tags und Links