2017-07-14 4 views
-1

Ich mache WebGL Arbeit mit einigen großen Texturen, und habe den Punkt erreicht, wo ich Textur-Komprimierung verwenden muss, um Probleme zu minimieren VRAM und Upload-Zeit.Welche Texturkomprimierungsformate sind für Android-WebGL verfügbar?

Meine Anwendung muss in den letzten zwei oder drei Jahren auf iOS- und Android-Mobiltelefonen ausgeführt werden. Ausnahmsweise ist Desktop-Unterstützung nicht folgerichtig.

Ich verstehe, dass Chrome und Safari in iOS mir erlauben, Texturen im PVRTC-Format zu übergeben, da alle iOS-Geräte PowerVR-GPU-Chipsätze verwenden. Also iOS ist ein gelöstes Problem.

Ich verstehe auch, dass fast alle Android-Telefone formal Ericsson Texture Compression unterstützen (ETC, ETC1) - das ist eigentlich von der OpenGL 2-Spezifikation vorgeschrieben. Ich habe jedoch Berichte gelesen, dass einige Browser auf einigen Android-Instanzen ETC1-Texturen unkomprimiert übertragen.

WebGLStats warnt mich ziemlich krass gegen die WEBGL_compressed_texture_etc1 Erweiterung mit:

Warnung nicht verwenden. Wird häufig in Browsern implementiert, indem die CPU dekomprimiert und die volle Größe auf die GPU hochgeladen wird, was zu erheblichen Performance-, Vram- und Qualitätseinbußen führt. In Chrome 57 und Firefox behoben?.

Das andere übliche Format, das mir bekannt ist, ist S3TC. Dies wird auf dem Desktop gut unterstützt, aber die Bedienbarkeit von Android scheint auf Geräte beschränkt zu sein, die NVIDIA-Chipsätze verwenden. Ich glaube, dass diese selten passieren (Tegra nur?).

Was ist meine beste Option für die Auswahl eines Texturkomprimierungsformats, das auf modernen Android-Telefonen funktioniert?

Antwort

1

Welche Texturkomprimierungsformate sind für Android-WebGL verfügbar?

Es liegt an der GPU/Treiber/Browser auf dem Gerät

Sie ein bestimmtes Gerät durch Verwendung überprüfen

gl.getSupportedExtensions(); 

Ab 2017.07.15 Überprüfung webglstats.com es behauptet

  • keine Android Geräte unterstützen s3tc
  • 2% der Geräte su pport pvrtc
  • 97% der Geräte unterstützen etc1
  • 97% der Geräte etc unterstützen
  • 48% der Geräte unterstützen atc
  • 46% der Geräte unterstützen astc

Ich bin 99% sicher Es ist nicht ganz korrekt, da ich mir ziemlich sicher bin, dass NVidia Shield s3tc unterstützt, aber vielleicht hat noch niemand, der ein NVidia Shield verwendet, jemals eine Website besucht, die webglstats verwendet.com oder vielleicht die Anzahl der Benutzer ist so klein, dass es rundet auf 0%

Was ist meine beste Option für die Auswahl eines Textur-Komprimierungsformats, das auf modernen Android-Handys funktioniert?

Was Sie wohl tun sollten, ist die Unterstützung aller von etc1, etc, atc, astc. Bewahren Sie in Ordnern oder mit Erweiterungen etc

assets/etc1/image1 
assets/etc1/image2 
assets/astc/image1 
assets/astc/image2 
... 

oder

assets/image1.etc1 
assets/image2.etc1 
assets/image1.astc 
assets/image2.astc 
... 

dann beim Start Abfrage welchem ​​Format unterstützt das Gerät des Benutzers und wählen Sie das beste (für einige Definition von besten wie vielleicht kleinste size)

Beispiel

// in order of best compression to worst 
const compressions = [ 
    { ext: "astc", name: "WEBGL_compressed_texture_astc" }, 
    { ext: "etc1", name: "WEBGL_compressed_texture_etc1" }, 
    ... 
]; 
let imageExtension = ""; // pick a default? 
for (let i = 0; i < compressions.length; ++i) { 
    const info = compressions[i]; 
    const ext = gl.getExtension(info.name); 
    if (ext) { 
    imageExtension = info.ext; 
    break; 
    } 
} 

function loadImage(baseUrl) { 
    ... 
    img.src = baseUrl + imageExtension; 
    ... 
} 

Oder andere Variationen der oben genannten, wo Sie herausfinden, was das Gerät des Benutzers benötigt und dann verwenden.

Verwandte Themen