mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	improved delta calculations for capped framrates
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				Build coop / build-linux (push) Has been cancelled
				
			
		
			
				
	
				Build coop / build-steamos (push) Has been cancelled
				
			
		
			
				
	
				Build coop / build-windows-opengl (push) Has been cancelled
				
			
		
			
				
	
				Build coop / build-windows-directx (push) Has been cancelled
				
			
		
			
				
	
				Build coop / build-macos-arm (push) Has been cancelled
				
			
		
			
				
	
				Build coop / build-macos-intel (push) Has been cancelled
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	Build coop / build-linux (push) Has been cancelled
				
			Build coop / build-steamos (push) Has been cancelled
				
			Build coop / build-windows-opengl (push) Has been cancelled
				
			Build coop / build-windows-directx (push) Has been cancelled
				
			Build coop / build-macos-arm (push) Has been cancelled
				
			Build coop / build-macos-intel (push) Has been cancelled
				
			This commit is contained in:
		
							parent
							
								
									46b1a8bbb9
								
							
						
					
					
						commit
						593eb9aafc
					
				
					 1 changed files with 12 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -61,6 +61,8 @@
 | 
			
		|||
#include "gfx_dimensions.h"
 | 
			
		||||
#include "game/segment2.h"
 | 
			
		||||
 | 
			
		||||
#include "engine/math_util.h"
 | 
			
		||||
 | 
			
		||||
#ifdef DISCORD_SDK
 | 
			
		||||
#include "pc/discord/discord.h"
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -203,18 +205,16 @@ static s32 get_num_frames_to_draw(f64 t, u32 frameLimit) {
 | 
			
		|||
static u32 get_refresh_rate() {
 | 
			
		||||
    if (configFramerateMode == RRM_MANUAL) { return configFrameLimit; }
 | 
			
		||||
    if (configFramerateMode == RRM_UNLIMITED) { return 3000; } // Has no effect
 | 
			
		||||
#ifdef HAVE_SDL2
 | 
			
		||||
    static u32 refreshRate = 60;
 | 
			
		||||
#ifdef HAVE_SDL2
 | 
			
		||||
    if (!refreshRate) {
 | 
			
		||||
        SDL_DisplayMode mode;
 | 
			
		||||
        if (SDL_GetCurrentDisplayMode(0, &mode) == 0) {
 | 
			
		||||
            refreshRate = (u32) mode.refresh_rate;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return refreshRate;
 | 
			
		||||
#else
 | 
			
		||||
    return 60;
 | 
			
		||||
#endif
 | 
			
		||||
    return refreshRate;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void produce_interpolation_frames_and_delay(void) {
 | 
			
		||||
| 
						 | 
				
			
			@ -229,15 +229,21 @@ void produce_interpolation_frames_and_delay(void) {
 | 
			
		|||
    f64 curTime = clock_elapsed_f64();
 | 
			
		||||
    f64 loopStartTime = curTime;
 | 
			
		||||
    f64 expectedTime = 0;
 | 
			
		||||
    u16 frames = 0;
 | 
			
		||||
    const f64 interpFrameTime = sFrameTime / (f64) numFramesToDraw;
 | 
			
		||||
 | 
			
		||||
    // interpolate and render
 | 
			
		||||
    // make sure to draw at least one frame to prevent the game from freezing completely
 | 
			
		||||
    // (including inputs and window events) if the game update duration is greater than 33ms
 | 
			
		||||
    do {
 | 
			
		||||
        ++frames;
 | 
			
		||||
 | 
			
		||||
        // when we know how many frames to draw, use a precise delta
 | 
			
		||||
        f64 idealTime = configFramerateMode != RRM_UNLIMITED ? (sFrameTimeStart + interpFrameTime * frames) : curTime;
 | 
			
		||||
        f32 delta = (
 | 
			
		||||
            is30Fps ?
 | 
			
		||||
            1.0f :
 | 
			
		||||
            MIN(MAX((curTime - sFrameTimeStart) / sFrameTime, 0.f), 1.f)
 | 
			
		||||
            clamp((idealTime - sFrameTimeStart) / sFrameTime, 0.f, 1.f)
 | 
			
		||||
        );
 | 
			
		||||
        gRenderingDelta = delta;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -248,7 +254,7 @@ void produce_interpolation_frames_and_delay(void) {
 | 
			
		|||
        gfx_end_frame_render();
 | 
			
		||||
 | 
			
		||||
        // delay if our framerate is capped
 | 
			
		||||
        if (!configUncappedFramerate && !configWindow.vsync) {
 | 
			
		||||
        if (configFramerateMode != RRM_UNLIMITED && !configWindow.vsync) {
 | 
			
		||||
            f64 now = clock_elapsed_f64();
 | 
			
		||||
            f64 elapsedTime = now - loopStartTime;
 | 
			
		||||
            expectedTime += (targetTime - curTime) / (f64) numFramesToDraw;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue