Version: 1.2.2654.37769
Date: Mon, 9 Apr 2007 03:58:59 UTC

기존의 정책을 바꾸고 개발자님께서 소스를 공개하여 주셨다.
새버전 받으러 들어갔더니 소스까지 있더라
감사하다

웹사이트가 개발자 개인PC라 좀처럼 들어가기 힘든관계로(근 3일만에 들어갔다;;;)
다운로드 파일들은 첨부해둔다

'자료 > Program' 카테고리의 다른 글

bugtrap bugfix  (2) 2007.04.10
Microsoft® Visual Studio® 2005 Service Pack 1  (0) 2006.12.16
스칼렛 2.0 - dds와 알파채널을 지원 하는 이미지뷰어  (0) 2006.10.18
멋진 HeightMap툴  (0) 2006.10.11
Catch all bugs with BugTrap!  (3) 2006.08.03

http://www.codeproject.com/useritems/STL_string_util.asp

바로 쓸 수 있는 코드들이 꽤 많다.
stl과 템플릿에 아무리 익숙해져도 이런정도까지의 활용은 쉽지 않다.
아무래도 이런 정도의 내용이 되버리면 익숙한 api에 기대기 마련이다.
잘 봐두면 스트링쪽 레벨업이 될듯

혹시 궁금해 하시는 분이 계실까봐 스샷 몇장올립니다.
자세한 내용은 일단 http://www.larosel.com/209 를 참고하세요..;

사용자 삽입 이미지

대략 이런 형태가 나왔습니다.

사용자 삽입 이미지
원래는 이런 형태죠;;

사용자 삽입 이미지
와이어 프레임은 이런 느낌입니다.

사용자 삽입 이미지
걸을수 있는 바닥면에 대한 데이터도 여전히 있습니다.

사용자 삽입 이미지
마을전경은 대략 이런느낌;;

점점 김성민씨의 Space Filling Volume와 모냥이 비슷해집니다..;;

일단은 버전2로 올라오면서 용량 최적화가 많이 됐습니다.
이전 구조에 공간데이터를 넣었으면 좌절할만한 용량이-_-;;

일단 기본설명은 버전1에서 설명했으니 생략하도록 하겠습니다..;

데이터가 같은 셀들을 묶어서 용량최적화를 했고..
공간의 데이터를 가지고 있을 수 있도록 내용을 추가했습니다.
알고리즘은 V1에서 높이만 뽑던걸 Pair로 뽑도록 변경한거라 별다른 내용은 없습니다.

렌더링 되고 있는 화면은 닫힌 공간(실제 공간을 차지하고 있는)을 렌더링 하고 있지만
실제 데이터는 열린 공간을 가지고 있습니다.
닫힌 공간으로는 충돌처리를 할수가 없게 되어 버리더군요;;
이유는 캐릭터가 점..; 이라면 닫힌공간에 부딪히나..를 검사하면 되지만
캐릭터가 세로부피가 있기 때문에(머 대략2m라고 치고) 이 공간에 내가 들어갈 수 있나..를 검사하도록 만들어야 합니다.
다리가 있다고 쳤을때 다리하고 지면이 1미터 간격밖에 안되는데 지나가 버리면 이상하겠죠;;

거창하게 공간데이터 이긴 하지만 실제 사용은 높이만 가지고 있던 내용이랑 큰차이가 없어서 3D상의 공간 충돌뿐만이 아니라 공간상의 길찾기도 내용만 약간 수정해서 그대로 넣어도 사용하는데 지장은 없습니다. 속도적인 부분도 가만할수 있을정도일듯 싶습니다.

잠수나 날아다니거나 하는경우는 사실 1인칭형으로 이동이 될거기 때문에 3D길찾기가 필요한 경우는 없겠지만 혹시나 수중전투-_-같은 경우는 필요하겠죠..; 혹시 몹이 하늘을 날아다니거나..하는 경우도 써먹을수도 있을거고..;;

그리고 걸을수 있는 데이터...의 경우에는 공간데이터와는 따로 가지고 있습니다.
공간데이터쪽에 플래그 같은걸 넣어도 되지만 길찾기 할 때 속도를 높이려고 그냥 중복해서 가지고 있습니다.;;

