Graphics Programming

Managed code와 C# 으로 이주하기 본문

Season 2

Managed code와 C# 으로 이주하기

minseoklee 2023. 1. 3. 01:48

프로그래밍을 플래시 액션스크립트로 처음 배웠으니 내 뿌리는 managed code가 맞지만, C++가 주력 언어가 된 후에는 학교에서 공부할 때도 회사에서 일할 때도 C++만 쓰게 되었다. 액션스크립트만큼은 개인적으로 계속 사용했지만 어도비가 플래시를 버린 이후에는 나도 쓰지 않게 되었다.

예전 기억을 잠시 되살려보면 플래시 런타임의 본질은 JVM을 얇게 감싼 것이고 액션스크립트 초기 문법은 자바스크립트에서 가져온 것이다. 그래서 액션스크립트를 깊게 파다 보니 자연스럽게 자바와 자바스크립트도 배우게 되었다. 액션스크립트의 마지막 버전인 3.0에 와서는 오히려 자바를 닮아갔는데, 그러다보니 클래스 기반 상속과 프로토타입 기반 상속이 공존하는 해괴한 언어가 되었다.

어쨌든 이런 VM 위에서 돌아가는 코드를 직접 만져본 지도, C# 책을 잠깐 거들떠라도 본 것도 10년이 넘은 일이다. 그런데 새로 다닐 직장에서 C#을 쓰기 때문에 C#을 배워야 하는 상황이 되었다. C#을 진지하게 써본 경험이 전무해서 바닥부터 배워야 하는 처지인데, MSDN의 C# 가이드를 pdf로 익스포트해보니 2800쪽 분량이다. 하루에 100쪽씩 읽어도 한 달이 걸리는데 그렇게 부지런히 읽을 것 같지도 않다.

간단한 프로그램을 만들어보며 문법은 그때 그때 찾아보는 걸로 방향을 수정하고, 렌더링 업무 할건데 C#으로도 하나 만들어볼까 생각했지만 효율이 좋지 않아보였다. Rust로 볼륨 렌더링을 구현하다가 이거 그냥 C++로 짜고 말지 하면서 방치한 걸 생각해보면, C# 이어야 할 수 있는 목표가 필요했다. 알고리즘 문제들을 풀어보는 것도 아주 기초적인 문법과 콘솔 입출력 빠르게 하는 것만 알게 될 테니 이것도 아니다.

그러다 소프트웨어 레이트레이싱 프로젝트에 GUI를 붙이면 좋겠다는 생각이 들었고, C++/C# interop도 연습해볼 거리가 될 것 같아서 C#으로 GUI을 붙이는 작업에 착수했다.

레이트레이서의 기존 코드는 모듈 하나에 모든 코드가 엉켜있었다.

  1. 레이트레이싱을 구현하는 로직
  2. 터미널을 통해 렌더링 옵션을 설정하거나 렌더링을 수행하는 Read-Eval-Print 루프 로직

먼저 별도 모듈(raylib)을 만들어 레이트레이싱 구현을 모두 옮기고 dll로 컴파일했다. 원래 모듈(cui-app)에는 터미널 Read-Eval-Print 로직만 남겼다. raylib이 extern "C"를 붙인, C-compatible API를 익스포트해야 C#에서 임포트해서 사용할 수 있으므로, 그에 앞서 cui-app에서도 C-compatible API만 활용하여 raylib을 호출할 수 있도록 리팩토링을 했다.

그 다음은 C# WinForm 프로젝트를 만들어 raylib.dll wrapper 클래스를 만들고 cui-app에서 터미널을 통해 컨트롤하던 것들을 gui를 통해 컨트롤하게 만든다. C#의 기본적인 문법은 자바나 액션스크립트와 크게 다르지 않아서 간단한 GUI 정도는 MSDN을 참고해가며 빠르게 만들 수 있었다. 문제는 C++ 자잘한 문법들을 평소에 숙지하고 다니는 만큼 C# 문법도 익히는 건데, 지금 MSDN 주루룩 읽는다고 외울 수 있는 것도 아니고 실제로 써보며 익숙해져야 할 것 같다.

Comments