TPS Drop on Player Joining Server

Please select what you are reporting on:

Creative

What Type of Bug are you experiencing?

Stability

Summary

When players join a map in progress, there is a measurable drop in TPS of the server. This causes undesirable behavior for the player such as rubber banding and hitching.

Using TPS estimation code, you can observe the drop in TPS on/near player join. You can also feel the change in performance as a player

The TPS of a server can be estimated using this code (credit to @olivier_101 on X):

using { /Fortnite.com/Devices }
using { /Fortnite.com/Game }

using { /Verse.org/Simulation }
using { /Verse.org/Colors }
using { /Verse.org/Random }

using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/UI }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Fortnite.com/UI }

tick_rate_device := class(creative_device):

TickRateText<localizes><private>(TickRateString : string) : message = {"{TickRateString} TPS"}

TickRateTextBlock<private> : text_block = text_block:
    DefaultTextColor := NamedColors.White
    DefaultJustification := text_justification.Right
    
var AverageTickRate : float = 0.0
Canvas<private> : canvas = canvas{}
        
OnBegin<override>()<suspends>:void =

    LabelSlot := canvas_slot:
        Anchors := anchors:
            Minimum := vector2{X := 1.0, Y := 1.0}
            Maximum := vector2{X := 1.0, Y := 1.0}
        Alignment := vector2{X := 1.0, Y := 1.0 }
        Offsets := margin{Left := -195.0, Top := -8.0}
        Widget := TickRateTextBlock

    Canvas.AddWidget(LabelSlot)
    if:
        FirstPlayer := GetPlayspace().GetPlayers()[0]
        PlayerUI := GetPlayerUI[FirstPlayer]
    then:
        PlayerUI.AddWidget(Canvas)

    var PreviousTime : float = GetSimulationElapsedTime()

    loop:
        Sleep(0.0)
        CurrentTime := GetSimulationElapsedTime()
        DeltaTime := CurrentTime - PreviousTime
        set PreviousTime = CurrentTime

        TickRate := 1.0 / DeltaTime

        set AverageTickRate += (TickRate - AverageTickRate) / 3.0 # smooth it out so the text doesn't flicker distractingly as much
        TickRateTextBlock.SetText(TickRateText(GetRoundedString(AverageTickRate,2)))
        
        BarPercent := TickRate/30.0

GetRoundedString<private>(Input : float, NumDigitsAfterDecimal : int) : string =
    if:
        Multiplier := Pow(10.0, NumDigitsAfterDecimal * 1.0)
        RoundedValue := float[Round[Input*Multiplier]*1.0] / Multiplier
        BeforeDecimal := Floor[RoundedValue]
        AfterDecimal := Abs(Round[(RoundedValue - BeforeDecimal*1.0)*Multiplier])
        var AfterDecimalString : string = ToString(AfterDecimal)

        #pad the number after the decimal with leading zeroes
        for (It := 0..(NumDigitsAfterDecimal-AfterDecimalString.Length-1)):
            set AfterDecimalString = array{'0'} + AfterDecimalString
    then:
        "{BeforeDecimal}.{AfterDecimalString}"
    else:
        ToString(Input)

Steps to Reproduce

  1. Be playing fortnite creative map
  2. Wait for someone to join game
  3. Observe rubber banding/hitching/TPS drop

Expected Result

Game does not hitch, rubber band, or drop TPS on player join game

Observed Result

Game does hitch, rubber band, and drop TPS on player join game

Platform(s)

ALL