enum

Posted 2007/08/01 13:30, Filed under: Code Factory
// C4482.cpp
// compile with: /c /W1

struct S {
  enum E { a };
};

int i = S::E::a;   // C4482
int j = S::a;   // OK

enum - 열거체의 경우 잘못된 사용법에 따라 지적을 받았는데,
Gpg에 질의하여 왜 잘못되었는지 알게 되었다.
열거체로 정의했을 경우 SKILL::ICEBALL 같은 것은 오류 라는것!
당연한 이야기만 위와같은 예는 네임스페이스가 아니기 때문이다.
그것을 보안하기 위해 namespace나 위와같이 struct로 감싸는 것이 좋다.

namespace VTX_BOX
{
  enum{ FVF = ~ }
}

Leave a comment

팁!팁!팁!

Posted 2007/06/17 02:33, Filed under: Code Factory

닷넷에서의 코드 더보기 기능 : Ctrl + Space


Leave a comment

게임프로그래머의 조언

Posted 2007/04/16 18:56, Filed under: Programming
발췌 : Windows Game Programming for DUMMIES

매우 오래된 게임 서적에서 나온 이야기인데, 지금의 관점과는 많이 다르다. (틀린 이야기도 다수 포함)
그래도 내게는 유머처럼 친숙하게 다가오는 말들이다...


1. 전역변수를 사용할 수도 있다. 그러나, 그럴 필요가 없다면 사용하지 말라.


2. 절대적인 경우가 아니라면 GOTO 문을 사용하지 말라. 대부분의 경우 거기에 필요한 보다 좋은 방법을 찾을 수 있다.


3. 어떤 변수나 다른 요소가 얼마나 많은 메모리를 필요로 하는 지 모를 때에는, 기록을 위한 배열을 그때그때 할당하라.

   연결 리스트(linked list)와 트리 구조를 피하라. 자료 구조는 최대한 단순하게 유지하라.


4. 대부분의 자료 형을 32비트 자료 형으로 하라. 8비트나 16비트 형을 써서 메모리를 아끼려고 하지 말라. 속도가 가장 중요한 것이며,

   32비트 데이터가 32비트 프로세서에서 훨씬 빠르다. (참고로 이 글을 발췌한 책은 윈도우즈 게임 프로그래밍 책입니다.)


5. 아주 많은 변수들을 넘기지 말라. 그것들을 구조체로 묶어서 구조체를 가리치는 포인터를 넘겨라.


6. 길고 명확한 변수 이름을 사용하라. 타이핑을 좀 더 하게 되면, 수많은 두통에서 벗어날 수 있다.


7. 모든 것을 객체로 생각하라. 그리고, 객체간의 의사소통을 최소화하라. 코드를 다른 관련 없는 코드에 종속적으로 만들지 말라.


8. 모듈(modular) 고딩 기법을 사용하라 : 헤더파일, define, typedef 등.


9. 언제나 모든 변수들을 초기화하라.


10. 부동소수점 연산을 하지 말라. 정수 계산이 더 빠르다.


11. 코드 속에 주석을 달아라. 모든 라인에 주석을 다는 것이 가장 좋다.


12. 코드를 작성할 때는 최적화하려고 하지 말라. 효율적으로 프로그래밍해야 하지만, 최적화는 나중에 해라.


13. 좋은 알고리즘은 수천 줄의 어셈블리 언어 코드만큼의 가치가 있다. 프로시저가 느리다면, 어셈블리 언어에 의지하기 전에

    더 좋은 방법이 없는 지 찾아보라.


14. 언제나 카페인 음료를 구비하라.


15. 자주 호출되는 작은 함수에는 inline 함수를 사용하라.


16. 방어적으로 프로그래밍하라. 시작할 때부터 각 함수들에 대한 에러 로그를 생성하는 에러 시스템 종류를 만들어라.


17. 복잡한 C/C++ 함수를 최소화하라. 필요한 코드를 짤 수 있으면, 짜서 써라.

    C/C++ 라이브러리들은 빠른 편이지만, 아주 빠르지는 않다.


18. 작은 데이터의 배열을 할당할 필요가 있고, 배열의 크기가 16 정도에서 256을 넘지 않을 때에는, 배열을 정적(static)으로 만들어라.

    그런 작은 자료들에 대해서 메로리 할당과 해제와 같은 복잡성을 가질 필요가 없다.


