Efficient Game Textures with Hardware Compression


Posted by Shanee
Nishry
, Developer Advocate




As you may know, high resolution textures contribute to better graphics and a
more impressive game experience. Adaptive Scalable Texture Compression (ASTC)
helps solve many of the challenges involved including reducing memory
footprint and loading time and even increase performance and battery life.




If you have a lot of textures, you are probably already compressing them.
Unfortunately, not all compression algorithms are made equal. PNG, JPG and
other common formats are not GPU friendly. Some of the highest-quality
algorithms today are proprietary and limited to certain GPUs. Until recently,
the only broadly supported GPU accelerated formats were relatively primitive
and produced poor results.




With the introduction of ASTC, a new compression technique invented by ARM
and standardized by the Khronos group, we expect to see dramatic changes for
the better. ASTC promises to be both high quality and broadly supported by
future Android devices. But until devices with ASTC support become widely
available, it�s important to understand the variety of legacy formats that
exist today.




We will examine preferable compression formats which are supported on the GPU
to help you reduce .apk size and loading times of your game.




Texture Compression




Popular compressed formats include PNG and JPG, which can�t be decoded
directly by the GPU. As a consequence, they need to be decompressed before
copying them to the GPU memory. Decompressing the textures takes time and
leads to increased loading times.




A better option is to use hardware accelerated formats. These formats are
lossy but have the advantage of being designed for the GPU.




This means they do not need to be decompressed before being copied and result
in decreased loading times for the player and may even lead to increased
performance due to hardware optimizations.




Hardware Accelerated Formats




Hardware accelerated formats have many benefits. As mentioned before, they
help improve loading times and the runtime memory footprint.




Additionally, these formats help improve performance, battery life and reduce
heating of the device, requiring less bandwidth while also consuming less
energy.




There are two categories of hardware accelerated formats, standard and
proprietary. This table shows the standard formats:



















ETC1

Supported on all Android devices with OpenGL ES 2.0 and above. Does not
support alpha channel.

ETC2

Requires OpenGL ES 3.0 and above.

ASTC

Higher quality than ETC1 and ETC2. Supported with the Android Extension
Pack.



As you can see, with higher OpenGL support you gain access to better formats.
There are proprietary formats to replace ETC1, delivering higher quality and
alpha channel support. These are shown in the following table:
























ATC

Available with Adreno GPU.

PVRTC

Available with a PowerVR GPU.

DXT1

S3 DXT1 texture compression. Supported on devices running Nvidia Tegra
platform.

S3TC

S3 texture compression, nonspecific to DXT variant. Supported on devices
running Nvidia Tegra platform.



That�s a lot of formats, revealing a different problem. How do you choose
which format to use?




To best support all devices you need to create multiple apks using different
texture formats. The Google Play developer console allows you to add multiple
apks and will deliver the right one to the user based on their device. For
more information check "http://developer.android.com/training/multiple-apks/texture.html?utm_campaign=ASTC-115&utm_source=dac&utm_medium=blog">
this page
.




When a device only supports OpenGL ES 2.0 it is recommended to use a
proprietary format to get the best results possible, this means making an apk
for each hardware.




On devices with access to OpenGL ES 3.0 you can use ETC2. The
GL_COMPRESSED_RGBA8_ETC2_EAC format is an improved version of ETC1
with added alpha support.




The best case is when the device supports the Android Extension Pack. Then
you should use the ASTC format which has better quality and is more efficient
than the other formats.




Adaptive Scalable Texture Compression (ASTC)




The Android Extension Pack has ASTC as a standard format, removing the need
to have different formats for different devices.




In addition to being supported on modern hardware, ASTC also offers improved
quality over other GPU formats by having full alpha support and better
quality preservation.




ASTC is a block based texture compression algorithm developed by "http://www.arm.com/">ARM. It offers multiple block footprints and
bitrate options to lower the size of the final texture. The higher the block
footprint, the smaller the final file but possibly more quality loss.




Note that some images compress better than others. Images with similar
neighboring pixels tend to have better quality compared to images with vastly
different neighboring pixels.




Let�s examine a texture to better understand ASTC:


"http://3.bp.blogspot.com/-jFGG5zyscHY/VLVvLrh_OgI/AAAAAAAABQU/l7Swn9S7Btw/s1600/jelly-original.png"
imageanchor="1">"http://3.bp.blogspot.com/-jFGG5zyscHY/VLVvLrh_OgI/AAAAAAAABQU/l7Swn9S7Btw/s600/jelly-original.png" itemprop="image">


This bitmap is 1.1MB uncompressed and 299KB when compressed as PNG.




Compressing the Android jellybean jar texture into ASTC through the "http://malideveloper.arm.com/develop-for-mali/tools/asset-creation/mali-gpu-texture-compression-tool/">
Mali GPU Texture Compression Tool
yields the following results.







































