Arquivos de modelo do veículo (yft, _hi.yft, ytd) e o aviso de asset grande demais

Por Nilo3D · Atualizado:

Um veículo de FiveM é enviado por stream como um modelo .yft, um modelo de alto detalhe _hi.yft e um dicionário de texturas .ytd. O FXServer mede quanta memória cada arquivo precisa depois de carregado e imprime um aviso acima de 16 MiB. Acima de 48 MiB ele acrescenta que assets grandes demais "can and WILL lead to streaming issues". Texturas menores e comprimidas são a correção de sempre.

O que são os arquivos .yft, _hi.yft e .ytd?

Os três arquivos têm funções fixas, e os nomes deles têm que seguir o nome do modelo do vehicles.meta.

stream/
  mycar.yft        model: lower LODs, skeleton, collision
  mycar_hi.yft     model: high detail version shown up close
  mycar.ytd        textures (name matches <txdName>)
  mycar+hi.ytd     optional: high resolution versions of the same textures
ArquivoConteúdoQuando o jogo usa
<model>.yftO veículo como fragment: as malhas de menor detalhe, os bones (portas, rodas, assentos) e a colisão.Sempre, enquanto o veículo existir.
<model>_hi.yftA malha de alto detalhe.Só perto da câmera, dentro do primeiro valor de lodDistances do vehicles.meta.
<txdName>.ytdTodas as texturas do veículo.Sempre.
<txdName>+hi.ytdCópias opcionais das texturas em resolução maior.Perto da câmera.

O próprio jogo monta o nome do modelo de alto detalhe somando _hi ao nome do modelo sempre que a primeira distância de LOD está acima de zero, então o arquivo tem que se chamar exatamente assim. As peças de tuning são arquivos de modelo pequenos e separados na mesma pasta, com os nomes listados no carcols.meta.

O que significa o aviso de oversized assets?

Quando um resource inicia, o FXServer lê o cabeçalho de cada arquivo de stream e calcula quanta memória ele vai ocupar depois de carregado. Se for demais, ele imprime uma linha como esta no console do servidor:

Asset mycar/mycar.ytd uses 62.5 MiB of physical memory. Oversized assets can and WILL lead to streaming issues (such as models not loading/rendering).

O número não é o tamanho do arquivo em disco. Os arquivos de stream são comprimidos, e o cabeçalho registra o tamanho dos dados descompactados em duas partes: memória virtual (dados de estrutura) e memória física (principalmente pixels de textura e geometria de malha). Cada parte é verificada separadamente.

Memória de um arquivoLinha do console
16 MiB ou menosNada é impresso.
Acima de 16 MiBImpressa em azul.
Acima de 32 MiBImpressa em amarelo.
Acima de 48 MiBA frase "Oversized assets can and WILL lead to streaming issues (such as models not loading/rendering)" é acrescentada.
Acima de 64 MiBImpressa em vermelho.

Esses degraus são os do código-fonte do FXServer (ResourceStreamComponent.cpp). O aviso é sobre os computadores dos jogadores, não sobre o servidor: cada jogador perto do veículo tem que manter aquele arquivo na memória. Mantenha cada arquivo em 16 MiB ou menos e o console fica quieto.

Para ver esse número de um arquivo antes de ligar o servidor, solte o arquivo na calculadora de memória de texturas YTD. Ela também lista cada textura com a memória que ocupa.

Quanta memória uma textura usa?

A memória de uma textura depende da resolução e do formato, não da aparência da imagem. Cortar a largura e a altura pela metade reduz a memória a um quarto. Formatos comprimidos guardam 4 ou 8 bits por pixel em vez de 32. Os mipmaps somam cerca de um terço.

ResoluçãoDXT1 / BC1 (sem alpha)DXT5 / BC3 (alpha)32 bits sem compressão
512 x 5120.17 MiB0.33 MiB1.33 MiB
1024 x 10240.67 MiB1.33 MiB5.33 MiB
2048 x 20482.67 MiB5.33 MiB21.3 MiB
4096 x 409610.7 MiB21.3 MiB85.3 MiB

Os valores incluem mipmaps. Uma única textura 4096 sem compressão já passa de todos os degraus do aviso, e uma única textura 4096 em DXT5 fica acima de 16 MiB sozinha. Um .ytd com um punhado de texturas 4K é a origem mais comum do aviso.

Como reduzir um veículo grande demais?

  1. Ache o arquivo. A linha do console dá o nome do resource e do arquivo. Corrija o maior primeiro.
  2. Redimensione as texturas grandes. Texturas de carroceria e de interior em 2048 ou 1024 bastam para um veículo visto da distância normal de jogo. Peças pequenas, emblemas e luzes raramente precisam de mais que 512.
  3. Comprima as texturas. Use DXT1 (BC1) para texturas sem transparência e DXT5 (BC3) para texturas com transparência. Evite formatos sem compressão.
  4. Apague as texturas sem uso. Modelos convertidos costumam carregar texturas que nenhum material usa.
  5. Não duplique texturas compartilhadas. Texturas usadas por vários veículos podem ficar em um dicionário definido como pai em txdRelationships do vehicles.meta.
  6. Reduza a malha. Se o arquivo do aviso é um .yft, o modelo tem polígonos demais, ou o .yft principal contém a malha de detalhe total em vez de LODs mais baixos.
  7. Reinicie o resource e leia o console de novo. Nenhuma linha significa que todo arquivo está em 16 MiB ou menos.

As configurações de LOD, o lodDistances e os tamanhos de textura por função estão em como otimizar um veículo FiveM.

Onde os LODs entram nisso?

O .yft principal é feito para guardar as versões mais leves do modelo, e o _hi.yft a detalhada. É essa divisão que permite ao jogo manter só um modelo leve na memória para os veículos que estão longe. Uma conversão que coloca a mesma malha pesada nos dois arquivos dobra a memória e deixa todo veículo distante tão caro quanto um próximo.

Os níveis e as distâncias deles são explicados em o que são LODs em veículos de FiveM. Do nosso próprio catálogo, o Coil S-Cooter e os três hoverboards vêm com quatro LODs, de High a Very Low.

Perguntas frequentes

O que é o limite de 16 MB do FiveM?
É o primeiro degrau da verificação de tamanho de asset do FXServer. Um arquivo de stream que precisa de mais de 16 MiB de memória física ou virtual depois de carregado recebe um aviso no console. É um aviso, não um bloqueio, mas assets grandes podem deixar de carregar para os jogadores.
Por que meu arquivo de 5 MB aparece como 40 MiB?
O aviso mostra o uso de memória depois de carregar, não o tamanho em disco. Os arquivos de stream são comprimidos, então o tamanho carregado pode ser várias vezes o tamanho do arquivo.
Qual é a diferença entre .yft e _hi.yft?
O .yft guarda as malhas de menor detalhe, o esqueleto e a colisão e está sempre carregado. O _hi.yft guarda a malha de alto detalhe e só é carregado quando o veículo está perto da câmera.
Que tamanho de textura um veículo de FiveM deve usar?
Texturas comprimidas de 2048 ou 1024 nas superfícies principais e de 512 ou menos nos detalhes mantêm a maioria dos veículos abaixo de 16 MiB. Uma única textura 4096 em DXT5 já usa cerca de 21 MiB com mipmaps.
O aviso significa que meu servidor está com lag?
Não. A verificação é sobre a memória do lado dos jogadores. O risco são modelos ou texturas que carregam tarde ou não carregam, ainda mais quando há muitos veículos pesados em um mesmo lugar.

Fontes

Produtos deste guia

Todos os guias