Add option to fix the framerate to the native screen refresh rate
Useful on mobile devices where using non-standard framerates looks absolutely horrible and screen refresh rates vary highly.
This commit is contained in:
		
							parent
							
								
									4fb94aaf10
								
							
						
					
					
						commit
						146e0294b4
					
				
					 6 changed files with 44 additions and 6 deletions
				
			
		| 
						 | 
					@ -88,6 +88,17 @@
 | 
				
			||||||
# frameSkip=true
 | 
					# frameSkip=true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Use a fixed framerate that is approx. equal to the
 | 
				
			||||||
 | 
					# native screen refresh rate. This is different from
 | 
				
			||||||
 | 
					# "fixedFramerate" because the actual frame rate is
 | 
				
			||||||
 | 
					# reported back to the game, ensuring correct timers.
 | 
				
			||||||
 | 
					# If the screen refresh rate cannot be determined,
 | 
				
			||||||
 | 
					# this option is force-disabled
 | 
				
			||||||
 | 
					# (default: disabled)
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# syncToRefreshrate=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Don't use alpha blending when rendering text
 | 
					# Don't use alpha blending when rendering text
 | 
				
			||||||
# (default: disabled)
 | 
					# (default: disabled)
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -152,6 +152,7 @@ Config::Config()
 | 
				
			||||||
      defScreenH(0),
 | 
					      defScreenH(0),
 | 
				
			||||||
      fixedFramerate(0),
 | 
					      fixedFramerate(0),
 | 
				
			||||||
      frameSkip(true),
 | 
					      frameSkip(true),
 | 
				
			||||||
 | 
					      syncToRefreshrate(false),
 | 
				
			||||||
      solidFonts(false),
 | 
					      solidFonts(false),
 | 
				
			||||||
      subImageFix(false),
 | 
					      subImageFix(false),
 | 
				
			||||||
      gameFolder("."),
 | 
					      gameFolder("."),
 | 
				
			||||||
