본문으로 건너뛰기
피드

Unity를 보고 드디어 C++ 코루틴이 왜 필요한지 이해했다

backend 약 4분

C++ 코루틴의 실용적 유스케이스를 Unity의 이펙트 시스템에서 발견. 복잡한 상태 머신을 단순한 함수로 변환하는 것이 코루틴의 핵심 가치이며, Unity 스타일 co_yield 핵으로 100줄 미만의 코루틴 실행기를 C++에서 구현하는 방법을 소개.

  • 1

    C++ 코루틴 6년차인데 프로덕션에서 본 사람이 거의 없음

  • 2

    Unity의 이펙트 코루틴이 실용적 유스케이스의 좋은 예시

  • 3

    co_await는 어렵지만 co_yield로 '다음 프레임까지 양보' 패턴은 쉽게 구현 가능

  • 4

    전체 코루틴 실행기가 100줄 미만, 사이드 이펙트 제거 시 병렬화도 가능

"드디어 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 핵"이 가장 현실적인 진입점임.

코루틴의 가치를 이론이 아니라 실무 관점에서 설명하는 좋은 글. co_await의 복잡함을 피하면서 co_yield로 바로 생산성을 얻는 접근이 현실적.

댓글

댓글

댓글을 불러오는 중...

backend

Cloudflare가 잡아낸 QUIC CUBIC 버그, ‘idle’ 한 줄 오판이 다운로드를 죽였다

Cloudflare의 QUIC 구현체 quiche에서 CUBIC 혼잡 제어가 최소 윈도우에 갇혀 회복하지 못하는 버그가 발견됐다. Linux 커널의 idle 최적화를 QUIC에 옮기는 과정에서 TCP와 QUIC의 이벤트 타이밍 차이를 놓쳤고, 결국 ACK 시점을 기준으로 idle 시간을 재도록 고쳐 100% 테스트 통과를 회복했다.

backend

삼성전자가 반도체 개발 조직에 오라클 자바를 공식 채택한 이유

삼성전자 DS 부문이 글로벌 반도체 개발 환경에 오라클 자바 SE 유니버설 서브스크립션을 공식 채택했다. 서로 다른 자바 배포판과 버전이 섞이면서 생길 수 있는 보안, 컴플라이언스, 라이선스 리스크를 줄이고 개발 환경을 표준화하려는 결정이다.

backend

네이버클라우드, 트래픽 따라 알아서 줄고 느는 서버리스 데이터베이스 출시

네이버클라우드가 사용량에 따라 CPU, 메모리, 스토리지를 자동 조절하는 완전관리형 서버리스 데이터베이스 서비스를 내놨다. 기존 가상머신 기반 관리형 데이터베이스처럼 피크 트래픽에 맞춰 서버를 과하게 잡아두는 방식에서 벗어나, 사용량 기반 과금과 오토스케일링으로 비용 낭비를 줄이겠다는 방향이다.

backend

네이버클라우드, 사용량 따라 늘고 줄어드는 서버리스 데이터베이스 출시

네이버클라우드가 완전관리형 서버리스 데이터베이스 서비스인 Cloud DB Serverless를 출시했다. VM 기반 관리형 데이터베이스의 고정 비용과 과잉 프로비저닝 문제를 줄이고, 트래픽에 따라 CPU·메모리·스토리지를 자동 조절하는 구조를 내세운다.

backend

네이버클라우드, 사용량 따라 자동 확장되는 서버리스 데이터베이스 출시

네이버클라우드가 사용량에 따라 컴퓨팅 자원을 자동 조절하는 서버리스 기반 클라우드 데이터베이스를 출시했음. 기존 가상머신 기반 관리형 데이터베이스의 고정 비용과 운영 부담을 줄이고, 국내 데이터 규제 요구까지 맞추겠다는 전략임.