2017-07-14 3 views
-1

Je travaille sur WebGL avec de grandes textures, et j'ai atteint le point où je dois utiliser la compression de texture pour atténuer les problèmes VRAM et le temps de téléchargement. Mon application devra fonctionner sur les téléphones mobiles iOS et Android des deux ou trois dernières années. Pour une fois, le support de bureau n'est pas conséquent. Je comprends que Chrome et Safari dans iOS me permettent de passer des textures au format PVRTC, car tous les appareils iOS utilisent des chipsets GPU PowerVR. Donc, iOS est un problème résolu. Je comprends également que presque tous les téléphones Android prennent officiellement en charge la compression de texture Ericsson (ETC, ETC1) - que cela est en fait mandaté par la spécification OpenGL 2. Cependant, j'ai lu des rapports que certains navigateurs sur certaines instances Android passent effectivement des textures ETC1 d'une manière non compressée.Quels formats de compression de texture sont disponibles sur Android-WebGL?

WebGLStats me met en garde contre assez crûment contre l'utilisation de l'extension WEBGL_compressed_texture_etc1:

Avertissement NE PAS UTILISER. Souvent implémenté dans les navigateurs en décompressant sur le CPU et en téléchargeant en taille réelle sur GPU avec des performances sévères, des effets vram et de qualité. Corrigé dans Chrome 57 et Firefox ??.

L'autre format courant que je connais est S3TC. Ceci est bien supporté sur le bureau, mais l'opérabilité d'Android semble limitée aux appareils utilisant des chipsets NVIDIA. Je crois que ceux-ci passent rares (Tegra seulement?).

Quelle est ma meilleure option pour choisir un format de compression de texture qui fonctionnera sur les téléphones Android modernes?

Répondre

1

Quels formats de compression de texture sont disponibles sur Android-WebGL?

Il est au GPU/pilote/navigateur sur le périphérique

Vous pouvez vérifier un dispositif particulier en utilisant

gl.getSupportedExtensions(); 

Au 15/07/2017 vérifier webglstats.com elle fait valoir

  • aucun dispositif androïde supportent s3tc
  • 2% des appareils su pport pvrtc
  • 97% des appareils supporte etc1
  • 97% des appareils supporte etc
  • 48% des appareils supporte atc
  • 46% des dispositifs de soutien astc

Je suis sûr que 99% Ce n'est pas tout à fait exact car je suis à peu près sûr que le NVidia Shield supporte s3tc mais peut-être que personne n'utilisant un NVidia Shield n'a jamais visité un site utilisant webglstats.com ou peut-être le nombre d'utilisateurs est si petit qu'il arrondit à 0%

Quelle est ma meilleure option pour choisir un format de compression de texture qui fonctionnera sur les téléphones Android modernes?

Ce que vous devez faire est de supporter tout etc1, etc, atc, astc. vous stocker des actifs dans des dossiers ou des extensions, etc

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

ou

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

Puis, à la requête de démarrage format des Supports de périphériques de l'utilisateur et choisir le meilleur (pour une définition de mieux comme le plus petit peut-être taille)

Exemple

// 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; 
    ... 
} 

Ou d'autres variantes de ce qui précède où vous comprendre ce que l'appareil de l'utilisateur a besoin, puis l'utiliser.