[0618구경원]초보 게임프로그래머를 위한 c++

4,009 views
3,553 views

Published on

Published in: Health & Medicine
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,009
On SlideShare
0
From Embeds
0
Number of Embeds
160
Actions
Shares
0
Downloads
33
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

[0618구경원]초보 게임프로그래머를 위한 c++

  1. 1. 초보 게임프로그래머를 위한 C++<br />돼지고기(구경원)<br />데브루키6.18<br />
  2. 2. 개요<br />
  3. 3. 참조<br />
  4. 4. 참조<br /><ul><li>개체를 의미하는 하나의 다른 이름이다.
  5. 5. 참조에 수행되는 작업은 원본 개체에 직접 영향을 준다.</li></ul>int A = 10;<br />int& B = A; //B는 A의 참조다<br />B = 300; //A와 B는 모두 300이다.<br />
  6. 6. 참조와 포인터<br /><ul><li>포인터를 통한 접근은 -> 를 이용한다.</li></ul>참조를 통한 접근은 . 을 이용한다.<br /><ul><li>포인터는 만들고 나중에 초기화 할 수 있다.</li></ul>참조는 선언된 직후 반드시 초기화 해야한다.<br /><ul><li>포인터는 원하는 시점에 다른 개체를 가리키도록 할 수 있다.</li></ul>참조는 처음 한번만 초기화 될 수 있다.<br /><ul><li>포인터는 NULL이 될 수 있다.</li></ul>참조는 NUU이 될 수 없다.<br />
  7. 7. 참조 이용의 이점<br /><ul><li>포인터 보다 보기가 편하다.</li></ul>int A = *(Entity->GetCount());<br />int A = Entity.GetCount();<br /><ul><li>NULL을 가르키는 일이 없다.</li></ul>참조는 선언과 동시에 초기화가 되여지기 때문에 포인터보다 잘못된 값을 가져올 확률이 낮다.<br />
  8. 8. 참조 이용의 시기<br /><ul><li>함수 내에서 수정되지 않는 개체</li></ul>const 참조를 이용한 전달<br /><ul><li>함수 내에서 수정되어야 하는 개체</li></ul>포인터를 이용한 전달<br />
  9. 9. 초기화리스트<br />
  10. 10. 대입과 초기화<br />A::A(const<br /> string& _STR)<br />{<br /> AA = 0;<br /> STR = _STR;<br />}<br />class A<br />{<br />int AA;<br /> string STR;<br /> A();<br /> ~A();<br />};<br />초기화 된것이 아니라 대입 되어짐.<br />복사 대입 연사자 호출.<br />
  11. 11. 대입과 초기화<br />A::A(const<br /> string& _STR)<br />: AA(0)<br />, STR(_STR)<br />{<br />}<br />class A<br />{<br />int AA;<br /> string STR;<br /> A();<br /> ~A();<br />};<br />초기화 리스트를 사용한 초기화.<br />복사 생성자 호출.<br />
  12. 12. 사용 시기<br /><ul><li>상수 맴버 변수 </li></ul>const 상수변수는 선언과 동시에 초기화가 이루어 져야 한다.<br /><ul><li>래퍼런스맴버 변수</li></ul>레퍼런스는 선언과 동시에 가르키는 대상이 있어야 한다.<br /><ul><li>포함된 개체</li></ul>포함된 개체의 생성자를 호출과 동시에 초기화 시켜주어야 할때.<br />
  13. 13. 인라인<br />
  14. 14. 인라인 함수<br /><ul><li>인라인 함수</li></ul>변수에 직접 접근하는 것과 같은 효과를 제공 한다.<br />함수 호출을 제거하고 함수 코드를 추가하는 일은 컴파일러가 수행.<br />함수 호출과 관련된 성능 저하 문제가 완벽히 해결된다.<br />
  15. 15. 주의점<br /><ul><li>주의사항</li></ul>인라인 될 함수는 헤더파일 내에 정의되어야 한다.<br />인라인 함수로 정의했다고 해서 100% 인라인이 된다는 보장이 없다. (컴파일러가 결정)<br /><ul><li>많은 인라인 함수 사용.</li></ul>컴파일 시간의 증가.<br />소스파일의 크기가 증가.<br />프로그램 수행 속도의 저하.<br />
  16. 16. 사용시기<br /><ul><li>사용은 언제?</li></ul>초기 개발 단계에서는 인라인 함수의 사용을 피하자.<br />어느 정도의 개발이 진척이 있으면 자주 호출되는 몇줄안되는 함수에 대해서 인라인화 시킨다.<br />
  17. 17. TIP<br />무분별한 인라인 함수의 사용은 오히려 독.<br />컴파일러가 계속해서 인라인 적용을 거부하<br />는 경우도 있다. 그러므로 필요에 따라서 인<br />라인 함수와 비슷한 매크로 함수를 사용하자.<br />
  18. 18. Define토큰<br />
  19. 19. #define 토큰<br />C/C++ 에선 #define 의 사용의 빈도를 자<br />제하도록 권고하고 있지만, 잘 사용할 경우 <br />많은 코드상의 이득을 볼 수 있다.<br />
  20. 20. #define 토큰종류<br />- ‘##’ <br />분리되어 있는 2개의 토큰을 하나로 합쳐준다.<br /><ul><li>‘#’</li></ul>매크로 인자를 문자열로 만들어 준다.<br />
  21. 21. ##<br />#define AA(n) <br />printf(“Game= %d”, Game##n)<br />int Game9 = 1004;<br />AA(9)<br />Game = 1004;<br />
  22. 22. #<br />#define Game(x) <br />printf(#x “n”)<br />Game(WorldOfWarcraftn);<br />Printf(“WorldOfWarcraftnn”);<br />
  23. 23. 캐시메모리<br />
  24. 24. <ul><li>CPU속도</li></ul>하루가 다르게 발전하고 있다.<br /><ul><li>메모리 속도</li></ul>CPU의 속도발전에 비해 상대적으로 발전이 느리다.<br />이러한 격차의 조율문제는 개발자의 몫!<br />
  25. 25. <ul><li>CPU가 메모리의 느린 속도에 영향을 받지 않고 항상 최대의 성응으로 작동할 수 있을까?</li></ul>메모리 캐시 활용<br />
  26. 26. 캐시메모리<br /><ul><li>메모리 캐시</li></ul>자주 이용되는 데이터와 코드를 임시로 저장하는데 이용되는 작지만 매우 빠른 메모리 이다.<br />모든 데이터를 메모리 캐시에 보관 할 수 없다.<br />- 좋은 상황<br />CPU가 필요로 하는 데이터가 캐시내에 보관되어 있는 상태.<br /><ul><li>나쁜 상황</li></ul>캐시내에 데이터가 없어서 캐시미스 발생하며 메인 메모리가 준비될 때 까지 실행을 멈추고 기다리는 상태.<br />
  27. 27. 캐시라인<br /><ul><li>가장 작은 단위</li></ul>독립적으로 들어오고 나갈 수 있는 가장 작은 메모리 단위.<br />대부분의 PC에서 32바이트 크기이다. (최대 128바이트)<br />데이터의 크기를 32바이트의 배수로 만들어 사용하면 효율적.<br />
  28. 28. 맴버 변수의 위치<br /><ul><li>변수의 위치</li></ul>자주 이용되는 클래스 맴버 변수의 선언위치를 위쪽으로 옮기는 것만으로도 성능상의 이익을 얻을 수 있다.<br />가상함수 vatable를 가진다.<br />Vatable 는 객체의 시작부분에 위치하는 하나의 포인터이다.<br />즉 개체의 처음 32바이트를 캐시에 올리는 효과를 가진다.<br />
  29. 29. TIP<br />메모리 내의 맴버 변수 순서?<br />클래스 선언에서 정의된 순서와 일치.<br />
  30. 30. 플러그인<br />
  31. 31. 플러그인의 필요성<br />확장의 연속<br />확장<br />확장<br />확장<br />도구<br />확장<br />확장<br />확장<br />확장<br />
  32. 32. 플러그인의 로딩<br />- 런타임시 로딩<br />프로그램의 일부가 되어서는 안 된다.<br />- Win32<br />가장 쉬운 Win32 함수를 이용한 DLL 로딩.<br />
  33. 33. 사용 방법<br />- extern “C”<br />컴파일러로 하여금 함수의 이름을 일반적인 C++ 방식으로 만들지 말고 C함수와 같이 꾸미지 않은 상태로 유지하도록 하는 기능이 있다.<br />- _declspec(dllexport)<br />실행파일의 익스포트테이블에 함수를 넣어준다.<br />
  34. 34. 사용 방법<br />- 플러그인 로딩<br />HMODULE hDLL= ::LoadLibrary(“파일이름”);<br />- 함수 사용<br />GetProcAddress(hDLL, “함수이름”);<br /><ul><li>플러그인 삭제</li></ul>FreeLibrary(“핸들명” );<br />
  35. 35. 단점<br />- 플러그인 간의 의존성에 문제점이 있다.<br /><ul><li>버전에 따른 플러그인 사이의 충돌이 발생할 수도 있다.</li></li></ul><li>STL<br />
  36. 36. Find<br />시퀀스 내의 모든 항목 사이를 반복하면서 <br />원하는 항목을 찾는 알고리즘.<br />Find(Name.begin(), Name.end(), WantName)<br />
  37. 37. TIP<br />시퀀스 내의 요소들이 정렬되어 있지 않거나<br />요소들 사이의 규칙성이 없는 상황에서만 알<br />고리즘을 사용하는 것이 좋다.<br />
  38. 38. For_each<br />시퀀스 내의 각 요소에 대하여 특정한 함수를 실행<br />하는 알고리즘.<br />for(itr = Entity.begin(); it != Entity.end(); ++itr)<br /> (*itr).Update();<br />For_each(Entity.begin(), Entity.end(), Update);<br />For_each(Entity.begin(), Entity.end(), mem_fun_ref(::Update));<br />
  39. 39. <ul><li>For</li></ul>많은 사람들이 쉽게 이해 할 수 있는 구조를 가지고 있다.<br /><ul><li>For_each</li></ul>코드가 간결해지고 오류가 생길 여지가 적다.<br />다른 반복문에 비해서 반복루프시 속도가 빠르다.<br />
  40. 40. TIP<br />우선 순회를 시작하면 멈출 수가 없다.<br />그러므로 컨테이너 전체를 순회해야 하는 상<br />황에서만 사용하자.<br />
  41. 41. Count<br />특정한 조건에 맞는 요소만을 세는 기능이 <br />있는 알고리즘.<br />intnCount = count(<br />Entity.begin(), Entity.end(), 0);<br />intnCount = count_if(<br />Entity.begin(), Entity.end(), EntityCheck()); <br />
  42. 42. TIP<br />편리한 기능을 제공하는 알고리즘 이기는 이<br />지만 많은 요소에 대한 검사는 성능상의 문<br />제를 가져올 수도 있다.<br />
  43. 43. Include가드<br />
  44. 44. #include<br />전처리기에 의해 처리된다.<br />//Game.h<br />#define MAX_PLAYER 10<br />//Game.cpp<br />#include “Game.h”<br />stPlayer player[MAX_PLAYER ];<br />#define MAX_PLAYER 10<br />stPlayer player[MAX_PLAYER ];<br />
  45. 45. //GameState.h<br />#include “Game.h”<br />//Game.cpp<br />#include “Game.h”<br />#include “GameState.h”<br />Player player[MAX_PLAYER];<br />쉽게 범할 수 있는 오류.<br />
  46. 46. #include 가드<br />동일한 컴파일 단위에 같은 파일이 두 번 이<br />상 포함되는 것을 막아준다.<br />//Game.h<br />#ifndef GAME_H_<br />#define GAME_H_<br />//소스부분<br />#endif<br />
  47. 47. #include 가드<br />동일한 파일을 두 번 이상 포함되는 것을 막<br />아주면서 파일을 두 번 이상 여는것도 막아<br />준다.<br />
  48. 48. - #pragma once<br />컴파일 속도가 앞의 가드보다 빠르다.<br />C++ 표준에 포함되여 있지 않다.<br />지원해주지 않는 컴파일러도 있다.<br />
  49. 49. 스마트포인터<br />
  50. 50. 스마트포인터<br />C++ 전문가들이 만든 차세대 메모리 관리자.<br />boost 라이브러리에 포함되여 있다.<br />std::auto_ptr//c++표준<br />boost::shared_ptr//앞으로 표준<br />
  51. 51. 메모리누수<br />Void main()<br />{<br /> Game* pp = new Game;<br /> //수많은 예외발생<br /> //예> return; 존재.<br /> delete pp; <br />}<br />프로젝트가 커질수록 수많은 예상외의 상황<br />이 발생하고, 그로 인해 메모리 누수가 발생할 <br />수 밖에 없다.<br />
  52. 52. auto_ptr<br />#include <memory> 헤더안에포함되여 있는 스마트 포인터이다.<br /> std::auto_ptr<Game> p(new Game); <br />자기 객체가 사라질때소멸자에서 자동으로 delete를 적용<br />시켜준다.<br />하지만 생성된 객체의 소유권은 오직 하나만 존재 한다.<br />
  53. 53. shared_ptr<br />참조 카운팅 방식의 스마트포인터로 C++의 <br />새로운 표준인 tr1에 포함되여있다.<br />std::tr1::shared_ptr<Game> p(new Game); <br />std::tr1::shared_ptr<Game> p2(p); <br />자원의 참조 개수를 체크한다.<br />소유권이 여러 개 존재할 수 있다.<br />
  54. 54. 컴파일 속도<br />
  55. 55. 멀티코어 사용<br />VisualStudio 2005, 2008에서 컴파일과<br />정에는 멀티코어CPU를 지원하지 않는다.<br />프로젝트 속성 -> C/C++ ->명령줄-><br />추가옵션 -> /MP 입력.<br />멀티코어CPU를 지원한다.<br />
  56. 56. 컴파일된 헤더 사용<br />전반적으로 사용되어지며, 소스수정이 크게 없는 <br />헤더파일을 미리 컴파일 해두고, 다음에 빌드때마<br />다 다시 컴파일 하지 않고 사용 하는 방법.<br />프로젝트 설정.<br />프로젝트 속성 -> C/C++ ->미리컴파일된 헤더 ->미리컴파일 된 헤더 사용<br />CPP설정<br />CPP의 속성창에서 위와같이 설정.<br />컴파일 속도 증가.<br />
  57. 57. 증분링크 사용<br />Obj파일을 합치는 과정에서 메모리배치, 함수 순<br />서, 코드, 데이터영역 등을 계산하는 시간이 포함<br />되여 있다. 그래서 매번 수정된 것만을 재계산 하<br />게 하는 방법이다.<br />프로젝트 속성->링커->일반 ->증분링크사용<br />링크속도 증가.<br />
  58. 58. 끝<br />

×