Optimize Texture Imports in Unity 2022.3

Unity keeps the source image in the project and creates an imported texture for each target platform. The source file, imported resolution, build size, and runtime memory are different measurements. Change the import settings that affect the problem you are measuring.

Optimize one texture

Use a platform override, inspect the object in context, and compare a target build.

  1. Select a texture in the Project window and inspect its current imported size.
  2. Set an appropriate Max Size, compression option, and platform override.
  3. Click Apply, check the scene from player distance, then build and test the target platform.
VRChat Android note

VRChat recommends textures no larger than 1024 × 1024 for Android content. Its documentation also warns that Crunch reduces download size, not in-memory size. Keep the Android version within its limits before relying on Crunch.

Identify the Size You Need to Reduce

Measurement What it describes Where to check
Source image The original file and pixel dimensions stored in the project File properties or an image editor
Imported texture The resolution and GPU format Unity creates for the active platform Texture preview and Import Settings
Build or download size The texture data included in the built content package VRChat SDK build output and Editor log statistics
Runtime memory The texture data resident while the content is running Unity Profiler or Memory Profiler

A smaller PNG or JPEG on disk does not guarantee a smaller runtime texture. Runtime cost depends on the imported dimensions, texture format, mipmaps, and whether Unity keeps a CPU-readable copy.

Open the Texture Import Settings

  1. Select the image asset in the Project window.
  2. Read the dimensions and format shown below the preview.
  3. Confirm the Texture Type matches the asset.
  4. Expand Advanced when the required setting is hidden.
  5. Review Default, Standalone, and Android settings before clicking Apply.

Unity's platform-specific override panel can replace the default Max Size, format, compression quality, and related settings for a selected build target.

Set the Correct Texture Type

The Texture Type changes how Unity processes the source image.

Asset role Texture Type
Color, mask, and most material inputs Default
Tangent-space normal texture Normal map
Sprite used by a 2D or UI workflow Sprite (2D and UI)
One-channel data texture Single Channel, when supported by the material workflow

Do not import a normal texture as a regular color texture. Unity's Normal map type prepares the asset for real-time normal mapping.

For Default textures, enable sRGB (Color Texture) for color data such as albedo. Disable it for linear data such as masks when the shader expects unmodified channel values.

Use Max Size to Cap Imported Resolution

Max Size limits the largest imported dimension. If a 4096 × 2048 source has Max Size set to 1024, Unity scales the imported texture so its largest dimension fits that limit while retaining the aspect ratio.

Use the object in the scene to choose the limit:

  1. View the object from the closest normal player position.
  2. Lower Max Size by one step.
  3. Click Apply.
  4. Compare edges, labels, surface detail, and gradients in the scene.
  5. Stop when the reduced resolution becomes visible, then return to the previous acceptable value.

Readable signs, detailed interfaces, and large close surfaces may need more resolution than small props or distant scenery. The visible result is the decision criterion; the source filename or asset category is not.

Configure PC and Android Separately

Use the platform tabs at the bottom of the Import Settings Inspector.

Standalone

  1. Select Standalone.
  2. Enable Override for Standalone when the PC build needs settings different from Default.
  3. Set Max Size and compression.
  4. Click Apply.

Android

  1. Select Android.
  2. Enable Override for Android.
  3. Set the Android Max Size.
  4. Leave Format on Automatic unless you have a tested reason to select a specific supported format.
  5. Click Apply, switch the project to Android, and test the Android build.

Unity documents ASTC and ETC as standard Android texture compression families. An unsupported format can be decompressed at runtime, increasing memory use and reducing rendering performance, so test the actual target hardware when selecting a format manually.

Choose Compression by Visual Result

Unity's Compression setting controls how the imported texture is encoded for the platform. Start with the normal compressed setting supported by the target, then inspect the asset where it is used.

Compression artifacts are easiest to notice in:

  • smooth gradients
  • normal maps
  • hard-edged masks
  • text and interface graphics
  • textures with transparency

Increase quality only for textures with visible artifacts. Use an uncompressed format only when a measured requirement justifies the additional memory.

