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.
Use a platform override, inspect the object in context, and compare a target build.
- Select a texture in the Project window and inspect its current imported size.
- Set an appropriate Max Size, compression option, and platform override.
- Click Apply, check the scene from player distance, then build and test the target platform.
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
- Select the image asset in the Project window.
- Read the dimensions and format shown below the preview.
- Confirm the Texture Type matches the asset.
- Expand Advanced when the required setting is hidden.
- 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:
- View the object from the closest normal player position.
- Lower Max Size by one step.
- Click Apply.
- Compare edges, labels, surface detail, and gradients in the scene.
- 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
- Select Standalone.
- Enable Override for Standalone when the PC build needs settings different from Default.
- Set Max Size and compression.
- Click Apply.
Android
- Select Android.
- Enable Override for Android.
- Set the Android Max Size.
- Leave Format on Automatic unless you have a tested reason to select a specific supported format.
- 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:
- Confirm the shader does not use the alpha channel for another property.
- Remove unused alpha data from the source or configure the import so it is not required.
- 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
- Measure and Improve VRChat World Performance
- Creating and Managing Materials
- How to Atlas Everything in Your World
- Quest Compatibility Checklist
- World Optimization Checklist
Official References
- Unity 2022.3 Texture Import Settings
- Unity 2022.3 Recommended Texture Formats by Platform
- Unity 2022.3 Introduction to Mipmaps
- Unity 2022.3 Memory Profiler Module
- VRChat Android Content Optimization
- VRChat Cross-Platform Setup
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.