## Überwachen der ServerperformanzAus aktuellem Anlass (ausgefallene Mission 2021-10-02 aufgrund von Unspielbarkeit):
Weitere Tests haben eindeutig bestätigt: Die Serverkonfiguration ist in Ordnung und sehr performant. Die Mission selber, konkret das "Objekte auf Karte löschen" beeinträchtigt die Serverperformance so signifikant dass ein Spielen schon mit 4 Personen effektiv nicht möglich ist.
Mit neuen Servereinstellungen kein Problem auf Trainingslager, server-FPS (#monitor 5) 166:
https://steamuserimages-a.akamaihd.net/ugc/1620724107038002141/D5C561FB55C791D607AF8D0CB5E7312F1578C611/Originale Event-Mission: server-FPS 0 (!):
https://steamuserimages-a.akamaihd.net/ugc/1620724107038001899/854DD6C8F3D1517BDDEDF2BA0F9E0A4FF819EB07/Korrigierte Event-Mission "test2", keine "Kornfeld-Löschung" server-FPS 50, nicht optimal, evtl. auch zu wenig für 50 Spieler:
https://steamuserimages-a.akamaihd.net/ugc/1620724107038000975/090BDCD16FC0E0AC2233FE39E34341A0193BB5B6/Deswegen, einfaches Vorgehen: Mission auf Server laden (nicht nur lokalen PC), als Admin einloggen, Kommando eingeben
#monitor 5
und Serverperformanz prüfen. Server-FPS sollte deutlich über 30 FPS, besser über 50 FPS liegen
## FPS-NotfallturboMeine Vermutung ist dass Spieler mit sehr geringen FPS, sagen wir mal unter 20, für Probleme auf dem Server sorgen können weil z.B. dieser Client nicht mehr alle Nachrichten des Servers zeitnah beantworten kann und dann der Server selber nicht mehr mit der Aktualisierung für alle Spieler nachkommt. Um das zu verhindern kann sollte es möglich sein notfalls die Sichtweite der Spieler hart zu begrenzen. Das kann über die "Extended Debug Console" auch während der Mission gemacht werden. Mein Vorschlag per Skript:
if !(hasInterface) exitWith{};
niCe_autoViewDistance = true;
0 spawn {
fps = [100, 101, 102, 103, 104, 105, 106, 107];
_maxDistance = viewDistance;
while { uiSleep 0.3; niCe_autoViewDistance } do {
fps pushBack diag_fps;
fps sort true;
median_fps = fps deleteAt 4;
_distance = viewDistance;
if (median_fps < 30) then { _distance = _distance - 100 };
if (median_fps > 45) then { _distance = _distance + 100 };
if ((_distance min _maxDistance) <= _maxDistance) then { setViewDistance _distance };
};
};
mit
GLOBAL EXEC ausführen. Zum Ausschalten:
niCe_autoViewDistance = false;
Zum Testen und Entwickeln:
TODO:
* Also set `setObjectViewDistance _distance`
* use diag_fps directly, no array
# Anfangswerte setzen und bisherige Hintergrundskripte beenden
setViewDistance 6000;
niCe_autoViewDistance = false;
sleep 0.3;
# Debugausgabe innerhalb der Schleife
systemChat format ["median FPS: %1, viewDistance: %2, %3", median_fps, viewDistance, fps];
Version 1:
missionNamespace setVariable ["_automaticViewDistance", true];
0 spawn {
_fps = [60];
_maxDistance = viewDistance;
while { uiSleep 0.3; missionNamespace getVariable "_automaticViewDistance" } do {
_fps pushBack diag_fps;
_fps sort true;
_median_fps = _fps deleteAt 5;
_distance = viewDistance;
if (_median_fps < 30) then { _distance = _distance - 100 };
if (_median_fps > 45) then { _distance = _distance + 100 };
if ((_distance min _maxDistance) <= _maxDistance) then { setViewDistance _distance };
};
};
Zum Ausschalten:
missionNamespace setVariable ["_automaticViewDistance", false];
Zum Testen und Entwickeln:
[spoiler]
# Anfangswerte setzen und bisherige Hintergrundskripte beenden
setViewDistance 6000;
missionNamespace setVariable ["_automaticViewDistance", false];
sleep 0.3;
# Debugausgabe innerhalb der Schleife
systemChat format ["median FPS: %1, viewDistance: %2, %3", _median_fps, viewDistance, _fps];