c++/ 언리얼
제가 10월 말부터 유니티 학원을 다니는데 초반은 게임 기획, c++, c#을 하는데 요번주로 문법까지 다맞치고 다음주 부터 유니티를 들어가네요. 일다 요번 기회에 C언어에 대해서 좀 알게 된것 같습니다. c++문법2주 하면서 언리얼하고도 병행 했습니다. 확실히 블루프린트를 먼저하는게 좋은것 같습니다. 블푸는 확실히 구현 속도가 엄청 빠르고 시험/테스트도 빠르며 좋습니다. Blueprint Nativization(블푸를 c++코드로 자동변환) 기능이 지금 쓰는데 저도 잘 써왔거든요 문제없이... 저게 완벽히 되면 사실 잘 모르겠네요 c++로 코드 짤지.
지금 c++로 언리얼 하고 있는걸로는 뭐 별거 없네요. 그냥 하나하나 다 코드로 짜는건데.... 비효율적 인거 같습니다. 딱 하나 좋은거는 코드여서 버젼관리나 비교에 탁월히 좋고 나중에 협엽할때는 필수이곘네요. 물론 언리얼을 더 이해하는데 더 좋은거 같기도 합니다. c++도 실제로 써보고요. 다시 코딩 하면서 느끼는거는 제가 나중에 API나 뭐 제 코드 주석이나 정말 잘 할 자신 있다 입니다... 진짜 어디 맘에드는 도큐먼트가 없네요. 미티어도 좋긴 하지만.... 일단 제가 하면 엄청 잘 할것 같은.... ㄷㄷㄷ (물론 먼저 이해를 해야 설명을 하지만요...)
일단 C++ 얘기를 계속 하자면 요번에 다시 보면서 포인터, 레퍼런스, 클래스나 상속에 대해서 기본기가 좀 잡힌듯 합니다. 실제로 언리얼 하면서 써보니 더 잘 알것 같네요. 물론 잘 아는건 아니고 Effective c++ 나 Effective Modern c++ 같은거 좀 보면 머리 아프긴 하는데 어느정도 이해가 되니 또 신기하네요. Design pattern책들도 많고 정말 볼건 넘쳐나는데....
일단 변수에대하 개념이나 포인터, 레퍼런스 어느정도 감잡아서 좋네요. 일단 함수형 언어의 입장에서 보면 다 위험(?)한 짓입니다. 포인터/레퍼런스를 보자면 값을 복사 하는게 아니라 주소값을 넘겨 주는 거잖아요. 간단하게 함수의 인자로 포인터/레퍼런스를 전달 하는거면 당연히 pure한 함수가 아니고 side effect를 만드는 함수가 되겠죠. 근데 이게 또 c++ 쪽으로 생각하다 보면 당연히 이렇게 해야할것 같습니다... 가장 큰거는 성능이겠죠 아마? 주소만 줘서 처리하면 되는데 값을 다 복사한다니... 매우 비효율적으로 느껴집니다. 일단 built-in type빼고는 pure하게 만들려고 노력하고 다 const 붙여주고 side effect 만들때는 딱 보이게 한다던지... (c#의 out 이나 ref 같이요. 이건 좀 이따가 c# 편에서 다시...) 나중에 클래스 객체를 한다건 하면 메모리 많이 잡아먹고 할텐데 다른 언어는 어떻게 하나 모르겠네요. 내부적으로는 다 포인터 같은거 쓸테지만요.(이것 또한 예전에 생각하던 오브젤트 풀이나 spawn/destroy 같은거의 비용이 되겠네요) 아직 포인터의 포인터 까진 잘 모르겠네요. 왠만해선 레퍼런스로 하고 안될때는 포인터로하고 뭐 대충 이렇게가 가장 괜찮을거 같습니다... 근데 함수형 관점에서는 어쨋든 Pure하지 않게하고 side effect만들고 이 side effect는 결국 state 바꾸는거니까 디버깅을 힘들게 하는거 겠죠...
클래스, 상속, 가상, 순수가상, 다중 등등 클래스, 상속도 대충 개념이 잡혔습니다. 또다시 실제로 언리얼 하면서 써본게 가장 좋았구요.. 수업도 수업 나름 좋았습니다. 책도 좋았고. 일단 가장 머리에 박힌거는 실제 상속을 받은 여러가지 객체들을 관리할떄 부모의 포인터 변수로 만들어서 전체를 관리하고 여기서 가상함수를 써서 각각의 객체에 맞는걸 실행한다가 가장 좋아 보입니다. 가령 부모는 Shape이고 자식들은 사각형, 원, 삼각형, 등등이 있으면 Shape* allShape[5] 로 부모 변수로 만든거에 다 싸잡아 놓고 for (int i = 0 ; i < 5 ; i++) { allShape[i]->Draw() } 요렇게 draw함수를 부르면 삼각형은 삼각형 그리고 원은 원 그리고 사각형은 사각형 그리고 하는듯 추상화를 통해서 하는게 굉장히 좋아 보입니다. 하튼 이걸 보면서 게임 엔진에서 어떻게 할까 되게 새각하게 됬네요. 유니티는 awake, update 같은거나 언리얼의 beginPlay, tick 같은거요. 이런 방식으로 모든 업데이트나, 그려야하는 게임 여러 상속을 받은 객체들을 하나의 배열로 만들어서 각각 필요한거 업데이트 각각 필요한 행동들 취하고 렌더링 하고... 뭐 대충 개념은 잡힌거 같습니다. 아쉬운건 클래스의 왕좌? C++로 상속을 배우긴 했는데 사실 저는
포함관계에 굉장한 관심을 가지고 있는데.... ㄷㄷㄷ composition over inheritance글들이나 제가 실제로 상속 배워보니까 상속에 대한 문제점들이 더 이해가 가는데 포함은 글들이 거의 없네요. 실제 예제위주로된 글들이요. 하튼 나중에 뒤져봐야겠습니다.
뭐 이 외에도 동적할당이나 메모리나 더 이해해서 좋았네요. 아무래도 언리얼로 모바일 VR 하면서 성능에 대해서 많을 생각을했는데 요번기회에 이해하는데 도움이 많이된듯 하네요. 이 외에도 템플릿이나 스마트 포인터, 함수 포인터(콜벡?ㅋㅋ) , 인라인함수 등등 더 많은데 여기 다쓰긴 그렇고 대체적인 이해는 된것 같습니다. STL이나 가면 훨씬 많은데 아직 거기까진 못가서...
언리얼개발떄 C++은 글쎄요.... 그냥 코딩 자체가 어려워서 어려운거 같습니다. 일단 C++ 연습겸 언리얼 연습겸 하긴 할텐데요.... 요즘 재미가 없는것도 사실이네요... 다음은 C#에 대해서...
'~ 공부 ~ > Computer' 카테고리의 다른 글
일몰제170330,(1편) 어디보자.... 유니티 부터 시작 (0) | 2017.03.30 |
---|---|
일몰제161128 - C#, 푸념 (0) | 2016.11.29 |
일몰제161128 - 코드랩(D3), 유니티 로드쇼 (0) | 2016.11.28 |
일몰제3편 - 언리얼(최적화 기법들, 수학) (0) | 2016.10.28 |
일몰제2편 - 언리얼(전반적, VR) (0) | 2016.10.28 |