From the opengl wiki:
Recent GL drivers implement a new WGL/GLX extension called EXT_swap_control_tear.
This extension brings "adaptive vsync" as featured in modern gaming consoles to the PC.
Adaptive vsync enables v-blank synchronisation when the frame rate is higher than the
sync rate, but disables synchronisation when the frame rate drops below the sync rate.
Disabling the synchronisation on low frame rates prevents the common problem where the
frame rate syncs to a integer fraction of the screen's refresh rate in a complex scene.
If the EXT_swap_control_tear extension is not supported, JOGL uses the absolute value
as the swap interval, 1, the same as before.
Shortly after logging in there several frames without a tli, and so no scene is
rendered on them. Since we glClear the entire buffer each frame and re-render
the most recent scene draw to emulate the vanilla effect of not painting over
the viewport, the viewport offset x/y values at the time we draw the frame may
be -1 due to that frame not having the scene rendered. Store the viewport
offsets at the time of the most recent scene draw and use them for each
subsequent frame.
With invokeLater() now running next tick instead of next frame, with uncapped fps there can be several frames with the bank pin visible in the chatbox. This blocks the keyboard input on this tick, preventing having to clear the chatbox later.
Also move the RL Instructions from the script assembler to cache too, so it can be reused by the updater. The api Opcodes class has no use in the public api and so is removed.
Doing the xp calculation with floats and then converting it to double is
less precise, and causes minor errors that accumulate with very large xp
ranges
XP cannot be more precise than a 10th of an xp. This was compute more precise xp values and when applied over many actions caused the computed actions to be incorrect