Keep Mipmaps for Most 3D Surfaces

Mipmaps are progressively smaller versions of a texture. Unity can sample them when a textured surface occupies fewer pixels on screen, reducing aliasing and shimmering at distance.

Enable Generate Mip Maps for most textures placed on 3D geometry that can be viewed from different distances. Consider disabling mipmaps for textures that remain at a fixed on-screen size, such as some interface graphics.

Mipmaps use additional texture memory. Do not disable them across a 3D world solely to reduce that number; first compare distant stability and runtime performance.

Disable Read/Write Unless Code Needs It

Read/Write Enabled allows scripts to access texture pixel data. Unity keeps an additional CPU-readable copy when this option is enabled, increasing memory use.

Leave it disabled unless a script or runtime system explicitly needs to read or modify the texture. If disabling it breaks a feature, identify the component that accesses the pixel data before turning it back on.

Remove Unnecessary Alpha

An alpha channel can change the available compression formats and increase cost. If a material is fully opaque:

  1. Confirm the shader does not use the alpha channel for another property.
  2. Remove unused alpha data from the source or configure the import so it is not required.
  3. Reapply the texture and inspect the material.

VRChat recommends avoiding transparency where possible on Android because alpha fill rate is expensive on mobile GPUs.

Understand What Crunch Changes

Crunch is an additional compression step for compatible texture formats. It can reduce the data stored in a build and downloaded by the user.

Crunch does not reduce the texture's runtime memory below the underlying GPU texture format. A smaller VRChat build after enabling Crunch therefore does not prove that texture memory improved.

Use Crunch when download size is the measured problem, then check:

  • build size before and after
  • import and build time
  • visible artifacts
  • runtime texture memory separately

Measure the Result

Use the same scene, viewpoint, build target, and world state for each comparison.

Question Check
Did the imported texture get smaller? Texture preview dimensions and format
Did the content package get smaller? VRChat SDK build output and Editor log statistics
Did runtime memory decrease? Unity Profiler Memory module or Memory Profiler
Is the visual result acceptable? In-scene view and a local target-platform build
Does Android use the intended settings? Android override panel after switching target

Change a small group of related textures, build, and record the result. This keeps a blurry surface or compression artifact traceable to a specific edit.

Current VRChat Android Requirements and Guidance

Item VRChat guidance
Texture dimensions Aim for 1024 × 1024 or smaller
World upload size Android worlds cannot exceed 100 MB after build-time compression
Crunch Helps download size, not in-memory size
Transparency Avoid it where possible because alpha fill rate is costly
Validation Build for Android and test the platform-specific version

These values and recommendations can change. Check the linked VRChat Android documentation before publishing.

Troubleshooting

The texture became blurry after I lowered Max Size.

Confirm the active platform override, then raise Max Size one step for that texture. Judge it on the object from the closest normal player position rather than from the Project preview alone.

Compression created blocks, banding, or damaged a normal map.

Confirm the Texture Type, raise compression quality, or test a different format supported by the target. Compare the texture in the material because the preview does not reproduce every lighting condition.

The Android override does not appear in the build.

Confirm that Override for Android is enabled, click Apply, and switch the project build target to Android before rebuilding. Reopen the texture and verify that the Android tab still shows the intended values.

The build became smaller, but runtime memory did not.

Check whether the change only enabled Crunch. Crunch reduces download data but keeps the runtime cost of the underlying texture format. Reduce imported dimensions or select an appropriate platform format to address texture memory.

Distant surfaces shimmer after I changed the import settings.

Check whether mipmaps were disabled. Re-enable Generate Mip Maps for 3D surfaces viewed at multiple distances, apply the texture, and compare the same distant viewpoint.

A script stopped working when I disabled Read/Write.

The script is likely requesting CPU access to the texture. Identify that use before re-enabling Read/Write, because the option keeps an additional CPU-readable copy in memory.

Continue Learning

Official References

Next Step

Open the largest texture used in your current scene, record its imported dimensions and format, then lower its platform-specific Max Size by one step. Compare the same object in a local build before changing the next texture.

Related Navigation