Desabilitar ou reduzir tráfego NPC e peds em FiveM: density natives
Desligue ou reduza NPCs, tráfego e carros estacionados em FiveM com os nativos do multiplicador de densidade, a regra por frame, routing buckets, removendo policiais e o custo de cada opção.
Sintomas típicos:
Streets full of NPCs and traffic, low fps in the city, or random police responses nobody asked for.A população em GTA é controlada por um conjunto de nativos que você chama no cliente. A principal armadilha é que a maioria deles reseta a cada frame. Este artigo mostra os nativos, o loop que eles precisam, a opção do servidor, e os trade-offs de uma cidade vazia.
A regra única: a cada frame
Os multiplicadores de densidade se aplicam apenas ao frame atual. Chame-os uma vez ao iniciar e eles não fazem nada um momento depois. Eles devem rodar em um loop sem delay:
CreateThread(function()
while true do
SetVehicleDensityMultiplierThisFrame(0.0)
SetPedDensityMultiplierThisFrame(0.0)
SetRandomVehicleDensityMultiplierThisFrame(0.0)
SetParkedVehicleDensityMultiplierThisFrame(0.0)
SetScenarioPedDensityMultiplierThisFrame(0.0, 0.0)
Wait(0)
end
end)Um multiplicador é entre 0.0 (nenhum) e 1.0 (a quantidade padrão). Cada nativo controla uma parte diferente:
| Nativo | Controla |
|---|---|
SetVehicleDensityMultiplierThisFrame |
Tráfego em movimento |
SetRandomVehicleDensityMultiplierThisFrame |
Veículos aleatórios nas estradas |
SetParkedVehicleDensityMultiplierThisFrame |
Carros estacionados na rua |
SetPedDensityMultiplierThisFrame |
Pedestres caminhando |
SetScenarioPedDensityMultiplierThisFrame |
Peds fazendo atividades (interior, exterior) |
SetScenarioPedDensityMultiplierThisFrame leva dois valores, um para interior e outro para exterior.
Reduza em vez de remover
Uma cidade com ninguém nela parece quebrada, e os jogadores notam. Use um valor entre 0 e 1 para afinar:
local traffic = 0.3
local peds = 0.4
CreateThread(function()
while true do
SetVehicleDensityMultiplierThisFrame(traffic)
SetRandomVehicleDensityMultiplierThisFrame(traffic)
SetParkedVehicleDensityMultiplierThisFrame(traffic)
SetPedDensityMultiplierThisFrame(peds)
SetScenarioPedDensityMultiplierThisFrame(peds, peds)
Wait(0)
end
end)Tente 0.3 a 0.5 primeiro, depois ajuste para seu servidor. Coloque os valores em um arquivo de config para que você possa mudá-los sem tocar no código.
Lado do servidor: routing buckets
O servidor pode desligar a população para um routing bucket inteiro, que é útil para uma instância como um interior ou um evento, sem um loop cliente:
-- server
SetRoutingBucketPopulationEnabled(bucketId, false)Com isto, nenhum NPC ambiente ou tráfego spawna para os jogadores naquele bucket. Bucket 0 é o mundo padrão. Deixe-o ligado para o mundo principal e desabilite-o para instâncias privadas. Veja routing buckets para como colocar jogadores em um.
Remova os policiais e o dispatch
Defir a densidade para zero não para a resposta da polícia. Níveis desejados e dispatch rodam em seus próprios sistemas. Para removê-los, desligue-os um por um:
CreateThread(function()
SetMaxWantedLevel(0)
SetCreateRandomCops(false)
SetCreateRandomCopsNotOnScenarios(false)
SetCreateRandomCopsOnScenarios(false)
for service = 1, 15 do
EnableDispatchService(service, false)
end
end)
CreateThread(function()
while true do
if GetPlayerWantedLevel(PlayerId()) > 0 then
SetPlayerWantedLevel(PlayerId(), 0, false)
SetPlayerWantedLevelNow(PlayerId(), false)
end
Wait(500)
end
end)EnableDispatchService leva um índice de serviço e um booleano. O loop sobre 1 a 15 cobre a polícia, helicóptero, fogo, ambulância e outros serviços que o jogo define. O loop de nível desejado pega qualquer coisa que escapa.
Se você manter a polícia no seu servidor para roleplay, não desabilite os serviços para jogadores que estão de serviço. Lide com aquele caso no seu script de job.
Outras coisas que você pode querer desligadas
População é mais do que peds e carros. Estes nativos removem algumas outras fontes, cada um leva um booleano:
SetGarbageTrucks(false)
SetRandomBoats(false)
SetRandomTrains(false)Chame-os uma vez ao iniciar, eles não precisam de um loop por frame.
Trade-offs de desempenho
O que você ganha. Cada ped e veículo é simulado, desenhado e sincronizado. Cortá-los corta o custo do cliente e o número de entidades na rede. Em PCs fracos isso pode ser uma grande diferença de fps. Para outras correções de fps, veja low FPS in FiveM.
O que você paga. Um loop com Wait(0) roda a cada frame, então mantenha-o pequeno e coloque os nativos em apenas um thread. Um loop de cinco chamadas é barato, mas dez scripts diferentes cada um com seu próprio loop não é. Verifique que seu servidor já não define a densidade, e seu monitor de recursos em resmon.
A atmosfera. Um mundo sem NPCs é sem vida. Reduzir tráfego e manter alguns peds é um meio termo melhor, e carros estacionados são baratos de manter já que não se movem.
Gameplay. Muitos scripts confiam em peds ou carros: uma venda de droga, um roubo com reféns, um heist com tráfego. Teste-os com suas configurações de densidade, já que um job que precisa um transeunte falhará em uma cidade vazia.
Erros comuns
- Chamando os multiplicadores uma vez. Eles retonam a cada frame, use um loop.
- Um
Waitlongo no loop. ComWait(1000)a densidade se aplica um frame por segundo e os NPCs spawnam nas lacunas. Deve serWait(0). - Dois scripts com valores diferentes. A última chamada do frame ganha, então você obtém resultados inconsistentes. Mantenha uma fonte.
- Esquecendo os carros estacionados. Tráfego em zero e carros estacionados no padrão ainda deixa uma rua cheia de carros.
- Esperando que o servidor remova NPCs que não possui. População ambiente é lado do cliente, além da mudança de routing bucket.
Checklist
| Sintoma | Solução |
|---|---|
| NPCs voltam após um momento | Chame os nativos de densidade a cada frame com Wait(0) |
| Tráfego desaparecido, carros estacionados ficam | Adicione SetParkedVehicleDensityMultiplierThisFrame |
| Peds sentam em cenários | Adicione SetScenarioPedDensityMultiplierThisFrame(interior, exterior) |
| Policiais ainda aparecem | Nível desejado 0, EnableDispatchService desligado, policiais aleatórios desligados |
| Precisa de NPCs em uma instância | SetRoutingBucketPopulationEnabled no servidor |
| Cidade parece vazia | Use valores como 0.3 a 0.5 em vez de 0.0 |
| Tempo alto de resmon | Um loop apenas, nenhum script duplicado |
Respostas rápidas
Por que NPCs voltam após eu defino a densidade para 0?
Os nativos de densidade apenas duram um frame. Se você os chamar uma vez, o jogo volta ao padrão no próximo frame, então eles devem ser chamados em um loop que roda a cada frame.
Desabilitar NPCs melhora o desempenho?
Sim, menos peds e carros significa menos trabalho para o cliente, e mais fps em máquinas fracas. Também torna a cidade vazia, então muitos servidores reduzem a densidade em vez de removê-la.
Como removo a resposta da polícia?
Desligue os serviços de dispatch com EnableDispatchService, defina o nível desejado para 0 e pare polícia aleatória. Faça os três, já que cada um cobre uma parte diferente.
Scripts sem esse problema
Advanced BoostingBoosting de veículos pelo tablet: contratos da classe D à S+, crews e fila ao vivo.Ver script →
Quest CreatorUm editor visual de missões e diálogos com NPCs, montado nó por nó dentro do jogo.Ver script →
CCTV Security CamerasCâmeras posicionáveis, um tablet com várias telas ao vivo e fotos impressas como prova.Ver script →