프로그래밍 일반 2011. 2. 23. 12:42

IsDBCSLeadByte


멀티바이트를 구성하는 바이트가 2바이트를 구성하는 바이트의 첫번째 바이트인지 판단해서 true 리턴.
단순히 아스키코드 값이 127보다 큰지 작은지 알려주기 때문에 한글을 확인할 때는 2바이트로 짝을 맞추어서 확인하자.
프로그래밍 일반 2010. 12. 30. 12:31

파일 존재 여부 확인

int _access( const char* path, int mode )

- parameters
  psth
   File or directory path.
  mode
   Read/write attribute.

- header
 <io.h>

리턴값은 msdn과 일치하지 않는 듯하다. 실패시 -1을 리턴한다.
폴더와 파일 모두 확인하기 때문에 GetFileAttributes 함수와 같이 사용하면 좋을 듯, 아미녀 속성 검사 함수만 사용해도 되고..

DWORD GetFileAttributes( LPCTSTR lpFileName )

FILE_ATTRIBUTE_DIRECTORY 파일 속성이 폴더인 경우

프로그래밍 일반 2010. 12. 13. 09:56

동적 측면을 검증해 클래스 다이어그램 완성하기


모델링은 정적인 측면, 동적인 측면, 기능적인 측면에서 검증한 후, 클래스 다이어그램을 수정할 필요가 있다.

 정적인 측면에서 모델링한 것만으로는 모델링이 불충분한 이유는 시스템이 동작할 때에는 클래스 다이어그램에 표시된 클래스의
오브젝트가 생성되거나, 서로 협조하면서 변화 또는 소멸하는 동적인 변화가 있기 때문이다. 이 동적인 변화를 정적 모델에 작성된 클래스의 속성이나 조작의 조합에 의해 의도한 대로 다룰 수 있다는 것을 검증해야만 한다. 이것을 통과하지 못한 정적 모델은 가설적인 개념에 지나지 않으며, 시스템을 만들어도 제대로 동작한다는 보장이 없다.
 
AI 프로그래밍 2008. 12. 11. 00:55

PathManager Diagram

Blood Summoner 프로젝트에서 사용한 길찾기 엔진의 클래스 다이어그램 간략화 버전






프로그래밍 일반 2008. 12. 4. 21:57

스택 기반 Scene 관리자


프로그래밍을 하다보면 기존의 상태를 유지한 상태에서 이벤트 Scene나 서브 게임 Scene으로 전환해서 플레이하다가 처음의 메인게임 Scene으로 돌아가야하는 경우가 있다. 

이런 경우 각각의 Scene을 클래스화하고 관리자에 키워드와 함께 등록해서 사용하면 편리한데 각각의 Scene을 상황에 따라 2차원이나 3차원으로 쌓을 수 있다.

그림에는 프로젝트에서 사용했던 관리자 클래스와 개념도만 나와있지만 관리자에 Scene 클래스가 포함되며, 팩토리를 이용해 생성하거나 등록하게 꾸밀 수 있다.

이런 식으로 Scene 관리를 꾸미면 데빌 메이 크라이3 에서처럼 캐릭터를 컨트롤하는 와중에 이벤트 데모를 플레이해주고 데모가 끝났을 때 데모 플레이 직전의 상태로 돌아가는 구조를 간단

하게 구현 할 수 있다. 





프로그래밍 일반 2008. 12. 4. 16:22

switch - case를 C++스럽게


우선 Blood Summoner 프로젝트에서 사용된 Network SyncFSM을 간단히 살펴보겠다.


간단히 설명하면  실시간으로 발생하는 내부 이벤트나 유저 컨트롤, 패킷등을 이벤트 메니저가 관리를 하고 있다가

 EventProgress 인터페이스에서 이벤트를 일괄처리하는 부분이 있는데, 이 이벤트 처리 코드가 switch - case를 사용하고 있다.


자 ~ 우선 switch - case 사용이 무엇이 문제인가. 본인이 생각하는 단점들을 나열해 보겠다.

첫째, switch - case 는 if - else 구문과 같기 때문에 이벤트가 많아지면 결과 도출까지의 비용이 커진다.

둘째, 별로 C++스럽지 못하다.

셋째, 함수가 엄청 길어질 수 있다.. 최악의 경우 몇천에서 만단위까지 

넷째, 스택 이용 메모리가 굉장히 커질 수 있다.

그러면 어떻게하면 비용을 줄이면서 더욱 C++ 스럽게 할 수 있을까?




각각의 이벤트를 클래스로 정의하고 C++의 다형성을 이용하면 깔끔하게 해결된다.


단점 

- CASE 무지하게 많아지면 결국은 이것도 객체를 찾는게 일이다.

- 일반적으로 SWITCH_CASE 보다 느리다.

- 컴파일러가 발전하면서 점프테이블을 잘 만들어준다. (관리하지 않은 switch case 문제 중 하나 해결)


다른 방법 링크 : 함수 포인터 이용


프로그래밍 일반 2008. 12. 2. 22:46

Object Pool

풀에서 Free 객체를 얻고 ID를 할당 후 빌더를 통해 객체의 최종 동작 형태를 결정한다.


Blood Summoner 프로젝트 처음 제작한 RTS인데 제작 기간은 7개월을 초과하면 안되는 상황이었다.

아키텍처를 설계하는 입장에서 제작의 편의성과 함께 속도를 생각하지 않을 수 없는 상황이었는데 결국은 리소스 풀과 함께 Actor 객체 풀도 사용하기로 결정했다.

POOL을 사용하기로 결정한 후엔 POOL의 스팩과 역활을 결정하는 일이 남았는데 메모리 블록화 방지와 참조국소성을 좋게하기 위해 스테이지 로딩 시점에 해당 스테이지에서 최대 한도를 초과하지 않는 객체를 미리 할당하기로 했다.

실직적인 객체들은 배열의 형태로 생성되어 있으며 Pool 인터페이스를 통해 인스턴스를 얻으면 Actor를 가리킬 수 있는 포인터에 주소를 얻고 ID를 부여한 후 빌드를 해서 사용한다.


AI 프로그래밍 2008. 12. 2. 22:09

Pathfinding

                                           사진은 네비게이션 메쉬가 적용된 디버그 화면


길 찾기 알고리즘에는 여러 종류가 있지만 Blood Summoner 에서 사용한 방법은 네비게이션 메쉬를 이용한 테이블 참조 방식이다.

RTS의 특성상 월드에 200개의 Actor 들이 각자의 AI 로직을 처리했기 때문에 길 찾기 방법을 개발하는 시점에서는 가장 비용이 적게 들고 검증된 알고리즘이 필요 했다.

그래서 결정한게 네비게이션 메쉬를 이용한 테이블 참조 방식었는데 결론부터 이야기하면 나쁘지 않은 선택이었다.

네비게이션 메쉬를 이용해서 응용 할 수 있는 점들을 나열해보면
 - 길 찾기
 - 충돌맵
 - 특정 모션으로만 지나가는 영역 판정 ( 점프로 건너는 도랑)
등을 비교적 단순하게 처리할 수 있다.

길 찾기 개념을 단순하게 표현해보면




객체가 2번 셀에서 1번 셀로 이동시 경로는 smile - > B Potal -> A Potal -> Heart 이나 이런식으로만 움직인다면 경로가 매우 딱딱하다.
때문에 끈 당기기 알고리즘을 적용하여 경로를 최대한 자연스럽게 만든다.