전과 달라진 내용은 지면데이터 쪽에도 지면에 대한 공간으로 가지고 있습니다.
혹시 캐릭터나 몬스터 이동시 높이에 대한 부피체크(위에서 설명한)가 들어갈 일이 있을까봐 같이 넣었습니다. ( 사실은 따로 만들기 귀찮아서;; )

머 그외에는 버전1에 비해 특별한 내용은 없군요..;

사용자 삽입 이미지

용량을 궁금해 하실까봐 용량을 캡쳐했습니다.
dat파일이 실제 서버에서 사용하는 파일입니다.

메모리 구조와 파일구조가 거의 비슷해서 실제 셀데이터 올릴때 vector에 공간차지하는거 약간 1~2메가 정도 말고는 실제 메모리에 올라가는 용량 그대로입니다.

4020*4020 1미터 단위 4개..와 2040*2040 1미터 단위 2개..맵이 185메가 정도군요..;
원래는 좀 더되야 하는데 내부에서 중복셀을 줄이기 위해 16분할로 데이터를 가지고 있습니다.
용량의 대부분이 셀데이터와 실제 지형을 연결시켜주는 인덱스 데이터이기 때문에
중복셀이 많으면 4바이트를 쓰고 적으면 1, 2바이트를 사용하기 때문에 분할하는것과 안하는것이 차이가 꽤 납니다. ( 많게는 2배까지 )

사실 실제 서버는 존서버 방식이라 한서버에 몇개의 존만 올라가서 그냥 써도 상관은 없지만 나중에 테스트 서버같은데는 모든존을 다 올려버리게 될거 같아서 가능한 다이어트를 했습니다.

_ST가 붙은 파일들은 클라이언트용 패킹파일입니다.
파일 내용자체는 100%같습니다.

사용자 삽입 이미지
안에는 대략 이런 모냥이죠;;

서버파일은 그냥 파일을 줄줄줄 붙여논거 밖에 없습니다. 파일 합치는 방식만 다르고 실제파일은 같습니다.

클라이언트용 패킹파일샷은 압축했을때 얼마나 압축이 되나.. 참고하시라고 올렸습니다.
185메가 짜리가 72메가 가량이 되었군요..
실제 클라이언트에서 그대로 쓰는 구조라 압축률이 낮은걸 쓰고 있어서 저정도 용량입니다.
zip방식으로 걍 압축하면 50메가 정도입니다.

대충 내용은 이정도입니다..
소스를 만들어서 배포를 하거나 할 예정은 없습니다..;;;; ( 이 내용외의 기본 내용들을 만들어서 붙이기도 귀찮고 같이 딸려있는 다른 모듈들;; 덕분에;; )

알고리즘은 내용에 설명을 다 해놨으니 공간개념이 있는 프로그래머분들은 아마 내용만 보고 만드시는데 별 지장은 없을듯 싶습니다.

실제 소스도 공간데이터 만드는 부분 200라인 정도 데이터 구조랑, 로드, 세이브가 500라인정도밖에 안됩니다.

혹시 궁금하신 내용이 있으면 답변 해드리도록 하겠습니다.

'자료 > 내자료' 카테고리의 다른 글

mpl::is_vector  (2) 2009.02.17
SPE V1 - 길찾기용 지형구조  (9) 2006.12.10
게임을 위한 GUI모듈  (4) 2006.07.31
MSB/LSB template  (0) 2006.05.18
is_template  (0) 2006.05.10
http://msdn2.microsoft.com/en-us/library/ms177194.aspx

gpg에 답변달다가 홈피에도 없는것 같길래 포스팅
boost를 대체할수 있는 기본 키워드들이 꽤 있다.
컴파일러에서 처리를 해주니 왠지 boost보다 가볍지 않을까...하는 느낌..

'자료 > Article' 카테고리의 다른 글

Utilities for STL std::string  (1) 2007.03.27
/ENTRY(진입점 기호)  (2) 2007.03.01
Subversion(SVN)과 Mantis의 연동  (2) 2007.01.05
라그나로크2 클라이언트 분석  (2) 2006.12.31
[펌] 디스크 캐쉬 제대로 알기  (2) 2006.12.29

출처 : http://magenta.egloos.com/1454578

Subversion(SVN)과 Mantis의 연동

