여기까지의 작업내용: https://github.com/hwi-middle/HimchanSoftwareRenderer/tree/edb995170a50bb1f7e3d466fae34a2722dcd5b4d
고해상도 타이머
성능 측정(fps)과 DeltaTime 구현을 위해서 C/C++ 표준 라이브러리를 이용해야하나 싶었는데, CK 렌더러를 살펴보니 힌트를 얻을 수 있었다. 바로 Windows에서 고해상도 타이머를 제공하는 것이었다.
아래 두 함수를 이용하여 고해상도 타이머를 이용한 성능측정을 구현할 수 있다.
- QueryPerformanceFrequency: 고해상도 타이머의 주파수를 반환한다.
- QueryPerformanceCounter: 고해상도 타이머의 현재 값을 가져온다.
Frequency는 1초에 몇 번 Tick이 발생하는지에 대한 값이고 Counter는 현재까지 쌓인 Tick 수를 가져올 것이다. QueryPerformanceCounter로 현재 시간에서 가장 최근에 저장했던 시간을 빼주고(시간 계산), QueryPerformanceFrequency로 가져온 값을 나눠주면(초 단위로 변환) DeltaTime이 구현된다.
이 DeltaTime으로 1을 나눠주면 현재 fps 값을 계산할 수 있다.
Application::Application(uint32 InWidth, uint32 InHeight, WinRenderer* InRenderer) : Renderer(InRenderer), Width(InWidth), Height(InHeight)
{
Renderer->Initialize(Width, Height);
QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&PrevTime);
}
//...
void Application::PostUpdate()
{
GetRenderer().SwapBuffer();
QueryPerformanceCounter(&CurrentTime);
DeltaTime = static_cast<float>(CurrentTime.QuadPart - PrevTime.QuadPart) / Frequency.QuadPart;
PrevTime = CurrentTime;
Fps = 1.0f / DeltaTime;
}
코드로 구현하면 이렇다. 매우 간단하다!
// ...
TCHAR g_title[256];
// ...
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
// ...
while (true)
{
// ...
appliction.Tick();
_stprintf_s(g_title, _T("Himchan Software Renderer (%.2f fps)"), appliction.GetFps());
SetWindowText(hWnd, g_title);
}
// ...
}
그리고 창의 제목 바에 fps를 표시해보자.
그리하여, 구현된 내용.
API에서 제공된 기능이 사용하기에 너무 간편해서 날로 먹는 기분이랄까?
어쨌든 이 부분도 구현했으니, 이제 최적화에 들어가보자.
'개발일지 > 소프트 렌더러' 카테고리의 다른 글
소프트웨어 렌더러 만들기 - 12 (삼각형 그리기 + 버그 수정) (0) | 2024.07.19 |
---|---|
소프트웨어 렌더러 만들기 - 11 (메모리 누수 해결 및 성능 최적화) (1) | 2024.07.17 |
소프트웨어 렌더러 만들기 - 9 (Resize 대응) (0) | 2024.07.17 |
소프트웨어 렌더러 만들기 - 8 (렌더러 구조 및 더블 버퍼링) (0) | 2024.07.14 |
소프트웨어 렌더러 만들기 - 7 (직선 그리기) (0) | 2024.02.25 |