ikt Posted June 27, 2021 Share Posted June 27, 2021 I'm dealing with a slight annoyance in my ghost car/replay script: At high speeds, the replayed vehicle has a noticeable amount of jitter. The script works by recording the time since starting the recording, position, rotation and other details each frame, and saving that. At a later point, the script starts playing the recording again. The correct frame to replay is found, by getting the two frames surrounding the current GameTime with respect to the start of the recording. It then interpolates between those frames with the current GameTime for the current frame. At lower vehicle speeds, this looks perfectly smooth, but at high speeds, jitter starts happening, as seen in the linked video. I've gone and checked a few possible causes: Is my linear interpolation the issue? Is my frame selection bad? Is the replay linear and doesn't it go back a frame sometimes? It turned out to be the recording, or the data, or so I think it is. The time delta and the distance deltas don't add up, and calculating a speed based on these values resulted in large differences in speed. Could it have been the precision? The GameTimer native only returns an integer, and at my 144Hz, a frame takes 6-9 milliseconds. The system timer can go to microseconds. I then tried to use the system timer, foregoing time-modifying events like pausing or slow motion, but even then, the issues remained the same: the recorded timestamp for a set of frames did not match the distance traveled in those frames. I have tried to see if I somehow got my delta-T's mixed up, but they do belong to the frame they're recorded in. I'm at a loss here. What can I do to eliminate the jitter in recording/replay? I feel the solution lies in getting a more accurate GameTime, one which agrees with the actual positions of the entity I'm recording - but there seems to be no native for that. Does anybody have an idea how to solve this? Link to comment Share on other sites More sharing options...
ikt Posted June 28, 2021 Author Share Posted June 28, 2021 Managed to solve the issue - keeping my own timer and using GET_FRAME_TIME to get accurate readings. Since I also ran into rounding issues with floats, I ended up using doubles everywhere (and still store my timestamps based on milliseconds). Everything works great now, even at stupid speeds like 1000 kph. GET_FRAME_TIME also keeps working nicely with timescale changes and pausing, so this is perfect. Link to comment Share on other sites More sharing options...
DuncanMac Posted June 29, 2021 Share Posted June 29, 2021 On 6/28/2021 at 5:01 PM, ikt said: Managed to solve the issue - keeping my own timer and using GET_FRAME_TIME to get accurate readings. Since I also ran into rounding issues with floats, I ended up using doubles everywhere (and still store my timestamps based on milliseconds). Everything works great now, even at stupid speeds like 1000 kph. GET_FRAME_TIME also keeps working nicely with timescale changes and pausing, so this is perfect. Sadly you are the only person here, at least who is visible, who can help at your level. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now