| 
						 | 
					@ -181,6 +182,7 @@ void Config::read(int argc, char *argv[])
 | 
				
			||||||
	PO_DESC(defScreenH, int) \
 | 
						PO_DESC(defScreenH, int) \
 | 
				
			||||||
	PO_DESC(fixedFramerate, int) \
 | 
						PO_DESC(fixedFramerate, int) \
 | 
				
			||||||
	PO_DESC(frameSkip, bool) \
 | 
						PO_DESC(frameSkip, bool) \
 | 
				
			||||||
 | 
						PO_DESC(syncToRefreshrate, bool) \
 | 
				
			||||||
	PO_DESC(solidFonts, bool) \
 | 
						PO_DESC(solidFonts, bool) \
 | 
				
			||||||
	PO_DESC(subImageFix, bool) \
 | 
						PO_DESC(subImageFix, bool) \
 | 
				
			||||||
	PO_DESC(gameFolder, std::string) \
 | 
						PO_DESC(gameFolder, std::string) \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,6 +86,7 @@ struct Config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int fixedFramerate;
 | 
						int fixedFramerate;
 | 
				
			||||||
	bool frameSkip;
 | 
						bool frameSkip;
 | 
				
			||||||
 | 
						bool syncToRefreshrate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool solidFonts;
 | 
						bool solidFonts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -187,6 +187,7 @@ struct RGSSThreadData
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Vec2 sizeResoRatio;
 | 
						Vec2 sizeResoRatio;
 | 
				
			||||||
	Vec2i screenOffset;
 | 
						Vec2i screenOffset;
 | 
				
			||||||
 | 
						const int refreshRate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Config config;
 | 
						Config config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -196,12 +197,14 @@ struct RGSSThreadData
 | 
				
			||||||
	               const char *argv0,
 | 
						               const char *argv0,
 | 
				
			||||||
	               SDL_Window *window,
 | 
						               SDL_Window *window,
 | 
				
			||||||
	               ALCdevice *alcDev,
 | 
						               ALCdevice *alcDev,
 | 
				
			||||||
 | 
						               int refreshRate,
 | 
				
			||||||
	               const Config& newconf)
 | 
						               const Config& newconf)
 | 
				
			||||||
	    : ethread(ethread),
 | 
						    : ethread(ethread),
 | 
				
			||||||
	      argv0(argv0),
 | 
						      argv0(argv0),
 | 
				
			||||||
	      window(window),
 | 
						      window(window),
 | 
				
			||||||
	      alcDev(alcDev),
 | 
						      alcDev(alcDev),
 | 
				
			||||||
	      sizeResoRatio(1, 1),
 | 
						      sizeResoRatio(1, 1),
 | 
				
			||||||
 | 
						      refreshRate(refreshRate),
 | 
				
			||||||
	      config(newconf)
 | 
						      config(newconf)
 | 
				
			||||||
	{}
 | 
						{}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -628,10 +628,19 @@ Graphics::Graphics(RGSSThreadData *data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	p = new GraphicsPrivate(data);
 | 
						p = new GraphicsPrivate(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (data->config.fixedFramerate > 0)
 | 
						if (data->config.syncToRefreshrate)
 | 
				
			||||||
		p->fpsLimiter.setDesiredFPS(data->config.fixedFramerate);
 | 
						{
 | 
				
			||||||
	else if (data->config.fixedFramerate < 0)
 | 
							p->frameRate = data->refreshRate;
 | 
				
			||||||
		p->fpsLimiter.disabled = true;
 | 
							p->fpsLimiter.disabled = true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (data->config.fixedFramerate > 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							p->fpsLimiter.setDesiredFPS(data->config.fixedFramerate);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (data->config.fixedFramerate < 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							p->fpsLimiter.disabled = true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Graphics::~Graphics()
 | 
					Graphics::~Graphics()
 | 
				
			||||||
| 
						 | 
					@ -798,6 +807,9 @@ void Graphics::setFrameRate(int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	p->frameRate = clamp(value, 10, 120);
 | 
						p->frameRate = clamp(value, 10, 120);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (p->threadData->config.syncToRefreshrate)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->threadData->config.fixedFramerate > 0)
 | 
						if (p->threadData->config.fixedFramerate > 0)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										15
									
								
								src/main.cpp
									
										
									
									
									
								
							
							
						
						
									
										15
									
								
								src/main.cpp
									
										
									
									
									
								
							| 
						 | 
					@ -68,13 +68,14 @@ printGLInfo()
 | 
				
			||||||
int rgssThreadFun(void *userdata)
 | 
					int rgssThreadFun(void *userdata)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	RGSSThreadData *threadData = static_cast<RGSSThreadData*>(userdata);
 | 
						RGSSThreadData *threadData = static_cast<RGSSThreadData*>(userdata);
 | 
				
			||||||
 | 
						const Config &conf = threadData->config;
 | 
				
			||||||
	SDL_Window *win = threadData->window;
 | 
						SDL_Window *win = threadData->window;
 | 
				
			||||||
	SDL_GLContext glCtx;
 | 
						SDL_GLContext glCtx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Setup GL context */
 | 
						/* Setup GL context */
 | 
				
			||||||
	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
 | 
						SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (threadData->config.debugMode)
 | 
						if (conf.debugMode)
 | 
				
			||||||
		SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);
 | 
							SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	glCtx = SDL_GL_CreateContext(win);
 | 
						glCtx = SDL_GL_CreateContext(win);
 | 
				
			||||||
| 
						 | 
					@ -103,7 +104,8 @@ int rgssThreadFun(void *userdata)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printGLInfo();
 | 
						printGLInfo();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SDL_GL_SetSwapInterval(threadData->config.vsync ? 1 : 0);
 | 
						bool vsync = conf.vsync || conf.syncToRefreshrate;
 | 
				
			||||||
 | 
						SDL_GL_SetSwapInterval(vsync ? 1 : 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	GLDebugLogger dLogger;
 | 
						GLDebugLogger dLogger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -283,9 +285,16 @@ int main(int argc, char *argv[])
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SDL_DisplayMode mode;
 | 
				
			||||||
 | 
						SDL_GetDisplayMode(0, 0, &mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Can't sync to display refresh rate if its value is unknown */
 | 
				
			||||||
 | 
						if (!mode.refresh_rate)
 | 
				
			||||||
 | 
							conf.syncToRefreshrate = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	EventThread eventThread;
 | 
						EventThread eventThread;
 | 
				
			||||||
	RGSSThreadData rtData(&eventThread, argv[0], win,
 | 
						RGSSThreadData rtData(&eventThread, argv[0], win,
 | 
				
			||||||
	                      alcDev, conf);
 | 
						                      alcDev, mode.refresh_rate, conf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int winW, winH;
 | 
						int winW, winH;
 | 
				
			||||||
	SDL_GetWindowSize(win, &winW, &winH);
 | 
						SDL_GetWindowSize(win, &winW, &winH);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue