... 주절주절

수연낙명

MBCS와 WBCS 지원 windows 프로그래밍 프로그래밍

TCHAR
_T()
_t... 함수 사용.

unigine 엔진 게임 개발


__declspec 실제 사용 예 프로그래밍

class __declspec( align( 16 ) ) UnitManager
{
public:
    UnitManager( void );
    ~UnitManager( void );
.
.

struct __declspec( align( 16 ) ) UnitPositionData
    {
        float fPositionX[ gs_nSIMDWidth ];
        float fPositionY[ gs_nSIMDWidth ];
    };


__declspec 확장된 속성 구문 프로그래밍

http://blog.naver.com/kyuniitale/40021407522

Microsoft Specific

align(#)

    사용자정의 데이터를 정밀하게 정렬하는데 사용되며, 더불어 자주 사용되는 데이터를 특정 프로세서의 캐시라인 크기로 정렬해 캐시성능을 높인다. #은 정렬값으로 1부터 8192 (바이트) 까지 2의 거듭제곱 수. 즉 2, 4, 8, 16, 32, 64.

Visual C++은 기본적으로 데이터 크기에 따라 natural boundary에 데이터를 정렬한다. 가령 4바이트 정수는 4바이트 경계, 8바이트 더블은 8바이트 경계에 정렬되며, 클래스 또는 구조체내 데이터들은 natural alignment와 현재 packing 설정 (#pragma pack(n)또는 /Zp 컴파일러 옵션) 중 작은 값으로 클래스 또는 구조체 안에 정렬된다. 이 구문은 structunionclass 정의나 변수 선언시 사용할 수 있지만, 함수 매개변수 (즉 스택변수) 에는 사용할 수 없다.

 

참고  특정 타입의 기본 정렬값(size_t)을 알려면 __alignof(CE3.0), 64비트 프로세서를 타겟으로 할 때 정렬되지 않은 포인터를 선언하려면 __unaligned(CE5.0) 참조.

 

요약하자면:

  - __declspec(align(#))이 사용되지 않으면, 스칼라 구조체 멤버의 정렬값은 멤버 크기와

    현재 packing 중 작은 값이며, 구조체의 정렬값은 각 멤버 정렬값 중 가장 큰 값

  - 구조체 멤버는 구조체 시작 오프셋에서 이전 멤버의 끝 오프셋까지보다 크거나 같은 가장 작은

    정렬 배수값에 위치한다.

  - 구조체 크기는 마지막 멤버의 끝 오프셋보다 크거나 같은 가장 작은 정렬 배수값이다.

 

#define CACHE_LINE      32

#define CACHE_ALIGN    __declspec(align(CACHE_LINE))

 

struct CACHE_ALIGN S1

{                                      // 이 타입의 모든 인스턴스는 32바이트 경계에서 시작해야 하며,

    int a, b, c, d;                // S1을 구성요소로 가지는 구조체의 최소 정렬 속성은 32.

};                                    // sizeof(struct S1)는 32. 뒤따르는 16바이트가 padding

 

베이스가 올바르게 정렬된 배열을 만들려면, _aligned_malloc(VC.NET) 또는 자신의 할당자를 작성하도록 한다. malloc(VC6), C++ 연산자 new(VC.NET), Win32 할당자 같은 보통 할당자는 십중팔구 __declspec(align(#)) 구조체 또는 구조체 배열에 맞게 충분히 정렬되지 않을 메모리를 리턴한다.

 

구조체의 sizeof 값은 "가장 큰 멤버 정렬값의 가장 가까운 배수로 채워지는 마지막 멤버의 오프셋 + 마지막 멤버의 크기" vs. "완전한 구조체 정렬값" 중 큰 값이다.

 

__declspec(align(8)) struct S2 {

    int a, b, c, d;               // sizeof(struct S2)는 16

};

 

struct S3 {

    int a;                          // 4바이트 뒤를 잇는 28 바이트가 padding,

    struct S1 s1;              // s1은 오프셋 32에서 시작. sizeof(struct S3)는 64

};

 

// 배열의 시작주소는 32바이트로 정렬되지만, 각 배열멤버는 그렇지 않다

// 즉 각 배열멤버의 sizeof 값은 __declspec(align( # ))의 영향을 받지 않는다

CACHE_ALIGN int array[128];

 

// 배열의 각 멤버를 정렬하는 코드의 예

typedef CACHE_ALIGN struct { int a; } S4;

S4 array[10];

 

// 구조체 자체를 정렬하는 것과 첫번째 요소를 정렬하는 건 동일하다

CACHE_ALIGN struct S5 {

    int a;

    int b;

};

struct S6 {

    CACHE_ALIGN int a;

                           int b;

};

// 즉 S5와 S6은 동일한 정렬, 할당, 크기를 갖는다

 

void fn() {                      // a, b, c, d의 시작주소 정렬은 각각 4, 1, 4, 1

    int a; char b; long c; char d[10];

}

 

메모리가 힙에 할당되었을 때의 정렬은 호출된 할당함수에 의존한다. 가령 malloc을 사용하면, 그 결과는 피연산자 크기에 따라 다르다. arg >= 8이면 8바이트, arg < 8이면 arg 이하의 2 제곱수에 정렬된다. 즉 malloc(7)을 사용하면, 4바이트 정렬된다.

 

__declspec(align(#))을 이용한 새로운 타입 정의

 

struct aType {int a; int b;};

typedef __declspec(align(32)) struct aType bType;

 

이제 aType과 bType은 같은 크기 (8 바이트) 지만, bType 변수들은 32바이트 정렬된다.

 

TLS(thread-local storage)내 데이터 정렬

    __declspec(align(#))으로 생성되고 이미지의 .tls 섹션에 놓인 TLS(스레드에 유일한 데이터 저장소)는 일반적인 정적데이터와 똑같이 정렬된다. OS는 .tls 섹션 크기만큼 데이터를 할당하고 .tls 섹션 정렬 속성을 고려해 TLS 데이터를 생성한다. 다음은 TLS에 정렬된 데이터를 놓는 다양한 방법들이다.

 

// TLS에 정렬된 정수 놓기

__declspec(thread) __declspec(align(32)) int a;

 

// 정렬된 구조체를 정의하고 구조체 타입의 변수를 TLS에 놓기

__declspec(thread) __declspec(align(32)) struct F1 { int a; int b; } a;

 

이터 packing과 정렬

 

/Zp 컴파일러 옵션과 pack pragma는 구조체와 union 멤버 데이터를 packing하는 효과가 있다. 다음은 /Zp 옵션과__declspec(align(#))을 같이 사용한 예와 다양한 /Zp (또는 #pragma pack) 조건에서 각 멤버의 오프셋이다.

 

struct S{                                //   변수              /Zp1    /Zp2   /Zp4    /Zp8

    char a;                               //   a                  0          0         0          0

    short b;                              //   b                  1          2         2          2

    double c;                            //   c                  3          4         4          4

    CACHE_ALIGN double d;    //   d                  32        32       32        32

    char e;                               //   e                  40        40       40        40

    double f;                            //   f                   41        42       44        48

};                                           //   sizeof(S)      64        64       64        64

 

세부사항은 /Zp (구조체 멤버 정렬)(VC.NET) 참조.

 

따라서 객체의 오프셋은 객체가 __declspec(align(#)) 속성을 갖지 않으면, 이전 객체의 오프셋과 현재 packing 설정에 따라 결정되며, 그렇지 않으면 이전 객체의 오프셋과 객체의 __declspec(align(#)) 값에 따라 결정된다.

End Microsoft Specific

 

원문: C++ Language Reference, __declspec, align(CE 3.0)

참조: Windows Data Alignment on IPF, x86, and x64


Doxygen 사용 프로그래밍

...

VS 정리 Visual Studio

.user .suo .pch .ncb .obj .sbr .pdb .ilk .map .bsc .idb .sdf


System Class 게임 개발

windows 생성과 메시지 처리 

application 진입 지점인 WinMain 함수에서는 이 클래스를 생성하고 초기화한 후 실행시키기면 하면 된다.

후에 윈도우 생성과 메시지 루프만 남기고 다른 클래스들은 application 클래스로 분리하자.

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pScmdline, int iCmdshow)
{
CSystem* System;
bool result;
// System 클래스 생성
System = new CSystem;
if(!System)
{
return 0;
}

// System  클래스 초기화 그리고 실행
result = System->Initialize(); // 이 곳에서 윈도우, 그래픽, 입력장치, 타이머 등의 시스템과 관련된 클래스들의  // 초기화가 이루어 진다.
if(result)
{
System->Run(); // 조건부 무한루프로 프레임 처리
}

// 프로그램 종료시에 System  클래스 정리
System->Shutdown(); // Initialize() 함수에서 할당된 객체들을 모두 안전한게 해제한다.
delete System;
System = 0;

return 0;
}

넌 어딜 가나 늘 그 꼴일 거야... 주절주절

바뀌길 원한다
하지만 내부적으로는 바꿀 수가 없다 
그렇다면 외부의 도움을 구할 수 밖에... 
외부의 지원조차 바랄 수 없거나 거부한다면
그냥 사라지는 수 밖에

저항하라 그리고 살아 남아라
굽히는 순간 너는 없다.


UFO Aftershock 병과 조합 게임 이야기

Humans 
Gunman/Technician/Leader 
Medic/Sniper/Scout 
Gunman/Trooper/Technician 
Stalker/Commando/Scout 
Sniper/Stalker/Scout 
Scout/Stalker/Medic 
Medic/Trooper/Sniper 
Ranger/Commando/Stalker 
Scout/Stalker/Ranger 
Leader/Commando/Stalker 

Cyborgs 
Cyborg/Commando/Stalker 
Cyborg/Ranger/Scout 
Cyborg/Technician/Medic 
Cyborg/Sniper/Commando 

Psionics 
Psionic/Sniper/Scout 
Psionic/Leader/Ranger 


1 Cyborg + Ranger/Comando (shotgun and katana)
get attention from bad guys, clean up blackedout enemies without bullets
3 Humans + Trooper/Gunman/Medic (asault rifles)
killing enemy medium range, switch to burst for short range.
1 Psy + Sniper/Leader (sniper rifle)
long range kills, scouting, bonuses to all team

1. Cyborg/Commando/Stalker(meleer)
2. Ranger/Gunman/Commando(melee or SMGs, as appropriate)
3. Gunman/Trooper/Medic (general purpose troops, MGs with UBGLs)
4. Gunman/Leader/Trooper
5. Cyborg/Technician/Medic
6. Medic/Sniper/Scout
7. Psionic/Sniper/Leader


1 2 3 4 5 6 7 8 9