Page MenuHomeFeedback Tracker

Massive FPS drop on client with server owned vehicles [VIDEO]
Closed, ResolvedPublic

Description

The following video demonstrates just how badly server spawned and owned vehicles can affect your client.

http://www.youtube.com/watch?v=BEIjgawxAZU

I have spawned on server maybe 15 "B_MBT_01_cannon_F" tanks before FPS on my client dropped to almost 10. Server stayed at 49. As you can see on the video I then transferred ownership of all tanks to my client with setOwner command, which almost tripled my client FPS to about 30. At the same time server FPS dropped to 36. I then deleted all tanks but it did not make much difference. It did also improve FPS little bit in my earlier experiments. When I had my server recovered in this video, FPS on client increased to 40.

So this is what I find very strange. Why server owned vehicles lag my client so badly? Why when I transfer them to my client they start lagging server instead? Considering a vehicle usually belongs to the server until someone jumps in driver seat, are you really surprised Arma 3 performs so badly online?

I have already made tonnes more tickets about vehicles and locality in MP problems. Now BIS dudes at least you know where to start looking :)

PS What I cannot test by myself is what if I get ownership of all vehicles will it lag another client along with the server?

Details

Legacy ID
3038057648
Severity
None
Resolution
Fixed
Reproducibility
Always
Operating System
Windows 7
Category
Performance
Steps To Reproduce

Keep spawning tanks on server until your client FPS goes to the dogs, then change tanks ownership to your client.

Event Timeline

Killzone_Kid edited Additional Information. (Show Details)
Killzone_Kid set Category to Performance.
Killzone_Kid set Reproducibility to Always.
Killzone_Kid set Severity to None.
Killzone_Kid set Resolution to Fixed.
Killzone_Kid set Legacy ID to 3038057648.May 7 2016, 5:44 PM
Windies added a subscriber: Windies.May 7 2016, 5:44 PM

Sounds like an issue with the simulation of entities across the network. Did you try it with squads of AI for instance? Is it just vehicles or is it any simulated entity across the network?

Should be fixed in 115784. Pls test when it hits the dev branch (should be tomorrow).

I don't know if this could be called fixed.

Yes it is true, the server owned vehicles do not cause FPS drop neither on client no on the server now. However if I transfer ownership to my client, I get instant FPS drop on the client now. If I delete all vehicles I get FPS rise.

I spawned 14 tanks on the server, FPS on the client was around 42, server 50. Then I transferred all 14 tanks to my client, FPS on client gone down to 30, server was still 50.

After a few minutes, FPS on client went up to 38, but the picture still felt a bit jittery. After deleting all vehicles FPS went back to around 42 and screen jitter has gone too.

42 to 30 is a pretty big difference for 14 tanks. Can you attach the test mission so we can investigate?

FrankHH added a subscriber: FrankHH.May 7 2016, 5:44 PM

Fixed according to the dev branch. Another step towards better FPS, nice one BIS

@dazhbog

Rather than making a mission, I am going to paste the code you can just copypaste to your init.sqf.

It will spawn 20 tanks and after 45 seconds move them to your client and after 45 seconds will delete them.

Run this test on Stratis. Run it several times each time restarting the dedicated server. I found that results differ quite a bit each run. The big fps drop on client did not happen every time but it did happen again after a few tries.

if (!isDedicated) then {
player setDir 20.639;
player setPos [2697.19,5738.93,0.00203514];
ps = player;
publicVariable "ps";
onEachFrame {

		hintSilent format [
			"fps: %1\nfpsmin: %2\nlocalVeh: %3/20\nremoteVeh: %4/20",
			round diag_fps,
			round diag_fpsmin,
			{local _x} count vehicles,
			{!local _x && _x isKindOf "Tank"} count vehicles
		];

};

KK_fnc_FX = {
    private "_veh";
    _veh = _this select 0;
    _vel = _this select 1;
    for "_i" from 1 to 100 do {
        drop [
            ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 7, 48],
            "",
            "Billboard",
            0, 
            1 + random 0.5,
            [0, -2, 1.5],
            [-20 + random 40, -20 + random 40, -15 + _vel],
            1,
            0.05,
            0.04,
            0, 
            [0.5, 10 + random 20],
            [
                [0,0,0,1],
                [0,0,0,0.3],
                [1,1,1,0.1],
                [1,1,1,0.03],
                [1,1,1,0.01],
                [1,1,1,0.003],
                [1,1,1,0.001],
                [1,1,1,0]
            ],
            [1],
            0.1,
            0.1,
            "",
            "",
            _veh,
            random 360,
            true,
            0.1
        ];
    };
};
"#FX" addPublicVariableEventHandler {_this select 1 spawn KK_fnc_FX};

};
if (isServer) then {

KK_fnc_paraDrop = {
    private ["_class","_para","_paras","_p","_veh","_vel","_time"];
    _class = format [
        "%1_parachute_02_F", 
        toString [(toArray faction _this) select 0]
    ];
    _para = createVehicle [_class, [0,0,0], [], 0, "FLY"];
    _para setDir getDir _this;
    _para setPos getPos _this;
    _paras =  [_para];
    _this attachTo [_para, [0,2,0]];
    {
        _p = createVehicle [_class, [0,0,0], [], 0, "FLY"];
        _paras set [count _paras, _p];
        _p attachTo [_para, [0,0,0]];
        _p setVectorUp _x;
    } count [
        [0.5,0.4,0.6],[-0.5,0.4,0.6],[0.5,-0.4,0.6],[-0.5,-0.4,0.6]
    ];
    0 = [_this, _paras] spawn {
        _veh = _this select 0;
        waitUntil {getPos _veh select 2 < 4};
        _vel = velocity _veh;
        detach _veh;
        _veh setVelocity _vel;
        missionNamespace setVariable ["#FX", [_veh, _vel select 2]];
        publicVariable "#FX";
        playSound3D [
            "a3\sounds_f\weapons\Flare_Gun\flaregun_1_shoot.wss",
            _veh
        ];
        {
            detach _x;
            _x disableCollisionWith _veh;   
        } count (_this select 1);
        _time = time + 5;
        waitUntil {time > _time};
        {
            if (!isNull _x) then {deleteVehicle _x};
        } count (_this select 1);
    };
};

0 spawn {

		waitUntil {!isNil "ps"};
		ps enableSimulationGlobal false;
		for "_i" from 1 to 20 do {
			_tank = "I_MBT_03_cannon_F" createVehicle [0,0,0];
			_tank setDir random 360;
			_tank setPos [2697.19 - random 200 + 100, 5738.93 + random 100, 150];
			_tank call KK_fnc_paraDrop;
			uiSleep 3;
		};
		sleep 45;
		{_x setOwner owner ps} forEach vehicles;
		ps enableSimulationGlobal true;
		sleep 45;
		{deleteVehicle _x} forEach vehicles;

};
};

Other things to note:

water spalshes when tanks land on the ground
dust from tracks while in the air
enableSimulationGlobal false; sometimes fails

LouMontana closed this task as Resolved.Jun 9 2021, 10:27 AM
LouMontana updated the task description. (Show Details)
LouMontana edited Additional Information. (Show Details)
LouMontana set Operating System to Windows 7.