Zum Inhalt springen

Performance

Die ehrliche Version: Die Scripts sind nicht der schwere Teil. Die Map ist es.

[the_apocalypse_project] ist eine Umwandlung der ganzen Karte über Los Santos, etwa 166 ymaps und ein MLO. Viele seiner ymaps haben Streaming-Extents von Kilometern, viel größer als die Props darin. Die Engine denkt also, die halbe Map sei gleichzeitig in Reichweite, und alles streamt im selben Moment um einen spawnenden Spieler herum ein. Daher kommt der Pool-Druck.

Die echte Lösung liegt in den Maps: die aufgeblähten Extents in CodeWalker mit sicherem Spielraum verkleinern. Das bringt mehr als jede Pool-Zeile unten.

server.cfg erhöht einige Pools mit increase_pool_size (der moderne Weg, gameconfig.xml wird nicht mehr beachtet):

increase_pool_size "Building" 500
increase_pool_size "StaticBounds" 2000
increase_pool_size "EntityDescPool" 5000
increase_pool_size "TxdStore" 8000
increase_pool_size "FragmentStore" 4000
increase_pool_size "fragInstGta" 800
increase_pool_size "Object" 800
# + interior/portal/occlusion, LightEntity, AttachmentExtension

Diese Werte sind absichtlich moderat, nicht das Maximum. Das Maximum kostet bei jedem Client Speicher, und Building weit über ~500 verursacht eigene Probleme.

Behalte set onesync_population false bei. Ambient-Population füllt genau die Pools, die du nicht erhöhen kannst.

Die Zombie-Limits sinken bereits von selbst:

  • Server-Frametime über Zombies.Net.perfBudgetMs (70) senkt das Limit, bis hinunter zu perfMinFactor
  • Gesamtzahl der Entities zwischen entitySoft und entityHard (1400 / 1900) senkt es, und über hard verschwinden die am weitesten entfernten Walker
  • ein Spieler unter fpsLow FPS bekommt weniger Walker in seiner Nähe

Stelle perfBudgetMs anhand des Frame-Durchschnitts ein, den /znet auf einem leeren Server zeigt. Ist dein Server einfach langsamer, schneidet der Standardwert ständig Zombies ab.

Auf der Client-Seite verhindert Streaming.PoolGuard.clientPedLimit (180) neue Walker-Peds, bevor der Ped-Pool voll ist, und ein Notfall-Cull entfernt zuerst Leichen, dann die am weitesten entfernten Walker.

resmon 1 -- client, per resource ms
profiler record 500 -- then profiler view
/znet -- zombie caps and server frame
/pools -- client ped pool

Es gibt kein /bsperf, die Resources führen keine internen Timer. Nimm resmon.

Im Oktober habe ich jedes Client-Script durchgesehen. Fast jede Schleife pro Frame ist bereits gedrosselt (sie schläft im Leerlauf 250-1000 ms). Die wenigen, die immer pro Frame laufen, sind Dinge, die die Engine jeden Frame braucht (HUD-Teile ausblenden, Population Density, Blackout-Lichter). Wenn du eine von uns im Leerlauf hoch in resmon siehst, ist das ein Bug, sag mir Bescheid.