Efficient Game Textures with Hardware Compression

Posted by Shanee
, 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

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


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


Requires OpenGL ES 3.0 and above.


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

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:


Available with Adreno GPU.


Available with a PowerVR GPU.


S3 DXT1 texture compression. Supported on devices running Nvidia Tegra


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:

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








Image Output

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

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

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

Difference Map

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

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

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

5x Enhanced Difference Map

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

imageanchor="1"> "http://2.bp.blogspot.com/-kz8Ze68p_Fs/VLVv69CA4WI/AAAAAAAABRU/IggSZPeiHXU/s200/6x6-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.


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.

Related Posts

Subscribe Our Newsletter