C++20 코루틴의 단점 극복, 게임 개발을 위한 200줄 스택리스 코루틴!

by DD
1개월 전
조회수 18

C++20 코루틴은 게임 개발에서 예측 불가능한 힙 할당(Heap Allocations), 직렬화(Serialization) 불가 등의 문제로 인해 적합하지 않음

저자는 스위치 문과 매크로를 활용하여 할당 없는(Allocation-free), 직렬화 가능한(Serializable), 결정적(Deterministic)인 스택리스 코루틴 라이브러리 `sfex::Coroutine`을 제안

제안된 라이브러리는 게임 내 컷신, AI 동작 구현에 용이하며, 코드 가독성(Code Readability)성능(Performance)을 동시에 확보

댓글에서는 C++20 코루틴의 단점을 공감하며, 제안된 라이브러리의 단순성(Simplicity)효율성(Efficiency)에 긍정적인 반응을 보임

C++20 코루틴의 게임 개발 문제점

게시물에서는 C++20 코루틴(Coroutines)이 게임 개발에 적합하지 않은 이유로 예측 불가능한 힙 할당(Heap Allocations), 불투명한 핸들(Opaque Handles), 직렬화(Serialization)의 어려움을 지적한다. 특히, 게임 내 컷신, AI 동작, 대화 시퀀스 등에서 코루틴의 상태를 저장하고 로드해야 하는 경우, C++20 코루틴의 복잡한 내부 구조로 인해 어려움이 발생한다고 설명한다. 또한, HALO(Heap Allocation eLision Optimization)의 비보장성으로 인해 디버그 빌드와 최적화 빌드 간의 성능 차이가 발생할 수 있다는 점도 문제로 제기된다.

sfex::Coroutine: 스택리스 코루틴의 설계

저자는 C++20 코루틴의 단점을 극복하기 위해 스위치 문과 매크로를 활용한 스택리스 코루틴 라이브러리 `sfex::Coroutine`을 제안한다. 이 라이브러리는 할당 없는(Allocation-free) 상태 관리, 직렬화(Serialization) 용이성, 결정적(Deterministic) 제어 흐름을 보장한다. 코루틴의 상태는 단일 정수형 변수로 관리되며, 게임 오브젝트의 데이터와 함께 직렬화될 수 있다. 또한, `SFEX_CO_YIELD` 매크로를 통해 코드를 간결하게 유지하면서도, 상태 머신(State Machine) 기반의 코루틴을 구현할 수 있도록 설계되었다.

sfex::Coroutine의 장점: 직렬화 및 컴포지션

제안된 `sfex::Coroutine`의 가장 큰 장점 중 하나는 직렬화(Serialization)의 용이성이다. 코루틴의 상태를 정수형 변수 하나로 관리함으로써, 게임 저장 및 로드 시 코루틴의 상태를 쉽게 저장하고 복원할 수 있다. 또한, `SFEX_CO_AWAIT` 매크로를 통해 코루틴 간의 컴포지션(Composition)을 지원하여, 복잡한 게임 로직을 간결하게 표현할 수 있다. 이러한 특징은 게임 개발자가 AI 동작(AI Behaviors), 컷신(Cutscenes), 복잡한 상호작용(Complex Interactions)을 구현하는 데 유용하게 활용될 수 있다.

FSM(Finite State Machine)과의 비교 및 트레이드오프

게시물에서는 `sfex::Coroutine`을 FSM(Finite State Machine)과 비교하며, 코루틴이 코드 가독성(Code Readability)유지 보수성(Maintainability) 측면에서 우수함을 강조한다. 특히, 복잡한 상태 변화를 표현하는 경우, FSM은 여러 개의 상태와 전환을 관리해야 하는 반면, 코루틴은 C++의 기존 제어 흐름을 활용하여 코드를 간결하게 유지할 수 있다. 하지만, 매크로 기반의 구현 방식은 디버깅(Debugging)의 어려움제약 사항(Limitations)을 동반하며, 코드 수정(Code Modification) 시 이전 저장 파일과의 호환성 문제를 야기할 수 있다는 점을 지적한다.

stackless coroutines for gamedev in ~200 lines of C++