2016-05-28 7 views
2

Wir verwenden PIXI.js für Spiele, die intern WebGL zum Rendern verwendet. Hin und wieder stolpere ich über Erwähnungen der Zweierpotenz und mögliche Leistungsvorteile der Vermeidung von NPOT-Texturen (https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial/Using_textures_in_WebGL#Non_power-of-two_textures, https://github.com/pixijs/pixi.js/blob/master/src/core/textures/BaseTexture.js#L116). Verwirrenderweise wird auch erwähnt, dass es keinen Unterschied mehr macht (OpenGL - Power Of Two Textures). Da sich Webgl und Browser so schnell entwickeln, ist es schwierig zu sagen, welche dieser Informationen korrekt sind.Power-of-Two-Texturen Performance-Vorteile mit modernen WebGL

Speziell frage ich mich, ob der Aufwand beim Auffüllen von Bildern zum Erstellen von POT-Texturen (längere Downloads, erhöhte Speicherauslastung) die Leistungsvorteile wert sind (wenn sie tatsächlich vorhanden sind). Ich konnte keine Vergleichs- oder Leistungsvergleiche zwischen POT- und NPOT-Texturen finden und weiß leider nicht wirklich, wie ich selbst daran arbeiten würde.

Hat jemand Erfahrung in dieser Hinsicht oder einige aktuelle Zahlen? Gibt es eine gute Möglichkeit, die Webgl-Leistung zu messen?

+0

Ich weiß nichts über Leistung, aber das Hauptproblem mit NPOT Textur ist, dass Mipmapping und Wiederholungen nicht unterstützt werden. POT (allgemein) ermöglicht Optimierungen in vielen Berechnungen. Ich habe auch das Gefühl, dass die GPU Textur auf quadratische POT-Texturen auffüllen könnte, egal wie intern (basierend auf nicht verwandten Tests, die ich gemacht habe), aber ich bin nicht 100% darauf. –

+0

Ich würde ehrlich überrascht sein, wenn irgendwelche modernen GPUs einen Unterschied in der Perf zwischen Pot und Npot hätten. Und mit modern meine ich alles in den letzten 6+ Jahren inklusive Handys. Aber ich mache nur eine Ahnung. Wenn Sie wissen möchten, dass Sie über viele GPUs testen müssen. – gman

+0

@ WacławJasper "* Ich habe auch das Gefühl, dass die GPU Textur auf quadratische POT-Texturen auffüllen kann." "Das ist nicht wahr, stell dir vor, eine RGBA8 16384 von 819 ** 3 ** Textur zu erstellen, würde dies zu ~ 1 führen GB Speicherverbrauch statt ~ 536 MB, greifen Sie auf den gpu Profiler Ihrer Wahl und sehen Sie selbst. Afaik wenn Padding angewendet wurde, wurde es immer auf der Applikationsseite gemacht, NPOT Texturen auf älteren GPUs zu "shimmen". –

Antwort

1

Ich denke die meisten der Antworten, die Sie bekommen werden, ist "abhängig von Hardware/Treiber/GPU", "Sie müssen es selbst testen" oder "es wäre nicht viel langsamer (aber mit Vorbehalt müssen Sie über testen alle gpus um sicher zu gehen) ".

Anstatt sich Gedanken darüber zu machen, ob Sie Ihre Bilder auf POT auffüllen sollten, sollten Sie stattdessen einen Texturalias (Sprite Sheet) verwenden. Oder fordern Sie die Leute hinter Pixi auf, dies zu implementieren. Durch die Verwendung eines Texturalias mit POT-Abmessungen erhalten Sie wirklich das Beste aus beiden Welten: minimaler Polsterverlust, eine Garantie, dass die POT-Textur nicht langsamer als NPOT-Textur, UND reduzierte GL-Statusänderungen ausführt.

Ich kann nicht betonen, wie groß von einer Verbesserung, die Sie mit reduzierten GL-Statusänderungen erhalten können. Durch die Implementierung von Textur-Aliasing und Draw-Batching kann ich grundsätzlich so viele 2D-Sprites zeichnen, wie in einer realistischen Umgebung benötigt werden. das ist ~ 150k bewegen, drehen und skalieren Sprites bei 60fps (gebunden durch CPU um die neue Transformation für jedes Sprite pro Frame zu berechnen)

+0

Einer der Gründe für diese Frage ist, dass ich an https://github.com/Gamevy/pixi-packer arbeite, einem Texturpacker. Es zielt bereits auf Spritesheets in der Nähe der POT-Größe, aber die meiste Zeit werden sie nicht vollständig gefüllt. Ich frage mich, ob webgl von mir profitieren wird, wenn ich zum nächsten POT komme oder die Spritesheets so belasse, wie sie sind. Entschuldigung, ich hätte diese Information meinem Beitrag hinzufügen sollen. – marekventur

+0

Sie können die Spritesheets unverändert belassen, aber beim Erstellen der Webgl-Texturen diese in POT erstellen. –

+0

seine so genannte Textur ** ATLAS ** kein ** Alias ​​** –