개발 노트 custom containers 2018/12/31 22:48 by cagetu

연말에 남은 휴가를 사용해서, 집에서 정말 아무 생각없이 놀면서 했던 것 중에 하나가 string 및 assert를 포함해서 그 동안 작업했던 custom container 마무리 하는 것이다.


언리얼 엔진의 TArray 가 너무 잘 만들어져 있는 것 같아서, 꽤 많이 참고하였다. Map은 RB Tree로 보통 구현하는 듯 한데, Array<Pair<Key, Value>> 기반으로 이진 트리 lowbound 함수를 이용해서 구현하였다. (성능은 아직 모르겠다.) Set도 유사한 형태로 구현했으며, 이는 oryol과 nebula3의 core 라이브러리를 기반으로 하였다. 

string은 기본적으로 irright 소스를 바탕으로 작업했는데, 실제로 돌려보니 동적할당/해제가 너무 많이 일어난다. 언리얼의 FString도 TArray 기반으로 할당 빈도는 다르지만 string 복사를 자주 하기 때문에, 유사한 모습이지 않을까 생각되었다. 이를 해결하기 위해서, fbstring에서 smallbuffer를 적용했다는 것이 생각났다. (물론, facebook은 string은 단위가 다르다.) 카사 모임에서 찬호님이 nebula3의 string 클래스가 그렇게 되어있으니, 참고하면 좋을 거 같다고 말씀해주셨고, 성능향상에 꽤 많은 이득을 보았다고 했다. 그래서 겸사 겸사 아래와 같은 모습으로 적용하게 되었다. 기본사이즈가 커져버리기 때문에, 어느 정도 기본 버퍼를 잡는 것이 적당한지는 고민이 되지만, 동적할당을 줄이는데 꽤 많은 도움이 되는 것 같다. (nebula3는 기본이 20이다. wchar로 간다면 무시못할 크기이다.)

Core 라이브러리를 잘 만들려면 사실 이것만으로도 끝이 없는 듯 하다. 그래도, 매번 만들어진 것들만 사용하다보니, 한번은 만들어보고 싶었다. 이것을 해보면서, UnrealEngine, Nebula2,3, Oryol, Godot Engine, eastl, dg, blueshiftengine, irright, orge3d, cocos2d 등 정말 다앙한 소스들을 찾아보게 되었고, 구현방식이나 정리한 모습등을 보면서 배운 점이 많았다.

Reflection도 만들어보고 싶고, Core 도 정말 해보고 싶은 것들이 참 많다. 어쩌면 렌더러보다 이걸 더 잘 만들어 져야 하는 것일 수 있는데, 게임을 만들면서 하나 둘씩 추가되면서 완성되어가는 라이브러리 같다.

1주일 동안 오랜만에 좀 편하게 취미 코딩 좋았다. 내년에 회사 생활하면서도 이 기분으로 쭉 진행해보자!! ㅎㅎ

덧글

댓글 입력 영역



메모장

내가 먼 훗날에 이 글들을 보았을 때, 좋은 추억이 될 수 있기를...

나를 위해... 나에게 쓰는...

msn: cagetu@hotmail.com
mail: cagetu79@gmail.com
twitter: twitter.com/cagetu
facebook: facebook.com/cagetu