1. 연동하려는 SVN 저장소에 속성 설정합니다.
bugtraq:label = issue
bugtraq:url = http://localhost/mantis/view.php?id=%BUGID%
bugtraq:message = issue %BUGID%
bugtraq:warnifnoissue = true

2. SVN 저장소의 hooks디렉토리에 다음에 나오는 배치 명령이 들어있는 post commit hook 파일 생성(C:\Repository\hooks\post-commit.bat). SVN이 commit되는 동안에 Mantis에 이슈노트로 추가될 내용들을 넣습니다.
REM Post-commit hook for MantisBT integration
SET REPOS=%1
SET REV=%2
SET DETAILS_FILE=C:\Repository\GNIS4M\svnfile_%REV%
SET LOG_FILE=C:\Repository\GNIS4M\svnfile_%REV%_Log

echo ****** Source code change ******>>%DETAILS_FILE%
svnlook info -r %REV% %REPOS%>>%DETAILS_FILE%
echo SVN Revision:%REV%>>%DETAILS_FILE%
svnlook diff -r %REV% %REPOS%>>%DETAILS_FILE%

C:\APM_Setup\Server\PHP4\php.exe C:\APM_Setup\htdocs\mantis\core\checkin.php <%DETAILS_FILE% >%LOG_FILE%
DEL %DETAILS_FILE%
DEL %LOG_FILE%

3. 다음 내용을 Mantis config_inc.php에 추가합니다.
#Integration to SVN
$g_source_control_notes_view_status = VS_PRIVATE;
$g_source_control_account = 'Administrator';
$g_source_control_set_status_to = OFF;
$g_source_control_regexp = "/\bissue [#]{0,1}(\d+)\b/i";

추가로 연동할 SVN저장소에는 1,2만 반복하면 됩니다.

해보니까 연동은 잘되는데 한글이 깨지는 문제가 생깁니다.

Windows의 Command Prompt는 기본적으로 시스템의 locale을 따르는데..

그게 euc-kr입니다...

문제는 연동배치파일에서 svnlook을 쓰는데 이 프로그램은 Command Prompt의 Locale에 맞춰서 문자열을 출력한다는거..

우리의 Mantis는 UTF-8을 써서 한글을 표현하기 때문에...euc-kr로 된 SVN 정보들은 다 깨집니다.
(물론 euc-kr로 할수도 있지만...그러면 Mantis가 자꾸 워닝을 뿌리기때문에...)

해결책으로 Mantis의 Core디렉토리에 있는 checkin.php를 직접 수정합니다..

42번째 줄의...

