It’s probably because you’re trying to use InsertService in a localscript. What’s the code for it and what type of script it is?
I checked inside each script and i dont see any “InsertService” is “GetService” related?
Hmm, could you show me the script the error is coming from and tell me what type of script is it. It could be that you have to convert it into a regular script instead of a localscript judging by the error
OK THE ERROR IS GONE!
i had a script in serverscriptservice
So everything is good now? The error is gone, your FPS tracker works server sided now, is there anything else?
No everything is good! tysm!!!
That’s good! I recommend putting one of the psots that have helped you the most as the solution so people seeing this post can easily know which helped you the most so it can help them as well! If you have anymore issues don’t be afraid to make another post!
There is no need to use run service functions to find the player FPS, you can simply do
local fps = workspace:GetRealPhysicsFPS()
print(fps)
I did a bit of research and I think this may work
local rs = game:GetService("RunService")
while true do
script.Parent.Text = 1 / rs.Heartbeat:Wait()
wait(1)
end
I’m not sure about accuracy, but I did find that you could use 1 / step to get the fps instead of using RunService, which caps at 60 times a second
That can work but Heartbeat and RenderStepped can be very inaccurate and can cause up to ± 10 to 15 fps differences. Theres a very good tracker which I linked below
(not my code)
local Heartbeat = game:GetService("RunService").Heartbeat
local LastIteration, Start
local FrameUpdateTable = { }
local function HeartbeatUpdate()
LastIteration = tick()
for Index = #FrameUpdateTable, 1, -1 do
FrameUpdateTable[Index + 1] = (FrameUpdateTable[Index] >= LastIteration - 1) and FrameUpdateTable[Index] or nil
end
FrameUpdateTable[1] = LastIteration
local CurrentFPS = (tick() - Start >= 1 and #FrameUpdateTable) or (#FrameUpdateTable / (tick() - Start))
CurrentFPS = math.floor(CurrentFPS)
end
Start = tick()
Heartbeat:Connect(HeartbeatUpdate)
(this needs to be a local script, and the current fps is the CurrentFPS
variable)
That’s actually the same post where I got 1 / step from actually haha. I wasn’t sure which one to post since I wasn’t sure if he was wanting speed or accuracy.
Also it can’t be a local script for what he wants since he wants the current fps of the player to be displayed for everyone, unless he decides that it’s better to use a Local Script in which case to use a Remote Event
Ohhh, well then in that case you might need to send the FPS through a remote event so the server can display it, but dang that’s a lot of firing if you’re doing it >= 60 times a second.
But I think 1 / RenderStepped:Wait()
is good, but the method I linked above seems to be better for accuracy
It would probably be very unperformant to do it like that since it’s going to be fired every second, and combine that with a lot of players, and it’s going to cause performance drops most likely
I still personally think that 1 / step would be better since it’s faster although sacrifices accurate FPS, but the method you mentioned is also good for accuracy at the sake of speed
In the end, it’s going to depend on what @sk2lly wants for his game, accurate fps or fast fps display
yeah true, but then how would it update for everyone else?
Actually now that I closely realise this, I think he has no real choice but to update it with a RemoteEvent since doing it on the server would get the server’s wait time, not the client’s wait time.
The best way to do is do what you said about putting it in a local script, and what I said about RemoteEvents, but it has to update it at larger intervals, like every 5 or 10 seconds, since every second would be too much and could cause problems, especially if there are a lot of players in game
Yeah, if you have 10+ players thats 60 updates a second for each player, so 600+ updates a second for everyone, that’s a lotta work
You can’t check a client’s fps from the server. You have to use a RemoteEvent that updates every few seconds like @EmbatTheHybrid said above.
Also, the correct way to measure fps is 1 / RenderStepped:Wait()
(as @Krythoptic mentioned), RenderStepped
is directly connected to the framerate, whereas Heartbeat
and Stepped
are physics related. (they fire every frame, after and before physics calculations are finished, respectively)
RenderStepped
The RenderStepped event fires every frame, prior to the frame being rendered.
Heartbeat
The Heartbeat event fires every frame, after the physics simulation has completed.
Stepped
The Stepped event fires every frame prior to the physics simulation.
I think we mentioned that this is meant to be a local script, and yes although RenderStepped is the proper option, it seems that Heartbeat also runs just as well, although with Stepped, that actually comes with 2 arguments, runTime, AND deltaTime, so doing Stepped:Wait() won’t work.
local Stepped = game:GetService("RunService").Stepped
Stepped:Connect(function(runTime, deltaTime)
local FPS = 1 / deltaTime
end)
Sorry, misread, I thought you were trying to say we weren’t doing this on a local script.