InputSys

열수철·2025년 1월 19일

게임 입력 시스템(InputSys) 설계

본 글에서는 게임 입력 시스템 설계의 핵심 과제인 프레임 종속성 문제를 집중적으로 분석하고, 이를 극복하기 위한 입력 큐(Queue)시간 기반 입력 처리 기법을 심층적으로 고민해봤습니다. 더불어, 최신 게임 입력 처리 기술 동향을 찾아보았습니다.


1. 프레임 종속적 입력 처리의 한계

시작 단계에서는 프레임 종속적 입력 처리를 사용해보았습니다. 게임 루프의 매 프레임마다 GetAsyncKeyState()와 같은 API를 호출하여 입력 상태를 확인하고 즉시 게임 로직에 반영하는 방식이었습니다.

// 예시: 프레임 종속적 입력 처리 (문제점 내포)
void Game::ProcessInput() {
    if (GetAsyncKeyState(VK_LEFT) & 0x8000) {
        mGameObject.x -= mMovementSpeed; // 고정된 값만큼 이동
    }
    // ...
}

이 방식은 단순하고 직관적이지만, 프레임 속도(FPS)에 따라 입력 처리 빈도가 달라지는 치명적인 문제를 야기합니다. 아래 표는 프레임 속도에 따른 입력 반응성의 차이를 보여줍니다.

FPS1 프레임 당 시간 (ms)입력 확인 주기 (ms)초당 입력 처리 횟수문제점
3033.333.330입력 지연, 반응성 저하, 입력 손실 가능성
6016.716.760기준
1446.96.9144입력 과다, 미세 조정 어려움, 높은 CPU 부하
2404.24.2240입력 과다, 매우 민감한 반응, 불필요한 연산 증가, 간헐적 끊김 가능성

핵심 문제:

  • 입력 지연 및 손실: 낮은 FPS에서는 입력 확인 주기가 길어져, 입력이 무시되거나 지연되는 현상 발생.
  • 과도한 입력 처리: 높은 FPS에서는 입력이 지나치게 자주 처리되어, 의도하지 않은 과격한 움직임이나 미세 조정의 어려움 초래.
  • 일관성 저하: 하드웨어 성능이나 게임 부하에 따라 프레임 속도가 변동하면, 입력 반응성도 함께 변해 일관된 사용자 경험 제공이 어려움.

2. 프레임 독립성 확보를 위한 입력 큐(Queue)

프레임 종속성 문제를 해결하기 위해 고안된 입력 큐는 입력 이벤트를 저장하는 임시 버퍼 역할을 합니다.

작동 방식:
1. 매 프레임마다 플레이어의 키 입력을 감지하여 큐에 저장
2. 게임 로직은 필요 시점에 큐에서 입력을 꺼내 처리

InputManager 클래스 (예시)

class InputManager {
public:
    void EnqueueInput(int key);  // 2. 입력 큐에 키 추가
    int DequeueInput();          // 3. 입력 큐에서 키를 꺼냄

    // ... (IsKeyPressed, IsKeyDown 등은 생략) ...

private:
    std::queue<int> mInputQueue; // 입력 큐
    // ...
};

TetrisBoard 클래스 (예시)

void TetrisBoard::Update(InputManager* im) {
    // ...
    int key = im->DequeueInput(); // 큐에서 입력 이벤트 꺼내기
    if (key != -1) {
        // 꺼낸 입력 이벤트 처리
        if (key == VK_LEFT) {
            mCurrentBlock->MoveLeft();
        } else if (key == VK_RIGHT) {
            mCurrentBlock->MoveRight();
        }
        // ...
    }
    // ...
}

입력 큐 적용의 이점:

장점설명
프레임 독립성입력 수집이 프레임 속도와 분리되어, 안정적인 입력 처리가 가능합니다.
입력 손실 방지낮은 FPS에서도 입력 이벤트가 큐에 보관되므로, 입력 손실을 최소화합니다.
비동기 처리입력 수집과 처리가 분리되어, 게임 로직은 필요한 시점에 입력을 처리할 수 있습니다.
일관된 동작입력 이벤트가 발생 순서대로 처리되므로, 다중 키 입력 상황에서도 일관된 동작을 보장합니다.

3. 정밀도 향상을 위한 시간 기반 입력 처리

입력 큐 도입은 프레임 종속성 문제를 해결하지만, 키를 꾹 누르고 있을 때 연속 입력 처리를 위해서는 더 정교한 기법이 필요합니다. 단순히 일정 프레임마다 입력을 반복하는 방식은 여전히 프레임 속도에 영향을 받을 수 있습니다.

따라서, C++의 std::chrono를 활용한 시간 기반 입력 처리가 더 정교한 해결책으로 부상합니다.

시간 기반 입력 처리를 적용한 InputManager

