당연히 게임 개발관점에서 말씀하셨을거고 그런 관점에서 높은 식견과 경험을 토대로 얻어진 좋은 의견이라고 생각됩니다. 게임기나 모바일 디바이스같은 특수한 상황에서는 메모리 활용을 극단적으로 최적화할 필요가 있겠지요. 그러나 STL이라는 단어만 보고 들어온 사람들이 오해하지 않도록 하기위해서 몇글자 적어봅니다. 우선 STL은 장점이 많은 라이브러리 입니다. 특히 컨테이너, 알고리즘, 반복자를 개념적으로 분리해서 확장가능하도록 만든건 멋진 선택이었다고 봅니다. 그런데 확장 가능하도록 만들다보니 막상 단순한 기능에서는 조금 불편한건 사실입니다. 아마 실수하기 좋게 만들어졌다고 표현하신건 이런 이유인거 같습니다. 그렇지만 STL자체가 C++표준이라 최근에 C++표준이 거듭나면서 이런 불편함이 많이 줄어들었습니다. auto 하나로 list::iterator 를 대체할수도 있구요. foreach같은 언어 이디엄도 추가되어 그리 오해의 여지없이 구현할수 있게 되었습니다. 이제 말씀하신 메모리이야기를 해보죠. 우선 초기 STL패키지들이 구현하면서 메모리를 그렇게 만든건, 아마도 일반적으로 PC나 서버에서 그다지 문제되지 않기 때문일겁니다. 윈도우의 경우에는 힙메모리 할당자가 문제가 있었지만 윈도우 비스타부터 많은 발전이 있었어요. 말씀하신 언리얼 엔진에서도 64비트 버전에서는 자체적으로 만든 메모리 관리자를 쓰지않고 윈도우껄 그대로 사용할 정도니까요. (최신 언리얼에서는 어떻게 되었는지 모르겠네요.) 거기다 STL이 확장성이 좋다보니 필요하면 메모리 할당자만 별도로 구현할 수 있습니다. 예를들어 인텔의 TBB라이브러리에서는 멀티스레드에 최적화된 메모리 할당자를 자체 제공하고 있습니다. 물론 요건 게임에서는 사용하기엔 무리가 있겠지요. 만약 제가 게임엔진을 구현한다면 메모리를 아끼고 아껴쓰는 메모리 할당자만 재작성하지 않을까 싶네요. 그리고 최신 C++에서는 rvalue reference가 들어가면서 STL의 성능이 확실히 좋아졌습니다. rvalue reference를 사용한 STL로 다시 컴파일 하는것 만으로도 서능이 20%정도 좋아진다는 걸 본적이 있어요. 무책임하지만 링크를 못찾겠네요. 상식적으로 생각해도 예전에는 deep copy였던 구현을 소유권이전으로 변경했으니 빨라지겠지요. 만약 최신버전의 STL을 사용할 수 없다고 해도 STL컨테이너에 포인터로 넣으면 파편화나 성능에 영향을 미치는 deep-copy는 일어나지 않을겁니다. 요약해보면.. 게임 개발관점에서 좋은 의견임에는 분명하지만 혹시나 이제막 C++을 시작하시는 분들이 이 동영상을 보고 STL을 사용하면 안되나보다.. 라는 오해는 하지 않아도 될것 같다는 이야기 입니다. 템플릿, 컨테이너, 알고리즘을 이렇게 멋지게 요리한 STL을 메모리 파편화 때문에 안쓰면 너무 아까우니까요. 그리고 최신 C++은 말씀하시는 문제를 많이 해결해 나가고 있습니다. 개인적으로는 STL이 코볼이나 포트란처럼 사라져가던 C++이라는 언어의 생명을 몇배는 연장시켰다고 생각합니다.
게임처럼 극단적으로 메모리 효율이나 성능을 중요시하는 분야라면 STL이 최선의 선택이 아닐수도 있겠습니다. 그래서 게임 프로그래밍을 하려면 STL 사용법만 익히는 것보다는 자료구조/알고리즘 학습을 통해서 STL같은 라이브러리를 스스로 만들 수 있는 능력을 키우는 것으로 학습의 포인터를 맞춰야 겠습니다.^^
C++ 문법 공부를 끝내고 STL을 공부하려고 "STL 소스코드"를 검색했는데 찾기가 힘들더군요. 소스코드를 공개하지 않고 있는것 같습니다. (저는 STL 사용법을 익히는데 만족하지 못해서 소스코드를 보기를 원했는데...) 뭐... 포프님 말씀대로 게임처럼 성능에 신경을 많이 써야하는 코딩의 경우 STL이 최선의 선택이 아니라면 굳이 소스코드에 집착할 필요가 없겠습니다.^^ (걍 자료구조/알고리즘 학습부터 해야 겠습니다. ^^ㅋ)\ C++ 강사님도 그러시더군요. STL 사용법을 익히는것도 좋지만 그보다는 자료구조/알고리즘 학습을 통해서 STL같은 라이브러리를 스스로 만들수 있는 능력을 키워라.
참 C++이 절묘한 것이 레퍼런스라는 개념인데... 포인터를 다른 관점에서 접근하여 레퍼런스라는 개념이 탄생했죠? 아마... 근데 이게 메모리 효율성을 향상시켜 준다는 점... 콜바이레퍼런스(call by reference)를 활용하면 메모리 복사가 발생하지 않아서 메모리 효율이 좋아지는데, 이 경우 실수로 인한 정보의 변경을 막기 위해서 레퍼런스 앞에는 거의 항상 " const" 키워드가 붙는다는 점... 참 C++은 공부하면 할 수록 재밌는 언어인것 같습니다.^^ 이상, 초보의 의견이었습니다.^^
안녕하세요. 현재 대학 다니면서 독학으로 게임 스크립터 준비중인 학생입니다. 우선 매번 좋은 영상 감사합니다! 그리고 질문드리고 싶은 것이 있습니다. 저는 현재 C++, C, Java는 시중 참고 서적을 통해 공부를 진행해서 기초적인 문법은 다룰 수 있는 정도까지 되었습니다만. 현재 공부한 기본기 이후 공부방법을 잘 모르겠습니다. 게임 엔진은 Cocos2d-x, Unity 를 다루어 봤는데 이렇게 기존 상용 엔진을 이용해서 게임을 만드는것 자체는 문제가 없지만 최적화나 메모리 작업, 특히 직접 라이브러리를 만드는 것을 못하니 고민이 이만저만 아닙니다. 단순히 디자인 패턴 및 라이브러리의 이용만이 아닌 자기 만의 라이브러리를 만들어 다른 라이브러리에 적용하는 과정까지 가기 위해선 어떻게 학습해야 하는지 알고 싶습니다! (주변 지인 중에 프로그래머가 없어서 조언 구하기가 힘드네요 ㅠㅜ)
언리얼로 게임프로그래밍을 배우고 있는 학생입니다. 영상에서 말씀하신 vector를 reserve 한다던가 하는 메모리에 관련해서는 모르는데 어디서 부터 시작하는게 좋을까요? Under grad Freshman Sophomore level로 c++ data structure 와 assembly 수업은 들었지만, 아직 pc쪽만 해봐서 그런지 게임 메모리와는 연결을 시키지 못하겠네요.
제가 모르는걸 잘 설명을 못한거 같네요. Variable declare하면 어느 정도의 메모리가 할당되고 reserve를 하면 미리 할당해주는건 아는데 이제 여러 플렛폼으로 변환하는 과정에서 어떻게 메모리 문제가 생길수 있는지는 모릅니다. 아직 서버와 클라이언트 관에 메모리를 자세히 주고 받는것도 모르고요. STL이라는 acronym도 처음들어봤네요 ㅠㅠ 모르는게 너무 많아요
하드웨어를 알아야 한다 라는거 물론 저는 뉴비고 잘모르는쪽이라서 댓글달기 조심스러운데요 예를들면 캐시메모리 같은거 말하는게 아닐까 생각햇어요 최대한 인접하게 메모리가 잇어야지 버스가 한번에 데이터 가져다놓을수잇고 cpu가 빨랑빨랑 일을 처리하니까 이런게 성능에 미치는 영향이 크기때문에 알아야한다 뭐 그런게 아닐까요 고급개발자로 가려면 알아야하는 부분이 맞는거 같아요 아마 이런뜻으로 말씀하신게 아닌지 걍 생각해봣습니다
당연히 게임 개발관점에서 말씀하셨을거고 그런 관점에서 높은 식견과 경험을 토대로 얻어진 좋은 의견이라고 생각됩니다. 게임기나 모바일 디바이스같은 특수한 상황에서는 메모리 활용을 극단적으로 최적화할 필요가 있겠지요.
그러나 STL이라는 단어만 보고 들어온 사람들이 오해하지 않도록 하기위해서 몇글자 적어봅니다.
우선 STL은 장점이 많은 라이브러리 입니다.
특히 컨테이너, 알고리즘, 반복자를 개념적으로 분리해서 확장가능하도록 만든건 멋진 선택이었다고 봅니다.
그런데 확장 가능하도록 만들다보니 막상 단순한 기능에서는 조금 불편한건 사실입니다.
아마 실수하기 좋게 만들어졌다고 표현하신건 이런 이유인거 같습니다.
그렇지만 STL자체가 C++표준이라 최근에 C++표준이 거듭나면서 이런 불편함이 많이 줄어들었습니다.
auto 하나로 list::iterator 를 대체할수도 있구요.
foreach같은 언어 이디엄도 추가되어 그리 오해의 여지없이 구현할수 있게 되었습니다.
이제 말씀하신 메모리이야기를 해보죠.
우선 초기 STL패키지들이 구현하면서 메모리를 그렇게 만든건,
아마도 일반적으로 PC나 서버에서 그다지 문제되지 않기 때문일겁니다.
윈도우의 경우에는 힙메모리 할당자가 문제가 있었지만 윈도우 비스타부터 많은 발전이 있었어요.
말씀하신 언리얼 엔진에서도 64비트 버전에서는 자체적으로 만든 메모리 관리자를 쓰지않고 윈도우껄 그대로 사용할 정도니까요.
(최신 언리얼에서는 어떻게 되었는지 모르겠네요.)
거기다 STL이 확장성이 좋다보니 필요하면 메모리 할당자만 별도로 구현할 수 있습니다.
예를들어 인텔의 TBB라이브러리에서는 멀티스레드에 최적화된 메모리 할당자를 자체 제공하고 있습니다. 물론 요건 게임에서는 사용하기엔 무리가 있겠지요.
만약 제가 게임엔진을 구현한다면 메모리를 아끼고 아껴쓰는 메모리 할당자만 재작성하지 않을까 싶네요.
그리고 최신 C++에서는 rvalue reference가 들어가면서 STL의 성능이 확실히 좋아졌습니다.
rvalue reference를 사용한 STL로 다시 컴파일 하는것 만으로도 서능이 20%정도 좋아진다는 걸 본적이 있어요.
무책임하지만 링크를 못찾겠네요.
상식적으로 생각해도 예전에는 deep copy였던 구현을 소유권이전으로 변경했으니 빨라지겠지요.
만약 최신버전의 STL을 사용할 수 없다고 해도 STL컨테이너에 포인터로 넣으면
파편화나 성능에 영향을 미치는 deep-copy는 일어나지 않을겁니다.
요약해보면..
게임 개발관점에서 좋은 의견임에는 분명하지만 혹시나 이제막 C++을 시작하시는 분들이
이 동영상을 보고 STL을 사용하면 안되나보다.. 라는 오해는 하지 않아도 될것 같다는 이야기 입니다.
템플릿, 컨테이너, 알고리즘을 이렇게 멋지게 요리한 STL을 메모리 파편화 때문에 안쓰면 너무 아까우니까요.
그리고 최신 C++은 말씀하시는 문제를 많이 해결해 나가고 있습니다.
개인적으로는 STL이 코볼이나 포트란처럼 사라져가던 C++이라는 언어의 생명을 몇배는 연장시켰다고 생각합니다.
겜 업계만 C++ 을 많이 쓴다는 소리는 별로 맞지 않는 것 같고, STL 자체나 Modern C++이 생산성 향상에 지대한 기여를 해서 고급언어로 넘어가는 걸 많이 막아준 것은 사실이죠.
rvalue reference란 call by reference를 말하나요? 초보라 잘 모르지만...
@@nslyers4018 음... 초보라 잘 모르지만 제 생각에도 STL같은 편리한 라이브러리가 없으면 C++로 코딩하기 정말 힘들어질것 같군요. 자바나 C#에 밀려서 도태...까지는 아니겠지만 로우레벨 코딩을 하시는 소수의 사람들만 C++을 쓰게 되겠죠.
😀
게임처럼 극단적으로 메모리 효율이나 성능을 중요시하는 분야라면 STL이 최선의 선택이 아닐수도 있겠습니다.
그래서 게임 프로그래밍을 하려면 STL 사용법만 익히는 것보다는 자료구조/알고리즘 학습을 통해서 STL같은 라이브러리를 스스로 만들 수 있는 능력을 키우는 것으로 학습의 포인터를 맞춰야 겠습니다.^^
오 eaSTL이란거랑 언리얼엔진이 오픈소스로 전부 공개되잇다는거 첨알앗어요
감사합니다
좋은 강의 항상 감사합니다~!
"모든 것에는 지불해야하는 것이 있다." 라는 마인드로 코딩 중입니다. 제가 코딩을 편하게 (예: 직접 만들지 않고 라이브러리를 무조건 사용하기) 하는 만큼, 어딘가에서는 손실이 일어나더군요. 지금은 제 자신을 불편하게, 플랫폼을 편하게 라는 마인드로 코딩합니다. ㅎ
네! 명심하겠습니다. 조언 감사합니다. :)
STL이 편하다고만 생각했는데 이런 불편한 진실이...
유행하는 웹패러다임 이라함은 왜인지 rx나 이벤트소싱같은 이벤트처리 내용일 것 같다는 생각이 드는데 머가 됐든 기대하겠습니다.
C++ 문법 공부를 끝내고 STL을 공부하려고 "STL 소스코드"를 검색했는데 찾기가 힘들더군요.
소스코드를 공개하지 않고 있는것 같습니다.
(저는 STL 사용법을 익히는데 만족하지 못해서 소스코드를 보기를 원했는데...)
뭐... 포프님 말씀대로 게임처럼 성능에 신경을 많이 써야하는 코딩의 경우 STL이 최선의 선택이 아니라면 굳이 소스코드에 집착할 필요가 없겠습니다.^^
(걍 자료구조/알고리즘 학습부터 해야 겠습니다. ^^ㅋ)\
C++ 강사님도 그러시더군요.
STL 사용법을 익히는것도 좋지만 그보다는 자료구조/알고리즘 학습을 통해서 STL같은 라이브러리를 스스로 만들수 있는 능력을 키워라.
STL 소스코드는 g++ 하고 clang 은 당연히 공개되어있을 거 같고요. EASTL도 공개되어 있습니다.
튜닝의 끝은 순정이다. 응?
언어 만드는 사람은 나보다 고민 많이했겠지 하고 넘기는 것은 옳지 않습니다.
이런 관점은 항상 시사되어야 한다고 생각합니다.
잘보고있습니다. 좋은정보 감사합니다
예를 들면 시중에 판매되는 도구를 쓰지 않고, 자신이 직접 만들어 쓰는 도구가 효율적일 수 있겠네요.
효율로 본다면 당연히 직접 만드는게 더 효율적이죠
좋은 말씀 감사합니다
참 C++이 절묘한 것이 레퍼런스라는 개념인데... 포인터를 다른 관점에서 접근하여 레퍼런스라는 개념이 탄생했죠? 아마...
근데 이게 메모리 효율성을 향상시켜 준다는 점...
콜바이레퍼런스(call by reference)를 활용하면 메모리 복사가 발생하지 않아서 메모리 효율이 좋아지는데, 이 경우 실수로 인한 정보의 변경을 막기 위해서 레퍼런스 앞에는 거의 항상 " const" 키워드가 붙는다는 점...
참 C++은 공부하면 할 수록 재밌는 언어인것 같습니다.^^
이상, 초보의 의견이었습니다.^^
안녕하세요. 현재 대학 다니면서 독학으로 게임 스크립터 준비중인 학생입니다.
우선 매번 좋은 영상 감사합니다!
그리고 질문드리고 싶은 것이 있습니다.
저는 현재 C++, C, Java는 시중 참고 서적을 통해 공부를 진행해서 기초적인 문법은 다룰 수 있는 정도까지 되었습니다만.
현재 공부한 기본기 이후 공부방법을 잘 모르겠습니다.
게임 엔진은 Cocos2d-x, Unity 를 다루어 봤는데 이렇게 기존 상용 엔진을 이용해서 게임을 만드는것 자체는 문제가 없지만
최적화나 메모리 작업, 특히 직접 라이브러리를 만드는 것을 못하니
고민이 이만저만 아닙니다.
단순히 디자인 패턴 및 라이브러리의 이용만이 아닌 자기 만의 라이브러리를 만들어 다른 라이브러리에 적용하는 과정까지 가기 위해선 어떻게 학습해야 하는지 알고 싶습니다!
(주변 지인 중에 프로그래머가 없어서 조언 구하기가 힘드네요 ㅠㅜ)
myeongsoo kim 네! 프림이랑 크루스칼 정도 까지는 무리 없이 이해 했습니다.
myeongsoo kim 아! 감사합니다. 혹시 추천해 주실만한 서적이 있을까요?
myeongsoo kim 넵넵!! 성실하고 좋은 조언 감사합니다!
선댓글 후감상!
언리얼로 게임프로그래밍을 배우고 있는 학생입니다. 영상에서 말씀하신 vector를 reserve 한다던가 하는 메모리에 관련해서는 모르는데 어디서 부터 시작하는게 좋을까요? Under grad Freshman Sophomore level로 c++ data structure 와 assembly 수업은 들었지만, 아직 pc쪽만 해봐서 그런지 게임 메모리와는 연결을 시키지 못하겠네요.
걍 STL책 아무거나보면 Vector 메모리 할당정책 설명해줘용
BANG!!B// 모를수도 잇지 너무 무안주는거 아닌가요? 모르면 배우면되지
제가 모르는걸 잘 설명을 못한거 같네요. Variable declare하면 어느 정도의 메모리가 할당되고 reserve를 하면 미리 할당해주는건 아는데 이제 여러 플렛폼으로 변환하는 과정에서 어떻게 메모리 문제가 생길수 있는지는 모릅니다. 아직 서버와 클라이언트 관에 메모리를 자세히 주고 받는것도 모르고요. STL이라는 acronym도 처음들어봤네요 ㅠㅠ 모르는게 너무 많아요
하드웨어를 알아야 한다 라는거
물론 저는 뉴비고 잘모르는쪽이라서 댓글달기 조심스러운데요
예를들면 캐시메모리 같은거 말하는게 아닐까 생각햇어요
최대한 인접하게 메모리가 잇어야지 버스가 한번에 데이터 가져다놓을수잇고
cpu가 빨랑빨랑 일을 처리하니까
이런게 성능에 미치는 영향이 크기때문에 알아야한다 뭐 그런게 아닐까요
고급개발자로 가려면 알아야하는 부분이 맞는거 같아요
아마 이런뜻으로 말씀하신게 아닌지 걍 생각해봣습니다
지금보니 마인크래프트 이야기는 본인 경험이었군요 ㅋㅋㅋ
맞는말이 많긴한데. 그냥 지극히 주관적인 생각인듯. 개발자분들이나 개발자 지망생분들은 이말에 너무 휘둘리지 않길 바람.
minecraft는 ms 에서 인수하기 전부터 모바일 앱과 x box버전 모두 존재 했던걸로 기억합니다.
ea stl은 한번 써봐야겠네요. 좋은 정보 감사합니다.
stl이 느리다는건 알고있었는데 아직도 파편화가 존재하는 문제라니... 무섭네요
내가 만든게 아니면 불안한거 같아요.. ㅋㅋ
아무도 못 믿겠음~
문서만듭시다. 본인이 왜 이러케 짰는지좀 써둡시다.
처음부터 끝까지 묻게하지말고
알아서좀 찾아보라고 쳐말하지말고
문 서 쳐 만 듭 시 다