0
Unity를 보고 드디어 C++ 코루틴이 왜 필요한지 이해했다
backend
요약
기사 전체 정리
"드디어 C++ 코루틴이 왜 필요한지 알겠다"
- C++ 코루틴이 나온 지 6년인데, 프로덕션 코드에서 본 적이 있는 사람이 거의 없음. 이유가 두 가지: 저수준 보일러플레이트가 너무 많고, 피보나치 제너레이터 말고는 쓸만한 예제가 없었기 때문
- 글쓴이가 Unity의 C# 코루틴을 보고 드디어 감이 옴. Unity에서는 코루틴으로 **이펙트나 일시적 동작(ephemeral behaviour)**을 구현하는데, 이게 진짜 실용적인 유스케이스임
코루틴이 빛나는 순간
- 간단한 페이드아웃이야 람다로도 되지만, 여러 단계의 순차적 동작이 필요하면 얘기가 달라짐. 예: TimeWarp 이펙트처럼 이동 → 대기 → 이동 → 대기를 반복하는 경우
- 이걸 코루틴 없이 C++로 짜면 수동 상태 머신이 됨. 상태 변수, 분기, 전환 로직... 코드 리뷰에서 통과시키고 싶지 않은 수준의 코드가 나옴
- 코루틴을 쓰면? 상태 머신이 그냥 평범한 함수로 변환됨. "읽기 어려운 상태 머신을 매우 단순한 함수로 바꾸는 것", 이게 코루틴의 핵심 가치라는 거
Unity 스타일 핵으로 C++에서 구현하기
co_yield는 C++23의<generator>로 비교적 쉬운데,co_await가 어려움. 뭘 기다리는지, 누가 깨워주는지, 어떤 실행 큐를 쓰는지... 답이 정해져 있지 않은 질문이 너무 많음- 글쓴이의 해결책: Unity가 10여 년 전에 쓴 것과 같은 핵을 씀.
co_yield로 "다음 프레임까지 양보"를 표현하는 거. 의미론적으로는 맞지 않지만, 실용적으로는 완벽하게 동작함 - 전체 코루틴 실행기 구현이 100줄도 안 됨.
effects.add(TimeWarp(object))로 이펙트를 추가하고, 메인 루프에서effects.run()호출하면 끝
보너스: 사이드 이펙트 제거 → 병렬화
- 한 발 더 나가면,
co_yield로 렌더링 객체를 반환하게 만들어서 사이드 이펙트를 없앨 수 있음 - 사이드 이펙트가 없으니 루프를 병렬로 돌릴 수도 있음. 게임 이펙트 시스템이 100줄 미만의 코드로 완성되는 거
참고
> C++26에서 execution이 표준화되면 co_await를 제대로 쓸 수 있겠지만, 대부분의 프로젝트는 이미 자체 스케줄러와 스레드 풀이 있어서 통합이 쉽지 않을 전망. 당장 코루틴의 가치를 체감하고 싶다면 이 "Unity 핵"이 가장 현실적인 진입점임.
댓글
댓글
댓글을 불러오는 중...