버그 해결을 위한 모든 질문을 던져
+1 vote
237 views
안녕하세요 DirectX를 이용하여 프레임 워크를 만들고있는데요

만든 프레임 워크를 돌려보니 CPU 점유율을 너무 많이 먹어서 GameLoop에 Slepp(1)을 넣으면 괜찮다는 글을보고 넣어봤습니다.

그 결과 점유율 문제는 해결됐는데요. 근데 Sleep(1)을 넣는 이유가 이해가 안돼서요.

혹시 sleep(1)을 넣으면 왜 점유율 문제가 해결되는지 답변해주실수있나요?

그리고 GameLoop에 Sleep을 걸어도 성능상 아무문제 큰 문제는 없나요?
asked (5 point) , 237 views

2 answers

+2 votes
https://docs.microsoft.com/en-us/windows/desktop/api/synchapi/nf-synchapi-sleep

 

해당 스레드를 강제로 반환 시킵니다. 한프레임 지난 다음이니 프레임이 너무 친다(60~) 싶으면

 

sleep를 걸어서 방지 해줘도 상관 없습니다.
answered (33 point)
앗 저도 링크 내용대로 숨돌릴틈 주는걸로 배웠는데

1말고 0만 넣어도
+3 votes

프레임마다 Sleep(1) 을 해도 되긴 하는데, 실재 상용 게임에서는 조금 부족한 처리 방식 같아서 

언리얼에서 찾아보았어요 

void UEngine::UpdateTimeAndHandleMaxTickRate() 함수에서 비슷한 처리를 하고 있는데

대충보니 대기해야 할 시간을 구하고, 그 시간의 5ms를 뺀 시간동안 sleep( waittime ) 을  먼저하고

sleep(0)을 반복적으로 호출하면서, 정확한 대기시간이 될때까지 더 기다리네요

// Sleep if we're waiting more than 5 ms. We set the scheduler granularity to 1 ms
// at startup on PC. We reserve 2 ms of slack time which we will wait for by giving
// up our timeslice.
if( WaitTime > 5 / 1000.f )
{
	// For improved handling of drag and drop, continue to pump messages while throttled down
	if (GIsEditor && ShouldThrottleCPUUsage())
	{
		do
		{
			FPlatformProcess::SleepNoStats(0.005f);
			FPlatformApplicationMisc::PumpMessages(true);
		} while (ShouldThrottleCPUUsage() && FPlatformTime::Seconds() < (WaitEndTime - 0.005f));
	}
	else
	{
		FPlatformProcess::SleepNoStats( WaitTime - 0.002f );
	}
}

// Give up timeslice for remainder of wait time.
while( FPlatformTime::Seconds() < WaitEndTime )
{
	FPlatformProcess::SleepNoStats( 0 );
}

 

위 코드는 해당 함수의 일부분이므로, 상용게임 수준에 필요한 다른 처리들도 엄청나게 많습니다.

answered (26 point)
수정됨

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

96 질문
186 answers
194 댓글
211 users