Block Footprint

4x4

6x6

8x8

Memory

262KB

119KB

70KB

Image Output

"http://3.bp.blogspot.com/-LQAdi5XHyXg/VLVvXl2cldI/AAAAAAAABQc/PEuVMpaK9MI/s1600/jelly-astc-4x4.png"
imageanchor="1"> "http://3.bp.blogspot.com/-LQAdi5XHyXg/VLVvXl2cldI/AAAAAAAABQc/PEuVMpaK9MI/s200/jelly-astc-4x4.png">


"http://4.bp.blogspot.com/-uK6-LMf60Ak/VLVvcCjD3YI/AAAAAAAABQk/5Dgij3IkEAQ/s1600/jelly-astc-6x6.png"
imageanchor="1"> "http://4.bp.blogspot.com/-uK6-LMf60Ak/VLVvcCjD3YI/AAAAAAAABQk/5Dgij3IkEAQ/s200/jelly-astc-6x6.png">


"http://2.bp.blogspot.com/-u728LnZPe7k/VLVvfnC3cGI/AAAAAAAABQs/AYtnfGS8MLk/s1600/jelly-astc-8x8.png"
imageanchor="1"> "http://2.bp.blogspot.com/-u728LnZPe7k/VLVvfnC3cGI/AAAAAAAABQs/AYtnfGS8MLk/s200/jelly-astc-8x8.png">


Difference Map

"http://2.bp.blogspot.com/-vDfS-9X5zLI/VLVvpcsf5UI/AAAAAAAABQ0/0H9g1eNIrV4/s1600/4x4-1x.png"
imageanchor="1"> "http://2.bp.blogspot.com/-vDfS-9X5zLI/VLVvpcsf5UI/AAAAAAAABQ0/0H9g1eNIrV4/s200/4x4-1x.png">


"http://2.bp.blogspot.com/-jsoSkmgFxHc/VLVvtsoXlpI/AAAAAAAABQ8/f07n9rBc_eU/s1600/6x6-1x.png"
imageanchor="1"> "http://2.bp.blogspot.com/-jsoSkmgFxHc/VLVvtsoXlpI/AAAAAAAABQ8/f07n9rBc_eU/s200/6x6-1x.png">


"http://3.bp.blogspot.com/-vKlF4vqAvhc/VLVvxy5T7XI/AAAAAAAABRE/l5xGTjKQL_Y/s1600/8x8-1x.png"
imageanchor="1"> "http://3.bp.blogspot.com/-vKlF4vqAvhc/VLVvxy5T7XI/AAAAAAAABRE/l5xGTjKQL_Y/s200/8x8-1x.png">


5x Enhanced Difference Map

"http://3.bp.blogspot.com/-uOC_LA3sZCc/VLVv2fXPlPI/AAAAAAAABRM/m4CfjJmk-NY/s1600/4x4-5x.png"
imageanchor="1"> "http://3.bp.blogspot.com/-uOC_LA3sZCc/VLVv2fXPlPI/AAAAAAAABRM/m4CfjJmk-NY/s200/4x4-5x.png">


"http://2.bp.blogspot.com/-kz8Ze68p_Fs/VLVv69CA4WI/AAAAAAAABRU/IggSZPeiHXU/s1600/6x6-5x.png"
imageanchor="1"> "http://2.bp.blogspot.com/-kz8Ze68p_Fs/VLVv69CA4WI/AAAAAAAABRU/IggSZPeiHXU/s200/6x6-5x.png">


"http://1.bp.blogspot.com/-6gGslWUxjUA/VLVv-3AjJjI/AAAAAAAABRc/_0AyOMsRdRU/s1600/8x8-5x.png"
imageanchor="1"> "http://1.bp.blogspot.com/-6gGslWUxjUA/VLVv-3AjJjI/AAAAAAAABRc/_0AyOMsRdRU/s200/8x8-5x.png">




As you can see, the highest quality (4x4) bitrate for ASTC already gains over
PNG in memory size. Unlike PNG, this gain stays even after copying the image
to the GPU.




The tradeoff comes in the detail, so it is important to carefully examine
textures when compressing them to see how much compression is acceptable.




Conclusion




Using hardware accelerated textures in your games will help you reduce the
size of your .apk, runtime memory use as well as loading times.




Improve performance on a wider range of devices by uploading multiple apks
with different GPU texture formats and "http://developer.android.com/training/multiple-apks/texture.html?utm_campaign=ASTC-115&utm_source=dac&utm_medium=blog">
declaring the texture type in the AndroidManifest.xml
.




If you are aiming for high end devices, make sure to use ASTC which is
included in the Android Extension Pack.



Rekomendasi Artikel lainnya

Subscribe to receive free email updates:

0 Response to "Efficient Game Textures with Hardware Compression"

Post a Comment