인프런 커뮤니티 질문&답변
Window API 강의 수강 중 LARGE_INTEGER 타입 변환 오류
해결된 질문
작성
·
197
0
안녕하세요!
10주차의 Window API 강의를 듣던 중 TimeManager.cpp에서 QueryPerformanceFrequency와 QueryPerformanceCounter메서드에 LARGE_INTEGER 타입으로 변환해서 인자를 넘겨주는 과정에서 오류가 있었는데 해결 과정을 문의하고 싶습니다.


Types.h에 문제가 있을까 싶어서 찾아봤지만, 별다른 이상이 없어서 원인을 모르겠습니다.

퀴즈
게임 개발에서 메시지 루프를 구현할 때, 일반적인 Windows 애플리케이션과 달리 `GetMessage` 대신 `PeekMessage`를 사용하는 주된 이유는 무엇일까요?
메시지를 더 빠르게 처리할 수 있기 때문
처리할 메시지가 없더라도 게임 로직을 계속 업데이트해야 하기 때문
특정 종류의 메시지만을 선택적으로 수신하기 위함
메시지 큐에 메시지가 쌓이는 것을 방지하기 위함
답변 3
0
0
#include "pch.h"
#include "TimeManager.h"
void TimeManager::Init()
{
LARGE_INTEGER frequency;
LARGE_INTEGER prevCount;
::QueryPerformanceFrequency(&frequency);
::QueryPerformanceCounter(&prevCount); // CPU 클럭
frequency = staticcast<uint64>(frequency.QuadPart); // QuadPart 사용
prevCount = staticcast<uint64>(prevCount.QuadPart);
//::QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER>(&_frequency));
//::QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER>(&_prevCount)); // CPU 클럭
}
void TimeManager::Update()
{
LARGE_INTEGER currentCount;
::QueryPerformanceCounter(¤tCount);
deltaTime = (staticcast<float>(currentCount.QuadPart - prevCount)) / frequency;
prevCount = staticcast<uint64>(currentCount.QuadPart);
_frameCount++;
frameTime += deltaTime;
if (_frameTime >= 1.f)
{
fps = staticcast<uint32>(_frameCount / _frameTime);
_frameTime = 0.f;
_frameCount = 0;
}
}
챗지피티가 알려준대로 위의 방식으로 고쳐서 실행했더니 오류없이 잘 작동되는데
위 코드를 그대로 사용해도 될까요?
0
안녕하세요, 인프런 AI 인턴입니다. 꿈꾸는 프로그래머님에게 도움을 드리고자 합니다.
LARGE_INTEGER와 관련된 오류는 때때로 예상치 못한 타입 변환 문제로 발생할 수 있습니다. 주로 겪는 문제 중 하나는 LARGE_INTEGER 타입에 대한 잘못된 변환이거나, 헤더 파일이 올바르게 포함되지 않았기 때문일 수 있습니다.
LARGE_INTEGER 타입 확인: LARGE_INTEGER는 Windows API에서 제공하는 구조체 타입이며, 정교한 성능 타이밍을 위한 큰 정수값을 사용합니다. 만약 uint64와 같은 사용자 정의 타입을 사용하고 있다면, 직접적인 캐스팅을 피하고, 다른 방식을 사용해야 할 수 있습니다.
타입 변환 오류: 오류 메시지에
reinterpret_cast오류가 나타난다면, LARGE_INTEGER를 uint64 또는 vice versa로 직접 캐스팅하고자 했기 때문일 가능성이 높습니다. 이는 잘못된 접근입니다. 일반적으로 QueryPerformanceFrequency나 QueryPerformanceCounter 함수 호출 시, 다음과 같은 방식을 사용할 수 있습니다:
LARGE_INTEGER frequency;
if (!QueryPerformanceFrequency(&frequency)) {
// Handle error
}
LARGE_INTEGER currentCount;
if (!QueryPerformanceCounter(¤tCount)) {
// Handle error
}
- 헤더 파일 확인:
windows.h를 포함하는지 꼭 확인해 주세요. 이 헤더는 LARGE_INTEGER와 관련된 함수를 정의합니다.
아래의 기존 유사 질문 링크를 참조하시면서 확인해 보세요:
- 프레임 - 프레임 관리와 관련한 질문입니다. 여기서는 프레임 횟수와 연관된 관리에 대해 설명하고 있습니다.
추가적인 질문이 있거나 구체적인 코드 예제가 필요하시다면, 더 자세히 문의해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






네 포인터 없이 LARGE_INTEGER 입니다!