피드로 돌아가기
GeekNewsInfrastructure
원문 읽기
F#으로 Game Boy 에뮬레이터를 만들었다
F# 타입 시스템 기반 Game Boy 에뮬레이터 구현 및 1000FPS 달성
AI 요약
Context
하드웨어 동작 원리 학습을 목표로 F#을 활용한 Game Boy 에뮬레이터 설계. 단일 스레드 환경에서 CPU, PPU, APU 등 병렬 하드웨어 컴포넌트의 동기화 및 성능 최적화가 핵심 과제로 작용.
Technical Solution
- Discriminated Unions와 Match 문을 활용해 512개 Opcode를 58개 명령으로 추상화한 도메인 모델링 설계
- From/To 타입을 분리 정의하여 즉시값(Immediate)에 쓰기를 시도하는 불법 상태를 컴파일 단계에서 차단
- 단일 스레드 동기화를 위해 Stepper 함수에서 CPU 소요 사이클 기반으로 타이머, 시리얼, PPU를 순차 실행하는 구조 채택
- 픽셀 FIFO 방식 대신 스캔라인 단위 렌더링을 도입하여 구현 복잡도 감소 및 렌더링 속도 향상
- JavaScript의 32비트 비트 연산 의미론 문제를 해결하고 Fable을 통해 약 100KB 규모의 JS 번들로 웹 이식
- Memory.fs 내 VRAM/OAM 배열 참조를 PPU와 공유하여 불필요한 메모리 복사 비용 제거
실천 포인트
1. 복잡한 상태 전이 모델링 시 판별 공용체(Discriminated Unions)를 통해 불법 상태를 원천 차단했는지 검토
2. 성능 병목 지점 파악 시 개별 컴포넌트(APU vs PPU)의 리소스 점유율을 정량적으로 비교 분석
3. 단일 스레드에서 병렬 하드웨어를 모사할 때 기준 클럭(Cycle) 기반의 순차 실행 동기화 메커니즘 적용