19. C++ 객체와 클래스를 좋아한다면 사용하라. 그러나, 단지 클래스를 쓰고 싶어서 클래스를 만들지는 말라.

    클래스는 간단하고 견고하게 하라. 기억하라, 가장 좋은 프로그램에는 클래스가 없다.

Leave a comment


코드의 웃음을 빼앗아가는 리펑토링(Refuctoring)

gpgStudy에서 어느 한분이 다른사람의 소스코드를 보고 스트레스가 많다고 글을 올리자,
경험있는 여러사람들이 여러가지 쓰레드를 달아 주셨는데... 웃기는 글도 많고 생각을 하게되는
몇몇 글들도 있었다. 그중에 리펑토링이라는 단어가 언급되었는데 싸이트를 보고 Copy를 했다.

내가 일하고 있는 팀에서 동료끼리 서로의 코드를 검토하는 코드리뷰(code review)는 필수적인 항목이다. 코드를 제출(submit)하기 위해서는 누구라도 최소한 한 명 이상의 검토를 받아야 한다. 그렇게 하지 않으면 경우에 따라 문책을 받기도 한다. 특히 새로 입사했거나 경험이 많지 않은 프로그래머는 시스템 이해가 부족한 탓에 코드리뷰를 통해서 검토와 수정을 반복하는 일이 적지 않다. 이러한 맥락에서 나는 얼마 전에 새로 입사한 프로그래머가 작성한 코드를 검토하였다.

more..


Leave a comment

[DX] 3D 프로그래밍 기초상식

Posted 2007/04/16 18:38, Filed under: 3D Programming/Graphics
일반적으로 수학에서는

v' = M * v 이다.

v는 4x1 벡터고 M은 4x4 행렬이기 때문이다.

그러나 DX에서는 1x4 벡터를 쓰기 때문에,

v' = v * M

식이 된다.



v' = v * M1

v'' = v' * M2

v''' = v'' * M3

의 식은

v''' = v * M1 * M2 * M3

로 나타낼수 있다.

또한

