그동안 다양한 단말기에 Doom을 포팅해봤지만, 안드로이드 단말기에는 해본 적이 없었다.
그래서 이번에는 안드로이드 포팅 프로젝트를 새로 시작하기로 했다.
먼저 이미 누군가 작업한 레포가 있는지 찾아봤다. 실행 가능한 기준으로 찾은 저장소는 다음 두 개였다:
1. dports/GZDA2: GZDooM Android 2
2. deqart/Doom-Android: Doom (1993) ported to android
문제는 이 두 프로젝트 모두 업데이트가 오래전에 멈췄다는 것이다. 게다가 안드로이드 스튜디오는 구버전과의 호환성이
썩 좋지 않아 마이그레이션이 생각보다 귀찮다. GZDA2는 성능도 빠르고 기능도 좋지만, 포팅 에러가 자주 발생했다.
두 번째 프로젝트는 prboom 기반인데, 신기하게도 Java나 Kotlin 코드 없이 오직 C 코드만으로 동작한다.
안드로이드 앱인데 말이다?
그래서 두 번째 프로젝트를 분석하면서, 현재 터치만 되는 입력 방식을 키보드나 마우스로 확장하고,
음악도 나오게 하는 작업을 진행해볼 예정이다. 내 저장소로 fork도 해두었고, 앞으로 간간이 작업하며 커밋을 남길 계획이다.
Song-G-Hun/Doom-Android: Doom (1993) ported to android
분석 1: 실행 흐름
앞서 말했듯 이 프로젝트는 C 코드로만 구성되어 있어 최초 실행 지점을 먼저 살펴봤다.

가장 먼저 호출되는 함수는 ANativeActivity_onCreate다.

이 함수에서는 기본적인 콜백 함수들을 설정하며, 안드로이드 NativeActivity 구조에서 자주 보던 함수들이 등장한다.
그 다음으로 android_app_entry 함수가 스레드로 실행된다. 이 함수 내부에서 android_main 함수를 호출하게 되는데,
이 android_main은 사실상 prboom의 메인 함수이며, 종료될 때까지 메인 루프를 계속 돈다.


분석 2: 입력 이벤트 처리
메인 루프를 보기 전에, 터치나 입력 이벤트가 어디서 발생하는지 궁금했다.
android_app_entry 함수를 보면 명령(command) 및 입력(input) 이벤트를 처리하기 위한 소스 구조체들이 초기화된다. 예를 들어:
- process_cmd() → APP_CMD_RESUME, APP_CMD_PAUSE, APP_CMD_INIT_WINDOW 등 앱 상태 명령 처리
- process_input() → 터치, 키보드 등 입력 이벤트 처리
이 중 process_input 콜백 함수가 실제 입력 관련 처리를 담당한다.
로그를 확인해 보면 터치 이벤트가 발생할 때 다음과 같은 메시지가 출력된다:

process_input() 함수는 다음과 같은 구조를 가진다:
static void process_input(struct android_app* app, struct android_poll_source* source) {
AInputEvent* event = NULL;
while (AInputQueue_getEvent(app->inputQueue, &event) >= 0) {
LOGV("New input event: type=%d", AInputEvent_getType(event));
if (AInputQueue_preDispatchEvent(app->inputQueue, event)) {
continue;
}
int32_t handled = 0;
if (app->onInputEvent != NULL) handled = app->onInputEvent(app, event);
AInputQueue_finishEvent(app->inputQueue, event, handled);
}
}
이 함수의 흐름은 다음과 같다:
- 입력 이벤트를 가져온다.
- 시스템에서 먼저 처리해야 하는 이벤트인지 확인한다 (preDispatchEvent).
- 앱에 등록된 onInputEvent 핸들러가 있다면 해당 이벤트를 넘긴다.
- 이벤트가 처리되었는지 여부를 시스템에 알린다.
이때 onInputEvent는 android_main 함수에서 handle_input 함수로 연결되어 있다.
handle_input() 함수는 안드로이드 터치 이벤트(MOTION_EVENT)를 처리하는 사용자 정의 핸들러이다.
최대 8개의 멀티터치 포인터를 관리하며, 각 포인터의 상태(좌표 및 눌림 여부)를 추적한다.
이후 이 코드를 분석하면 각 터치가 어떻게 버튼 입력으로 연결되는지, 터치 외의 입력(키보드/마우스)을 추가로 어떻게 처리할 수 있을지 알수 있을 것 같다.
'개발이야기' 카테고리의 다른 글
LinuxQt + tslib 터치 보정 적용기: libinput 충돌을 뚫고 제대로 적용하기 (0) | 2025.05.18 |
---|---|
Qt4에서 Qt5포팅시 팁 (0) | 2024.12.01 |
U-Boot env 이미지 만들기(mkenvimage) (0) | 2024.11.28 |
IAR embedded workbench와 가격, Crack 이야기 (1) | 2024.11.16 |
센서 데이터 평균과 중앙값 (0) | 2024.11.05 |