void InputManager::Update() {
    using clock = std::chrono::steady_clock;
    auto now = clock::now();

    int keysToCheck[] = { VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN };

    for (int key : keysToCheck) {
        if (IsKeyPressed(key)) {
            if (!prevKeyState[key]) { // 처음 눌린 경우
                EnqueueInput(key);
                prevKeyState[key] = true;
                lastKeyEventTime[key] = now;
            } else { // 꾹 누르고 있는 경우
                if (now - lastKeyEventTime[key] >= mContinuousInputInterval) {
                    EnqueueInput(key);
                    lastKeyEventTime[key] = now;
                }
            }
        } else {
            prevKeyState[key] = false;
        }
    }
}

시간 기반 입력 처리의 이점:

장점설명
정확한 입력 간격std::chrono::steady_clock을 사용하여 밀리초(ms) 단위의 정밀한 시간 측정 및 제어가 가능합니다.
프레임 속도 독립성프레임 기반 방식에 비해, 더욱 엄격하게 프레임 속도의 영향을 받지 않습니다.
부드러운 조작감일정하고 예측 가능한 입력 반복을 통해 사용자에게 더 자연스럽고 부드러운 조작감을 제공합니다.

4. 최신 게임 입력 처리 기술 및 동향

최근 게임 개발에서는 더욱 발전된 입력 처리 기법들이 활용되고 있습니다. 몇 가지 주요 기술은 다음과 같습니다:

기술설명
DirectInput / XInputWindows에서 GetAsyncKeyState()보다 로우 레벨의 입력 처리를 제공. 더 정밀한 입력 및 높은 폴링 레이트 지원.
Raw Input마우스 가속이나 OS 설정의 영향을 받지 않는 원시 입력(raw input) 제공. 정밀한 에임 조작에 유용.
입력 버퍼링(Input Buffering)입력 큐와 유사하지만, 더 많은 입력 이벤트를 버퍼링. 격투 게임 등 정밀한 입력 타이밍이 중요한 장르에서 활용.
AI 기반 입력 예측머신러닝을 통해 플레이어의 입력 패턴을 학습, 미래 입력을 예측해 게임 로직에 사전 반영. 네트워크 지연 감소 기대.

5. 게임 장르별 입력 시스템 설계 가이드

게임 장르에 따라 요구되는 입력 시스템은 다릅니다. 각 장르별로 고려해야 할 사항을 살펴봅니다.

장르입력 시스템 고려 사항
액션/격투/FPS높은 정밀도와 빠른 반응성이 핵심. DirectInput, XInput, Raw Input 등 로우 레벨 API 활용, 입력 버퍼링 사용.
RTS/전략 시뮬레이션다수의 유닛 동시 제어가 중요. 입력 큐 기반 다중 선택, 그룹 지정, 예약 명령 기능 효율적 처리.
RPG/어드벤처다양한 입력 방식 지원 중요. UI와의 상호작용, 메뉴 조작 고려.
캐주얼/퍼즐직관적이고 쉬운 조작 중요. 터치 입력, 드래그 앤 드롭 등 플랫폼 특성에 맞는 입력 방식 제공.

6. 결론 및 설계 핵심 요약

본 글에서는 프레임 종속적 입력 처리의 문제점을 분석하고, 입력 큐시간 기반 입력 처리 기법을 통해 이를 극복하는 방법을 심층적으로 살펴보았습니다. 또한 최신 입력 처리 기술 동향과 게임 장르별 고려 사항을 제시하여, 실질적인 게임 개발에 도움이 되고자 했습니다.

InputSys 설계 핵심 요약:

  • 프레임 종속성 회피: 입력 큐 도입을 통해 프레임 속도와 무관한 안정적인 입력 처리 구현.
  • 정밀한 입력 처리: std::chrono를 활용한 시간 기반 입력 처리로 부드럽고 일관된 조작감 제공.
  • 최신 기술 활용: DirectInput, XInput, Raw Input 등 로우 레벨 API를 적극 검토 및 활용.
  • 장르별 최적화: 게임 장르에 따른 요구 사항 반영, 정밀도와 반응성 최적화.
  • 지속적 개선: 테스트와 사용자 피드백을 기반으로 지속적인 튜닝 및 최적화 진행.

설계 가이드 요약표:

단계설명
문제 인식프레임 종속적 입력 처리의 문제점 인지 (입력 지연, 과잉 입력, 일관성 저하)
해결 방안입력 큐 도입을 통한 프레임 독립성 확보
정밀도 향상std::chrono를 활용한 시간 기반 입력 처리
최신 기술 활용DirectInput, XInput, Raw Input 등 로우 레벨 API 활용 검토
장르별 최적화게임 장르에 따른 입력 요구 사항 분석 및 반영 (정밀도, 반응성, 입력 방식 등)
지속적 개선테스트 및 사용자 피드백을 통한 지속적인 튜닝 및 최적화

profile
그래픽스, 수학, 물리, 게임 만세

0개의 댓글