Game Loop

카테고리 없음 2018. 12. 19. 00:25

Game Loop


게임 진행 시간을 유저입력, 프로세서속도와 디커플링




	while (true)
	{
		processInput();
		update();
		render();
	}


* 간단하지만 플랫폼과 작업량에 따라 게임 진행 시간이 바뀜





        #define MS_PER_FRAME 16

	while (true)
	{
		clock_t start = clock();
		processInput();
		update();
		render();

		Sleep(start + MS_PER_FRAME - clock());
	}


* 기준이 되는 프레임 속도 안에서 계산이 완료되면 쉬어줘서 전력효율 높임, 느려지는 게임에 대해서 대처 불가





	clock_t lastTime = clock();
	while (true)
	{
		clock_t current = clock();
		clcok_t elapsed = current - lastTime;
		processInput();
		update(elapsed);
		render();
		lastTime = current;
	}


* 현실 시간에 맞춰서 게임 진행 시간을 조절하지만 게임플레이가 불안정하고 코드가 비결정적(결과가 일정하지않음)





        #define MS_PER_FRAME 16

	clock_t lastTime = clock();
	double lag = 0.0;
	while (true)
	{
		clock_t current = clock();
		clcok_t elapsed = current - lastTime;
		lastTime = current;
		lag = lag + elapsed;
		processInput();

		while (lag >= MS_PER_UPDATE)
		{
			update();
			lag -= MS_PER_UPDATE;
		}
		render();
	}


* 느리거나 빨라도 잘 적응!


cf) 보간

 - 게임 상태 update는 거의 고정된 시간으로 일어남

 - render는 시간적 여유가 되면 일어남


   update와 render의 호출 빈도와 시간이 달라짐


 -> update(A)와 update(B) 사이에 render가 발생하면 A상태로 render하기 때문에 다음 render에서 튀어보일 수 있음



따라서 마지막줄 render의 파라미터로


lag / MS_PER_UPDATE : update(A)와 update(B) 사이에 흐르던 시간만큼 0부터 1로 정규화된 값


를 넘겨주고 그 값으로 보간한다






Posted by @히테
,