Before you start
Know which files need it. Run the resource through the Resource Inspector or sort the stream/ folder by size. Anything over 16 MB is broken in FiveM; anything over 8 MB is worth shrinking on a busy server.
Note
The optimizer works on real GTA V .ytd files (RSC7 resources). It does not open .dds or .png; export those with your modelling tool first.
Step 1: Load the textures
Open the Texture Optimizer. Drop one or more .ytd files, the whole converted .zip, or the resource folder. The tool lists each dictionary with its textures, formats, sizes and mip counts. Files over the limit are marked in red.
Step 2: Choose the target size
Free mode is fixed at 1024 px and optimizes the first file; Unlimited lets you pick any size and processes everything you dropped.
Step 3: Decide about textures without mip chains
Most textures carry a chain of smaller copies (mips). Dropping the top levels is lossless. Some textures, usually dashboards and UI planes, have only one level. With "Resample textures that have no mip chain" ticked, those are decoded, downscaled and re-encoded; that is a lossy step, but far better than leaving a 4K single-level texture in place. Untick it if you prefer to keep those files unchanged.
Step 4: Optimize
Click Optimize. The per-texture table fills in: "dropped 1 mip (lossless)", "resampled", or "kept" with the reason. The header shows before and after size for each file and for the whole batch.
Step 5: Download and replace
Click the .ytd button on a file to download just that dictionary, then overwrite the original inside stream/. With Unlimited, use "Download optimized .zip" to get the entire resource back with every texture replaced and everything else untouched.
Step 6: Verify in game
Ensure the resource, spawn the car, and look at it up close and from 50 metres. If a texture looks blurry up close, re-run only that dictionary at 2048 px. If the car was black before, it should now be textured; if it is still black, the texture name in vehicles.meta (txdName) does not match the file, which the Inspector will point out.
How it stays lossless
A DXT-compressed texture at 2048 px stores 1024, 512, 256… copies inside the same file. The optimizer rewrites the file's header so the 1024 copy becomes level zero and discards the bytes above it. The remaining data is byte-identical to what the game would have used at that distance anyway. It then rebuilds the resource's segment sizes and pointers so the game accepts the file.