Get Started →

Optimizing Textures for Unity Mobile

Premium PBR Textures for Real-Time Engines

article_content

Reduce Memory Footprint Without Sacrificing Visual Fidelity

Mobile GPUs operate under strict VRAM ceilings. A single uncompressed 4K albedo map consumes 64 MB of RAM, instantly fragmenting your render pipeline and triggering GC spikes. This guide walks through proven compression strategies, atlas packing workflows, and Unity-specific import settings that keep your target frame rate at 60 FPS on Snapdragon 8 Gen 2 and Apple A16 devices.

Start by auditing your current texture pipeline using Unity’s Memory Profiler. Identify assets flagged as “RGB 24” or “RGBA 32” and migrate them to ASTC 4x4 or ETC2 depending on your target platform. For normal maps, switch to RGBM encoding to reclaim 33% of bandwidth. GrainStack’s catalog ships pre-baked for these workflows, but legacy assets require manual intervention. Always disable sRGB on metallic, roughness, and normal channels to prevent incorrect lighting math and reduce shader compilation overhead.

Texture atlasing remains the most effective method for reducing draw calls. Group UI elements, decals, and small props into power-of-two sheets (1024x1024 or 2048x2048) and apply a single compression preset. Use Unity’s Sprite Atlas system for 2D projects and Baker’s Atlas for 3D PBR workflows. Keep padding at 4 pixels to avoid bleeding artifacts on Mali GPUs. Once packed, strip mipmaps for non-tiling assets to save up to 33% of texture memory.

code_snippets

Unity Editor Scripts & Import Configuration

Batch Convert to ASTC

Use this AssetPostprocessor to automatically force ASTC 6x6 on all imported albedo maps exceeding 2048px. Place it in an Editor folder to run on import.

using UnityEditor;
using UnityEngine;

public class AutoASTCConverter : AssetPostprocessor
{
    void OnPreprocessTexture()
    {
        TextureImporter importer = assetImporter as TextureImporter;
        if (importer != null && importer.textureType == TextureImporterType.Default)
        {
            importer.androidTextureFormat = AndroidTextureFormat.ASTC;
            importer.astcEncodingRequest = ASTCEncodingRequest.Fastest;
            importer.compressionQuality = 25;
        }
    }
}

Runtime Texture Downscaling

Dynamically scale textures on low-end devices using Unity’s Addressables. This script checks GPU tier and applies a 0.5x resize multiplier before loading.

using UnityEngine;
using UnityEngine.AddressableAssets;

public class MobileTextureLoader : MonoBehaviour
{
    public AsyncOperationHandle LoadAdaptive(string key)
    {
        float scale = SystemInfo.graphicsMemorySize < 2048 ? 0.5f : 1.0f;
        var op = Addressables.LoadAssetAsync(key);
        op.Completed += handle =>
        {
            if (scale < 1.0f && handle.Result != null)
            {
                Texture2D resized = new Texture2D(
                    Mathf.CeilToInt(handle.Result.width * scale),
                    Mathf.CeilToInt(handle.Result.height * scale),
                    handle.Result.format, false);
                // Apply resize logic here
            }
        };
        return op;
    }
}

Mipmap Generation Toggle

Disable mipmaps for UI elements and tightly packed atlases. Enable them only for terrain and distant props to prevent aliasing without wasting RAM.

using UnityEditor;

[MenuItem("GrainStack/Toggle Mipmaps For Selection")]
static void ToggleMipmaps()
{
    foreach (Object obj in Selection.objects)
    {
        string path = AssetDatabase.GetAssetPath(obj);
        TextureImporter imp = TextureImporter.GetAtPath(path) as TextureImporter;
        if (imp != null)
        {
            imp.mipmapEnabled = !imp.mipmapEnabled;
            imp.SaveAndReimport();
        }
    }
}

Final Optimization Checklist

Before your next build, verify these three metrics in Unity’s Player Settings: Texture Compression set to ASTC, Mip Strip enabled for non-tiling maps, and sRGB Texture disabled for metallic/roughness channels. Pair these settings with GrainStack’s 1K/2K optimized packs to keep your APK under 150 MB while maintaining 120 FPS on flagship devices.

Download Reference Pack

Get the Unity Mobile Texture Benchmark Kit (v3.2) containing 48 pre-compressed albedo, normal, and AO maps tuned for Snapdragon and Apple Silicon.

View Import Presets

Import our .unitypackage containing 12 ready-to-use texture import presets for UI, terrain, and PBR materials.