What's new in v1.4.8
Here is a summary of the main changes in v1.4.8. You can see the full changelog file here.
This release features mainly small fixes and code cleanup.
Realtime playback
Some users want to be able to playback games at full speed in libTAS. Until now, even with no lagging, games have still been running slightly slower than full speed.
The following changes made realtime playback more accurate:
- at the end of each frame, the deterministic timer sleeps to aim for the target framerate. If the frame took longer than the target framerate, it will sleep less on future frames to account for it. If too much delay has been accumulated, based on a threshold, it resets the delay. This threshold delay has been increased greatly.
- to catch up on slow frames, the game would need to draw faster than target framerate,
but for games using vsync, the graphics driver would allow for it. Even if we
disable vsync, on Linux, games would still run at the display maximum framerate.
This feature was disabled by setting the env variable
vblank_modeto 0. - to catch up on slow frames, the game would need to playback audio samples faster than target framerate. This could be an issue if the audio engine is blocking when the buffer is full. Now, when the buffer is full, the audio samples are not played back. This will cause slight distortions, some emulators do stretch the audio samples to account for it.
Savestates
As a critical part of the tool, savestating feature has received some improvements:
Incremental savestates
There was a long standing bug that made incremental savestates inaccurate. The same bug was causing users with a recent kernel to be unable to load savestates because lightweight guard pages were not detected correctly.
File descriptors recovery
The list of file descriptors is now better restored, by scanning all file descriptors before the savestate, and attempting at restoring the same list. All files created during the savestate process are manipulated to have a very high value, so that they likely won’t conflict with the game’s own file descriptors.