PiTyUs.Hire me

Assets & UI

Streaming custom assets in FiveM without wrecking performance

How FiveM streaming works: stream folders, add-on vehicles, MLOs, texture budgets, pool sizes and how to find the asset crashing your players on join.

Updated 11 min readBy PiTyUs · FiveM developer

How FiveM streaming works

Any file placed in a resource's `stream` folder is registered with the game's asset system and can override or extend GTA V's own content. The game does not care which resource a file came from — it builds one flat namespace keyed by asset name. That single fact explains most streaming bugs.

ExtensionWhat it isTypical use
ydrDrawable — a single modelProps, static objects
yddDrawable dictionaryClothing, ped components
yftFragment — a breakable/articulated modelVehicles, destructible props
ytdTexture dictionaryTextures for any of the above
ymapMap placementWhere objects sit in the world
ytypType definitions / interiorsMLO archetypes and room data
ycdClip dictionaryAnimations
ynv / yn*Navmesh and pathingAI navigation inside custom interiors
The manifest lines that make streaming worklua
fx_version 'cerulean'
game 'gta5'

-- everything under stream/ is picked up recursively
files { 'data/vehicles.meta', 'data/carvariations.meta' }

data_file 'VEHICLE_METADATA_FILE'   'data/vehicles.meta'
data_file 'VEHICLE_VARIATION_FILE'  'data/carvariations.meta'
data_file 'HANDLING_FILE'           'data/handling.meta'

Name conflicts — the bug that looks like magic

Because asset names are global, two resources shipping a prop called `prop_bench_01b` will fight. Whichever loads last wins, and the other MLO now has a bench from a different building — or no bench at all. Symptoms are geometry that flickers, textures that are wrong in one interior only, or props that vanish after a restart because load order changed.

Find duplicate streamed assets across every resourcebash
find resources -path '*/stream/*' -type f -printf '%f\n' \
  | sort | uniq -d
  • Any name in that output is a conflict you have right now.
  • Fix it by renaming inside the resource that is least referenced elsewhere — and update its ymap/ytyp accordingly.
  • Prefix your own custom assets with something unique to your server so you never collide with a purchased pack.

Add-on vehicles done properly

Add-on cars are the most common streamed content and the most common source of client memory problems. Each one carries a model, a texture dictionary and metadata, and it occupies memory whether or not anybody drives it.

  1. Put the yft and ytd files in stream/, and the vehicles.meta, carvariations.meta and handling.meta in a data/ folder declared with data_file.
  2. Make sure the spawn name is unique across every vehicle pack you run. Duplicate spawn names silently break carvariations.
  3. Check the texture sizes. A 4096×4096 dictionary for one car is common in free packs and completely unnecessary — 2048 is plenty, 1024 for detail maps.
  4. Verify handling.meta exists and is referenced. A missing handling entry produces a car that drives like a brick and reports no errors.
  5. Test with an empty server first. If a vehicle crashes you alone, it will crash everyone.

MLOs and interiors

An MLO replaces or adds an interior. Beyond the geometry, it brings ytyp archetypes, ymap placements, interior room definitions and often a navmesh. Installing one is more than dropping a folder in.

  • If the MLO replaces a vanilla interior, it usually needs an IPL disabled or enabled from a client script. The readme will say so; people skip it and then report "the old walls are still there".
  • Occlusion matters. A large interior without proper occlusion tanks frame rate because the engine draws the whole thing from outside.
  • Check the collision. Free MLOs frequently ship broken collision on one floor, which players find within an hour.
  • Navmesh affects NPCs and, in some frameworks, pathing for jobs. A missing ynv means peds walk through walls.
Enabling and disabling IPLs from a client scriptlua
CreateThread(function()
  -- remove the vanilla shell
  RemoveIpl('post_hw1_10_producers')
  -- and load the replacement
  RequestIpl('my_custom_interior')
end)

Pool sizes, crashes and sv_poolSizesIncrease

GTA V allocates fixed-size pools for objects, entities, vehicles and more. Heavy custom content exhausts them, and the client crashes with a pool-related message. FiveM lets you raise specific pools — but raising everything "to be safe" costs memory and can itself cause instability.

Raise only the pool the console actually namedjson
// in your resource's fxmanifest, or via a dedicated resource
{
  "sv_poolSizesIncrease": {
    "TxdStore": 50000,
    "Object": 2000
  }
}
  1. Reproduce the crash and read the exact pool name from the client log or crash dialog.
  2. Raise that one pool by a modest amount.
  3. Test again. If it moves to a different pool, you are treating a symptom — you probably have too much content.
  4. If crashes persist, bisect your streamed resources the same way you would bisect a performance problem.

sv_enforceGameBuild and why assets suddenly break

GTA V ships in versioned builds, and DLC content is only available on the build that introduced it. `sv_enforceGameBuild` pins which one your server runs. Change it and assets built for another build stop resolving — textures go white, vehicles fail to spawn, clothing components disappear.

  • Pick the build your content requires, write it down, and treat it as part of your server's identity.
  • When buying an MLO or a vehicle pack, check which build it targets before you install it.
  • Changing the build is a planned migration, not a config tweak. Test on a copy of the server first.

A sensible content budget

CategoryComfortableGetting risky
Total stream folder sizeUnder 3 GBAbove 8 GB
Add-on vehicles40 – 80200+
Custom MLOs10 – 2550+
Clothing packsCompressed, deduplicatedMultiple overlapping packs
Largest single texture2048×20484096×4096 on small props

The numbers are guidance, not law — a server with 6 GB of well-optimised content can behave better than one with 2 GB of badly compressed textures. What matters is that somebody is watching the total and the per-asset quality, rather than adding whatever looks nice this week.

Frequently asked questions

Why do players crash when joining my FiveM server?

Usually a streamed asset. A corrupted or oversized texture dictionary, a vehicle built for a different game build, or an exhausted object pool during the initial load are the three most common causes. Bisect your streamed resources to find it.

Do streamed assets slow down my FiveM server?

They do not cost server milliseconds. They cost client memory, client load time and download time on join. A server with 10 GB of assets has a slow first-join experience and unhappy players on low-memory machines, but its server tick is unaffected.

What does sv_poolSizesIncrease do?

It raises GTA V's fixed allocation pools so heavy custom content does not exhaust them. Raise only the specific pool named in the crash message, by a modest amount — raising everything wastes memory and can cause its own instability.

Why are my MLO textures missing or flickering?

Almost always a name conflict: two resources ship an asset with the same name and load order decides which wins. Scan your stream folders for duplicate filenames and rename the collisions.

Need this built, not just explained?

Ten years of FiveM work, from Lua to NUI

Custom resources, React NUI, ESX / QBCore / Qbox integration, OneSync performance audits and security reviews — plus the websites and SEO around your server brand.

Related guides