Mt = M1 * M2 * M3
v''' = v * Mt

로 나타낼수 있고 Mt의 연산은 순서대로 이루어져야 된다.

Homogeneous coordinates

4차원이지만 3차원 벡터처럼 쓰이는 것...

3차원 벡터 -> 4차원 벡터

( x, y, z ) -> ( x, y, z, 1.0f )

4차원 벡터 -> 3차원 벡터

( x, y, z, w ) -> ( x/w, y/w, z/w )

Leave a comment

RHW(Reciprocal Homogeneous W)란?

Posted 2007/04/16 18:33, Filed under: 3D Programming/Graphics
copyrightⓒ 김성완(찐빵귀신) [2001년 7월 23일]

W는 Homogeneous coordinates의 네번째 성분이고 homogeneous coordinates 는 우리말로 동치 좌표라고 합니다. 일반적으로 3차원 좌표변환 행렬로 4*4 행렬을 사용하는데.. 그렇게 되면 버텍스 좌표계 값은 (x,y,z,1)로 사용합니다.

perspective 변환 행렬을 적용하고 나면 버텍스 좌표값의 네번째 성분이 1이 아닌 값이 나오게 되는데.. 이렇게 얻어지는 좌표값을 보통 (x,y,z,w)라고 표시합니다.

이때 이런 좌표값을 동치 좌표라고 합니다. 실제로 스크린상의 좌표값으로 사용하기 위해서는 동치좌표가 아닌 일반적인 좌표로 변환을 해야 하는데.. 좌표의 각성분을 w로 나누어서 구하게 됩니다. 즉, (x/w, y/w, z/w, w/w) = (x/w, y/w, z/w, 1) 이 되고 네째 성분 값이 1인 일반적인 좌표로 바뀌죠.

rhw라고 하는 것은 reciprocal homogeneous w 의 약자로 동치좌표 'w의 역수' 라는 뜻입니다. 즉, 1/w 를 말하죠. 위에서 동치좌표를 일반적인 좌표로 변환하기 위해서 w로 나누었는데, 컴퓨터에서는 나누기 계산이 느리므로 1/w를 한번만 구해서 각성분에다 1/w를 곱하는 식으로 계산을 처리합니다.

그래서 direct3d에서는 w의 역수를 rhw라고 이름하고 따로 저장하는 거죠.

그런데 직접 행렬 변환을 처리할 목적이 아니라면 이런 부분은 굳이 알지 못하더라도 물체의 좌표를 담은 오브젝트 좌표값만 넘겨주면 위에서 언급한 계산들은 세팅해준 행렬에 따라 자동으로 알아서 처리해주므로 신경쓰지 않아도 됩니다. 좌표변환의 전과정을 직접 처리할게 아니라면 rhw는 크게 신경쓰지 않아도 됩니다. 그냥 변환 행렬만 제대로 세팅하면 되지요.

Leave a comment

첫번째 책 리뷰

Posted 2007/01/03 17:43, Filed under: Programming

사용자 삽입 이미지


저자 Noel Llopis | 역자 최현호 | 출판사 정보문화사

방학 기간동안 여러가지 책을 읽어보고 리뷰를 하려고 합니다.  작심3일이 되지 않길 빌어야 지요.
비교적 간단해 보이는 책을 덜컥 골랐지만, 생각 외로 깊은 내용을 담고 있어 놀라웠습니다.
C++ 에 대해선 한번쯤 생각해 봐야할 내용들이 책에 많이  포함되어 있네요.
C++에 대한 기본 지식을 가지고 있는 유저에게 맞는 책으로,
곰곰히 생각해 봤지만 C++ 을 처음 접하시는 분에겐 무용지물 일것 같습니다.
게임 프로그래밍의 특성상 다른 프로그래밍에서 간과하기 쉬운 성능에 대한 부분의
저자의 의견이 다수 포함되어 있고, 게임 엔진의 아웃트라인을 잡는데 어렴풋이나마 도움이 될것 같습니다.
물론 제 생각 이지만요~ " 한번쯤 읽어보면 아주 유익한 책 " 이란 결론을 내립니다.

난이도 : A  /  재미 : D / 읽기쉬움 : C / 유익함 : B+

리뷰 part 1.

게임 프로그래머를 위한 C++

1.
상호작용이 가능한 속도로 실행된다.

2.       최소한의 프레임 속도(초당 30-60 프레임)를 보장한다.

3. 기계를 장악하거나 혹은 거의 대부분을 제어한다.

4.       매우 많은 자원을 이용한다.

5.       다중-플랫폼 환경을 위해 개발된다.


Part 1.



C++
의 힘을 끌어내자.

클래스

상속

Enemy 클래스를 토대로 Boss 클래스를 만들 수 있다.

부모 클래스의 특정함수를 완전히 대체하지 않고 약간 추가 하려면 다음과 같이 구현을 작성한다.


void
Boss::RunAI()

{

        Enemy::RunAI();

}


다형성과

다형성은 여러가지 타입의 유닛들을 실제의 형에 관계없이 한 번의 함수 호출로 모든 적 유닛들을 관리할 수 있게 한다.


가상함수

포인터는 부모형이고 개체가 자식이면 부모의 선언된 함수가 가상 함수인지의 여부에 따라 함수 호출이 달라진다.


규칙 1: 포함 vs 상속

상속할 때는 ~이다 의 관계가 성립 하여야 한다. 가진다 라고 말할 수 있는 것을 포함이라고 한다. 상속을 이용해야 하는지 결정하기 힘들다면 하지 않는 것이 좋다.


규칙 2: 동작 vs 데이터

데이터가 아닌 동작을 변경하는 경우에만 상속을 이용한다.


상속을 이용할 상황과 피해야 할 상황

가상 함수를 이용 하는 데는 얼마간의 성능 저하가 따른다. 가상함수의 선택은 신중해야 한다.


상속의 구현(고급)

단 한 개라도 가상 함수를 포함하는 클래스는 모두 vtable을 가지며, 테이블의 적절한 슬롯을 인덱스하는 방식으로 런타임 시에 호출될 함수를 결정한다. vtable은 개체가 아닌 클래스 당 한 개씩 존재한다. 256*256 크기의 맵이 필요하다면 개체의 수는 65,536개가 된다. 각각의 객체가 vtable을 가질 필요는 없으며, 대신 vtable을 가리키는 포인터만큼 거지게 된다. 포인터를 위한 64KB vtable 자체의 크기만큼 메모리를 더 사용하게 된다.


비용 분석(고급)

과정 1. 특이한 점이 없어 보이는 함수 호출로 시작된다.

pEnemyUnit->RunAI();

과정 2. 해당 개체의 vtable 포인터를 얻는다.

과정 3. 호출하고자 하는 함수에 해당하는 오프셋 항목을 vtable에서 얻는다.

과정 4. vtable 항목에 지정된 주소로 함수 호출이 이루어진다.


상속과 가상 함수를 이용해 특정한 동작을 오버라이드하도록 게임 구조가 만들어졌다면 뒤늦게 이 구조를 변경하는 일이 극히 어렵다는 것이다.

가장 좋은 방법은 프로그램 내에서 가상 함수를 호출할 때 일어나는 결과를 이해하고 게임을 개발할 때 이를 염두에 두는 것이다. 물론 논리적인 지식만으로 게임이 실행되는 상황에서의 많은 작업과 프로파일링, 예상한 만큼의 결과가 나타났는지를 확인하는 등의 일을 대신할 수는 없다.


대안(고급)

상속을 통하지 않고 C를 이용해 비슷한 기능을 구현해보는 것.

1.       하나의 구조체와 다수의 조건문 : 모든 구조체가 같은 크기가 되므로 메모리 낭비와 if 문의 수가 늘어나면 더욱 심각한 성능 저하가 발생한다.

2.       하나의 구조와 switch 문의 이용 : 컴파일러는 결국 if 문을 이용한 것과 동일한 코드를 만들어낼 가능성이 높다.

3.       포인터 테이블 : 성능 면에서는 상속과 가상 함수를 이용한 것과 동일하다. 차라리 컴파일러에게 맡겨두는 것이 좋다.

앞서 소개한 방법들보다는 상속과 가상 함수를 이용하는 것이 좋으며, 코드의 최적화나 관리 면에서는 우리보다 컴파일 능력이 뛰어나다.


프로그램 아키텍처와 상속(고급)

상속은 프로그램의 아키텍처에 전반적으로 좋지 않은 영향을 줄 수 있다. 상속은 또한 프로그램 디자인을 경색시키는 효과가 있다. 포함은 상속과는 달리 프로그램 디자인을 경색시키지 않으며 유연한 상태를 유지시켜준다. 그러나 모든 상속을 포함으로 대체하는 것을 권장하는 것은 아니다. 상속이 문제가 될수 있을만한 부분, , 상속의 수준이 지나치게 깊어질 경우에는 포함을 이용하여 두 단계나 세 단계의 작은 단계로 나눌 수 있다.


Leave a comment

최후의 금요일 한 짓거리

Posted 2006/12/29 17:43, Filed under: Programming


오늘은 올해의 마지막 금요일이다. 일단 학기가 끝난지 한참 되었지만, 아직 한게 없다.

이래서는 아니되는데... 성적이 생각보다 안나와서 그로기 상태였다 쳐도 너무 논것이 아닌가.

누가날 때려줘! 라고 말하면 자다가도 일어나서 달려올 사람 들을 까봐 생략 하겠다.

그래서 오늘은 비주얼 스튜디오 2005를 깔았다.(결국엔 아무것도 안한 꼴)

평생토록(?) 6.0만 고집해 오다가 시대의 흐름에 따라 닷넷 부류에 갈아타기로 했다.

이것이 6.0 과 닷넷환경의 전경이다.


사용자 삽입 이미지

Visual C++ 6.0 의 스크린샷



사용자 삽입 이미지


Visual Studio 2005 의 스크린샷


무언가 세련되고 깔끔해진 윈도우가 시선을 끈다. 하지만 과연 화려한만큼 코딩에 도움을 줄까.

가볍고 간단하고 심플한게 역시 내 취향인것 같다. 그래도 대세를 따라야지.

'불나방' 이라는 단어가 문뜩 생각났다. 프로그래머가 된다는 건 그런것일까?


Leave a comment


Recent Posts

  1. [참고자료] 모니터 해상도 도표
  2. [런타임에러] Expression: map/set it..
  3. *. 플러그인 랩퍼 사용하기 ( 3DS MAX..
  4. *. 스키닝 오프셋 벡터 [Offset Vecto..
  5. November 2007 DirectX SDK News

Recent Comments

  1. 관리자만 볼 수 있는 댓글입니다. 06/24

Recent Trackbacks

Calendar

«   2009/11   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Bookmarks

  1. Cafe24
  2. ForTheProgramming
  3. Tatter Tools
  4. 근석이
  5. 진호네

Site Stats

TOTAL 14471 HIT
TODAY 14 HIT
YESTERDAY 16 HIT
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.