while ( ( $t_line = fgets( STDIN, 1024 ) ) ) {

...를

while ( ( $t_line_euc = fgets( STDIN, 1024 ) ) ) {
        $t_line = ( iconv("EUC-KR","UTF-8",$t_line_euc)?iconv("EUC-KR","UTF-8",$t_line_euc):$t_line_euc );

...로 바꾸니까 해결되는군요..

윈도우2003서버에서 Mantis 1.0.6과 svn 1.4.0으로 작업했습니다.

'자료 > Article' 카테고리의 다른 글

/ENTRY(진입점 기호)  (2) 2007.03.01
Compiler Support for Type Traits  (0) 2007.02.13
라그나로크2 클라이언트 분석  (2) 2006.12.31
[펌] 디스크 캐쉬 제대로 알기  (2) 2006.12.29
[펌] Resource Management Best Practices  (0) 2006.11.02

- 파일 분석


- 그래픽 분석


머 전체적으로는 특별히 눈에 띄는 내용은 수영과 점프로 아무데나 올라갈 수 있다와 다양한 페이셜 연출...
말고는 특별한건 보이지 않았다.
다만 생각보다 메모리 사용량이 많지 않았다.

파일이 패킹되어 있지 않아서 분석하기는 좋았지만...
혹시 오베까지 저렇게 내용이 오픈되어있는 상태로 가면 좀 문제가 있겠다..;

평가는 첫 클베치고는 괜찮았다..라고도 생각되지만 개발기간과 언리얼2.x를 생각할때는 생각보다 별로.. 라고도 생각된다.

출처 : http://testors.net/tt/767

오래간만에 재미난 퀴즈.

Q. Win32 환경에서 모든 함수가 성공적으로 수행되었다고 가정할 경우, #END 시점에서 데이터가 실제로 disk 에 쓰여졌다고 기대할 수 있는 코드를 모두 선택하시오.

1.
FILE *fp = fopen( "test", "wb" );
fwrite( "DATA", 4, 1, fp );
// #END

2.
FILE *fp = fopen( "test", "wb" );
fwrite( "DATA", 4, 1, fp );
fflush( fp );
// #END

3.
FILE *fp = fopen( "test", "wb" );
fwrite( "DATA", 4, 1, fp );
fclose( fp );
// #END

4.
FILE *fp = fopen( "test", "wb" );
fwrite( "DATA", 4, 1, fp );
fflush( fp );
fclose( fp );
// #END

5.
HANDLE hFile = CreateFile( "test", 0, FILE_SHARE_WRITE, 0, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL );
DWORD sz = 0;
WriteFile( hFile, "data", 4, &sz, NULL );
CloseHandle( hFile );
// #END



 

정답은 놀랍게도 하나도 없다. -_-;

우선 Win32 API 의 경우 CloseHandle() 을 이용해서 파일 핸들을 닫았다고 해서 실제로 disk 에 write 되는것은 아니다. CloseHandle() 이 flush 를 해줄것이라고 생각할지도 모르겠지만 CloseHandle 한다고 해서 file 이 flush 된다는 얘기는 MSDN 어디에서도 찾아볼 수 없다. 실제로도 CloseHandle() 만으로는 물리적으로 disk 에 write 되지 않고 단지 캐쉬에 write 저장될 뿐이다. 다시 open 해보면 변경된 내역을 확인이 가능한것처럼 보이겠지만 그것은 write/close/open/read 가 모두 OS 의 디스크 캐쉬상에서 이루어 졌기 때문이다. CloseHandle() 후에 PC 코드를 뽑았다 다시 부팅해서 읽게 되면.. 운이 나쁘면 뒤의 일부분은 write 되지 않는것을 발견할 수 있을 것이다.

그렇다면 Win32 에서 데이터가 원하는 시점에 disk 에 기록되게 하려면 어떻게 해야하느냐? 방법은 FlushFileBuffers() 를 명시적으로 호출 해 주는 것이다. 여전히 CloseHandle() 과는 별개라는것을 주의 할것. CloseHandle() 은 내부적으로 FlushFileBuffers() 를 호출하지 않는다.

이제 CRT 의 경우를 살펴보자. CRT 의 fflush() 가 disk 에 write 해주는것 아니었냐고? 안타깝게도 대답은 'No' 이다. CRT 의 fopen()/fwrite()/fclose() 들은 내부적으로 FILE 단위의 버퍼링을 가지고 있으며 fflush() 는 그 버퍼링을 flush 해주는 것일 뿐이다. 그러니까 CRT 에서 fflush() 를 호출하게 되면 FlushFileBuffers() 가 호출되는게 아니라 그동안 쌓여있던 데이터를 그냥 WriteFile() - UNIX 계열에서는 write() - 해 줄 뿐이다. 결국 여전히 데이터가 OS 의 디스크 캐쉬에만 기록되고 물리적으로는 기록되지 않을 가능성이 남아있게 된다. system-call 로 구현될 수 밖에 없는 CRT 의 특성상 이는 모든 OS 에서도 일어날 수 있는 증상이다.

그래서 M$ 의 경우 fopen()/fflush() 의 extension 을 제공한다. 물론 이것은 표준이 아니다. 사용법은 간단한데 fopen() 시에 'c' 플래그를 추가하게 되면 fflush() 시에 FlushFileBuffers() 가 추가적으로 호출된다.물론 여기서도 fclose() 만으로는 물리적인 기록을 기대할 수 없다.

정리해보면, Win32 의 경우 disk 에 저장될 것이라 기대할 수 있는 코드는 다음 두가지다.

FILE *fp = fopen( "test", "wbc" );
fwrite( "DATA", 4, 1, fp );
fflush( fp );
fclose( fp );
// #END

HANDLE hFile = CreateFile( "test", 0, FILE_SHARE_WRITE, 0, TRUNCATE_EXISTING, FILE_FLAG_WRITE_THROUGH );
DWORD sz = 0;
WriteFile( hFile, "data", 4, &sz, NULL );
FlushFileBuffers( hFile );
CloseHandle( hFile );
// #END

아래에 PC 의 전원을 꺼버리는 험악한 방법을 사용하지 않고 이 동작을 확인할 수 있는 코드를 소개한다.

while( true )
{
    FILE *fp = fopen( "test", "wb" );   // #1
    fwrite( "data", 4, 1, fp );         //
    //fflush( fp );                     // #2
    fclose( fp );
}

위의 코드를 수행해 보고 HDD 램프를 지켜보라. 간헐적으로 깜빡일 것이다. fclose() 만으로는 실제 disk 에 기록이 되지 않는다는 얘기다. #2 의 주석을 제거해도 마찬가지다. "wb" 옵션을 "wbc" 로 바꾸고 #2 의 주석을 제거해야 비로소 HDD 램프가 미친듯이 깜빡이고 시스템이 엄청나게 느려지는것을 확인할 수 있을 것이다. Win32 API 도 마찬가지.

어찌보면 사소한 문제로 보일수도 있지만 어플리케이션의 업데이트 루틴을 작성하는 사람이라면 꼭 알아두어야 한다. 유저가 수만명 단위로 늘어나게 되면, 분명히 발생하기 때문이다. 나역시 직접 당해보기 전까지는 fflush() 를 하고 파일 핸들을 닫으면 당연히 disk 에 저장 될거라고 알고 있었기 때문에 이것을 알아내는데에 고생을 좀 했다. 부디 이 포스팅을 읽는 분들은 같은 삽질을 하지 마시길...

'자료 > Program' 카테고리의 다른 글

bugtrap bugfix  (2) 2007.04.10
bugtrap 소스공개  (6) 2007.04.10
스칼렛 2.0 - dds와 알파채널을 지원 하는 이미지뷰어  (0) 2006.10.18
멋진 HeightMap툴  (0) 2006.10.11
Catch all bugs with BugTrap!  (3) 2006.08.03
대략 Ssook Path Engine라는 이름이다..;
사실은 지형데이터이지만 Level이란 네이밍은 지형렌더링쪽에 쓰고 있고, Space란 네이밍은 실제 폴리곤용 네이밍에 쓰고 있는데다..공간 데이터도 아닌지라..;;
마땅히 쓸 네이밍이 없어서 결국 Path라는 네이밍을 썼다..;

알고리즘의 내용은 Multi Height Tile정도가 되겠다.
여러개의 높이를 가지고 있는 타일 데이터다..

김성민씨의 Space Filling Volume을 보고 나니 이럴바엔 예전 2D때 쓰던 방식을 그냥 쓰는게...으흠? 그거 괜찮겠는걸... 하고 만든 내용이다..
사실 만든 내용이라기보단 말한대로 2D때 많이 쓰던 내용이다.
( 아닌가 나만 쓴 내용인가-_-a 2D때도 어디서 보고 만든건 아니긴 했지만 )

일단 잡설은 접어두고 스샷부터 보쟈
사용자 삽입 이미지

대충 이런식이다.
보면 다리위와 아래에 높이 데이터가 있고 오브젝트가 있는부분은 높이 데이터가 없다.
그냥 타일로 나누었고, 하나의 타일은 갈 수 있다/없다가 아니라 높이 값을 가진다.
그리고 여러개의 높이 값을 가지고, 그 높이 값을 비교해서 갈 수 있다/없다 를 판단한다는 내용이다.

내용이 긴 관계로 자세한 내용을 보실분은 more를 클릭해서 보세요.


어쨋건 전에 패스엔진을 고려해서 테스트 해보았는데 위에 있는 내용처럼 높이에 대한 처리라던가 메모리라던가 하는 내용들이 감당이 안되서 만든 시스템인데..
필요하신 분들이 있을까봐 정리해서 공개해둔다.

'자료 > 내자료' 카테고리의 다른 글

mpl::is_vector  (2) 2009.02.17
SPE 길찾기용 지형구조 - V2  (1) 2007.02.22
게임을 위한 GUI모듈  (4) 2006.07.31
MSB/LSB template  (0) 2006.05.18
is_template  (0) 2006.05.10

+ Recent posts