블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2804)
Unity3D (860)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (234)
협업 (61)
3DS Max (3)
Game (12)
Utility (140)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

1. 개요

_CrtDumpMemoryLeaks() 라는 함수를 이용해서 메모리 누수와 누수 지점을 알아내는 기법을 알아본다.

 

2. 탐지하기


#define CRTDBG_MAP_ALLOC


#include <crtdbg.h>

 

void main()

{

   char *ptr = new char[20];

 

   _CrtDumpMemoryLeaks();

}

 

 

 

여기서 {100} 라는 숫자를 보자...

{100 } 이라는 위치에서 할당받은 메모리가 해제가 안된체로 남아있다는 말이기 때문에 그위치에서 브래이크걸도록 만들면

원인을 일으킨 위치를 알아낼수있다.

 

 

void main()

{

  _CrtSetBreakAlloc(100);

  

  char *ptr = new char[20];

 

   _CrtDumpMemoryLeaks();

}

 

 

CrtSetBreakAlloc함수를 시작위치에 두고 다시 컴파일 하여 실행을 시켜보자.

 


 

 

  char *ptr = new char[20]; 위치에서 브래이크 걸릴것이다.

 

이런식으로 메모리 누수를 잡아낼수있다.

 

 

 

 

3. 주의사항

 

mfc용 어플리캐이션은 자동으로 메모리 누수 탐지가 되지만 일반 원도우 어플이나 콘솔어플은 이방법을 사용 해야만 메모리 누수를 알수있다.

 

_CrtDumpMemoryLeaks(); 가 호출되는 시점에서 해제 안된 메모리를 덤프하므로 꼭 프로그램 종료 직전에 써줘야 정확한 메모리 누수여부를 알수잇다.

 

_CrtDumpMemoryLeaks();

delete somePtr;

 

이렇게 되면 메모리 릭이 덤프된다.

 

또한

STL 사용시 제데로 릭을 검출 하지못하고 무조건 메모릭으로 판단하는 경우가 있다.

 

void main()

{

  std::string str("http://jga.or.kr");
  _CrtDumpMemoryLeaks(); 
}

 

이코는 문제가 없지만 str이 아직 중괄호 범위를 벋어나지 않았으므로 여전히 해제가 안된것으로 간주하여 메모릭으로 출력한다.

 

이때는 ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 를 사용해서 릭을 검출할수있다.

 

void main()

{

  ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

  std::string str("sasa");

  char *ptr = new char[20];

  
  //_CrtDumpMemoryLeaks(); 
}

이렇게 해주면 str에 대해서는 메모리릭이 발생하지않는다.


출처 : http://cafe.naver.com/jcga/883

반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |

아래는 해결방법을 찾아다니다 데브피아에서 발견한 글입니다.

[증상]
OS : Win7 x64
프로그램 : VS2008 x86으로 제작

프로그램을 만들어서 배포를 했는데 팀원(Win7 x64)의 컴퓨터에서 side-by-side 에러 어쩌고 하면서 실행이 안됐습니다.

그래서 열심히 검색하다가 데브피아에서 아래와 같은 글을 발견했는데..

아래 글을 보고 생각하다보니 Win7 x64에서 자동업데이트를 해봤자 재배포 패키지가 x64만 깔린다는 생각이 들어서

Microsoft Visual C++ 2008 서비스 팩 1 재배포 가능 패키지 ATL 보안 업데이트 x86 버전을 받아서 직접 깔았더니 잘 실행 되네요.

아래 글이 도움 많이 됐습니다. =ㅅ=

Microsoft Visual C++ 2005 서비스 팩 1 재배포 가능 패키지 ATL 보안 업데이트
http://www.microsoft.com/downloads/ko-kr/details.aspx?FamilyID=766A6AF7-EC73-40FF-B072-9112BAB119C2

Microsoft Visual C++ 2008 재배포 가능 패키지 ATL 보안 업데이트
http://www.microsoft.com/downloads/ko-kr/details.aspx?familyid=8B29655E-9DA4-4B6B-9AC5-687CA0770F93&displaylang=ko

Microsoft Visual C++ 2008 서비스 팩 1 재배포 가능 패키지 ATL 보안 업데이트
http://www.microsoft.com/downloads/ko-kr/details.aspx?familyid=2051A0C1-C9B5-4B0A-A8F5-770A549FD78C&displaylang=ko





VC 2005,2008 ATL관련 보안업데트가 있습니다.

일단 설치를 보류하세요.

자동업데이트도 막으십시요.

 

 

전 2008을 사용중인데. 어제 VC관련 업데이트가 떴길래 무심코 업데이트를 했습니다.

그리고 오늘 수정건을 업체에 배포했는데 죽어도 실행이 안되길래

따로 테스트를 해보았습니다.

 

결론부터 말씀드리면 업데이트3건은

2005, 2008 재배포 패키지(sp1일경우는 따로..) 관련

vs 2008관련

3가지가 설치되는데요.

 

이게 배포시 기본 2008하고 sp1이 다르듯이 아예 재배포 패키지가 다릅니다.

즉 dll버젼이 다르죠.

 

2008 기본 버젼이 9.0.21022.8이고

sp1이 9.0.30729.1

이번 업데이트로 (sp1) 9.0.30729.4148

 

dll버젼이 달라서 재배포 패키지를 최신버젼으로 다시 설치해야됩니다.

 

여기서 젤큰 문제 세가지는

1. 2005,2008 재배포 관련 설치는 추가/제거에 존재하는데 삭제해도 똑같다.

-> vs 2008 sp1관련 업데이트 삭제가 없다.

 

2. 윈도우 복원을 했는데요. 똑같이 문제가 발생하더란 겁니다.

-> 설치된 목록에도 없고 업데이트 해달라고 떡하니 뜨는데도 말이죠;

 

3. 2005부터 재배포 패키지로 바뀌었지만 설치된 폴더에서 필요한 몇개의 파일만 같이 포함하면

문제없었는데 이번엔 아예 그게 안먹힙니다. 제결론으로 그 이유는

 

manifest 명시를 보면

 

기존 sp1을 보면(mfc사용시)

 

 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>

 

9.0.30729.1 버젼의 crt와 mfc라이브러만 명시되어 있지만

 

이번 업데이트로는

  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>

 

9.0.30729.1과 9.0.30729.4148 CRT를 둘다 필요로 합니다. 고로 9.0.30729.4148 dll만 포함하면 실행이 안되겠죠.

 

결론.

아직 정확한 문서를 못봐서 atl관련 뭐가 업데이트 됐는진 모르지만 설치하지마세요 ㅡ.ㅡ;

이미 설치하셨다면 업데이트된 pc에서 컴파일한 파일 배포시는 재배포 패키지를 바꿔야합니다.

아예 모든 재배포 패키지를 최신꺼로 바꿔야합니다;

 

 

sp1용 재배포 패키지 주소 올려드립니다. 한글로는 아직검색 안되는듯 하네요.

Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package ATL Security Update

http://www.microsoft.com/downloads/details.aspx?familyid=766A6AF7-EC73-40FF-B072-9112BAB119C2&displaylang=en

 

Microsoft Visual C++ 2008 Service Pack 1 Redistributable Package ATL Security Update

http://www.microsoft.com/downloads/details.aspx?familyid=2051A0C1-C9B5-4B0A-A8F5-770A549FD78C&displaylang=en

 

 

제가 겪은 일을 일단 빨리 올려봅니다.

댓글로 잘못된 부분은 알려주세요.

업데이트된 내용도 올려주심 감사.


출처 :  http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=8351&ref=8351

반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |

메모리 릭 잡기

Tip & Tech / 2011. 5. 9. 02:09

//_CrtSetBreakAlloc( 11698 );
 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_DELAY_FREE_MEM_DF );

 

간단하다. 이거 맨위에 추가해 주자

 

만약 라인수가 나온다면, 주석 처리 된 부분의 숫자를 그 라인으로 바꿔준다.

 

그리고 다시 실행하면 해당 부분에서 브레이크가 걸린다.

 

간단한 건데, 자꾸 까먹어서 메모해 둔다



[출처]
 메모리 릭 잡기|작성자 시네루진

반응형
Posted by blueasa
, |

디버거로 프로그램 실행 도중 변수 값 조정 방법

 

작성자 : 최흥배 ( jacking75@gmail.com )
 

이 기법은 Game Coding Complete ”라는 책에서 디버깅 기법 중 하나로 소개되고 있는 기법으로 프로그램을 디버깅 모드로 실행하면서 어떤 변수의 값을 변경하 여그 결과를 바로 알고 싶을 때 아주 좋다.

일반적으로 UI 작업 같은 것을 해보면 컨트롤 등의 위치를 바르게 잡기 위해 위치 값을 변경하면서 컴파일->실행->수정->컴파일 단계를 반복하면서 정확한 값을 알아내기 때문에 상당한 시간과 짜증이 유발 된다.

이외에 데이터 주도방식으로 프로그래밍 해도 되지만 이것도 데이터변경->실행 단계를 계속 반복 해야 되기 때문에 UI 노가다 작업이 만만치 않을 것이다.

그러나 지금 소개하는 기법을 사용하면 아주 손쉽고 바로 그 결과를 알 수 있다.


 

이 기법을 사용 하려면 static 변수를 사용하여 디버깅 시 static 변수를 사용하는 부분에 브레이크 포인트를 걸고 변수를 조정하면 된다.



위의 그림을 보면 static 변수 nn0에 값을 설정 한 후 이 값을 사용하는 280 라인에 브레이크 포인트를 걸어 놓는다.

그런 후 디버깅 시에 280 라인에서 프로그램이 멈추면 디버깅 창의 “자동(Watch) ”창에서 nn0 변수를 찾은 후 값을 원하는 값으로 변경한다.




nn0의 값은 원래는 53 이었으나 이제 60으로 변경 되어 이후 60으로 설정 되어 프로그램에서 사용된다.


 

위 그림의 코드를 보면 알겠지만 위 코드는 화면에 글자를 찍기 위한 코드인데 화면에서 글자를 찍을 때 위치에 맞게 하기 위해서 x,y 좌표를 변경하면서 결과를 바로 보기 때문에 아주 빠르고 쉽게 작업이 된다.

출처 : 
http://jacking.tistory.com/301

 

반응형
Posted by blueasa
, |
Tortoise SVN Client 에서 아이디 비밀번호를 변경하고 싶은데요.. 

안녕하세요.

Tortoise SVN Client 을 사용하다 궁금한 점이 있어서 질문하게 되었습니다.

얼마전에 SVN Server 에서 담당자분이 아이디랑 패스를 지워버려서 새로운

아이디랑 패스워드를 발급 받았습니다.

근데 SVN Client 에서 바뀐 아이디랑 패스로 변경하고 싶은데 도대체 어디서 바꿔야

할지 통 모르겠습니다.

셋팅 메뉴에 보면 정보를 Clear 하는게 있던데 그걸 해야 되는건가요?

지금 사용중인 서버라서 괜찮을지 궁금합니다.

고수님들 알려주세요.

    
Tag  
tag는 게시물의 성격을 나타내는 키워드를 입력하는 공간입니다. 
tag는 로그인 후 사용하실 수 있습니다.
  • 제가 쓰는게 일본어판이라 확실하진 않습니다만... 
    오른쪽 버튼 클릭 - 설정 - (메뉴중에서)보존데이터 누르시면 오른쪽에 
    인증데이터 클리어 버튼이 있을겁니다. 
    그거 누르시고 다시 서버에 접속하려 하면 비번이랑 아이디 물어볼꺼에요.



출처 :  
http://www.okjsp.pe.kr/seq/130437
반응형

'Tip & Tech' 카테고리의 다른 글

메모리 릭 잡기  (0) 2011.05.09
디버거로 프로그램 실행 도중 변수 값 조정 방법  (0) 2011.04.29
DLL 사용한다면 참고하세요  (0) 2011.04.19
미들웨어 정리  (0) 2011.04.13
타격감 향상을 위한 방법론  (0) 2011.03.17
Posted by blueasa
, |
DLL을 사용한다면 참고하시라고 몇자 적어봅니다.

 아미 몇번 DLL을 써 보셧다면 다 아시는 내용일겁니다.

 1.  한 프로그램에 쓰인 클래스를 다른 프로그램에서도 같이 써야 할 일이 생겨서, 그냥 소스만 복사해넣고 좀 고쳐서 놓고 쓰니 불편하더군요.. 그래서 DLL 형태로 공유하는 엔진을 만들어서 Static 링크를 시도했읍니다.

  이때 DLL 만들때 제일 먼저할 것은 DLL 생성한 후에  프리컴파일 디파인 에 _AFXEXT 와 _NOWCOMPILE 을 넣어주는 것입니다.  _NOWCOMPLIE 이란 항목은 나중에 컴파일을 위한 옵션입니다.
 
     Project -> Setting ->  C/C++  에서  추가해 줌..

  다음 클래스 이름을 외부에서 호출할 수 있도록

 class AFX_EXT_CLASS  myClass { ...}  로만 선언하고

 헤더파일에 

#if !defined(_NOWCOMPILE)
#if defined(_DEBUG)
    #pragma comment(lib, "..\\myDLL\\debug\\myDLL.lib")
#else
    #pragma comment(lib, "..\\myDLL\\release\\myDLLD.lib")
#endif
#endif

 
 _NOWCOMPLE 옵션은  헤더파일 포함시 LIB가 같이 포함되도록 하는 용도의 플래그 입니다.
 DLL 컴파일시에만 포함되지 않도록 하기 위해서 DLL 프로젝트에만 _NOWCOMPILE를 추가하는 것이죠.

 
 2. 릴리즈 와 디버그 DLL 버전 관리..
 릴리즈와 디버그 버전을 관리하고자 한다면,   제일 먼저 할 일은  .def 파일을 두개로 만들어서 그중 하나에서 디버그용 이름으로 변경해 놓는 것입니다.  제 경우 D를 추가해 놓죠.
 
    Project -> Setting ->  Link  에서 def  이름 지정된 것을 변경해 줍니다.
 
 이 작업이 빠지면, 디버그 와 릴리즈 버전 이름이 같아서 혼동이 생기게 됩니다.


 3. 버전에 따른 리소스를 다르게?

  버전에 따라서 리소스의 버전을 다르게 만들고 싶어질 경우가 있읍니다.
  좀 귀찮아서 써 봤는데.. 
  이경우    Project -> Setting ->  Resource 에서  프리컴파일 디파인을 지정해 줄 수 있읍니다.
  그러면 RC 파일을 편집해서  조건을 지정할 수 있지만, 여기에 가장 큰 문제는
  리소스 에디터에서 변경을 하게되면 조건 걸린 부분이 날라갑니다.
 결국 별도 파일로 만들어서 #include 시켜서 써야 했죠.
 제경우 bmp 이미지를 몇개를 버전에 따라서 다르게 보이도록 하기 위해서 설정한 것입니다.


 4.  다이나믹 DLL  사용

 먼저 DLL을 만들고, DLL에서 사용하는 함수를 호출 할 수 있도록 선언합니다.
 
extern "C" __declspec( dllexport ) void  InitPage(CString arg1,CString arg2)
{
   CMyDlg dlg;
   dlg.DoModal();
}

  CMyDlg dlg 라는 것이 DLL 내부에 만들어진 다이알로그 입니다.
 

 DLL 의 InitPage 를 호출하는 부분

void CallDll()
{
HINSTANCE hInst,oInst;
#ifdef _DEBUG
    hInst=AfxLoadLibrary("myDLLD.dll"); // 디버그 버전
#else
    hInst=AfxLoadLibrary("myDLL.dll"); //릴리즈 버전
#endif
    if (!hInst)
    {
        AfxMessageBox("DLL Load 에러!");
        return;
    }
    typedef void ( * INITPAGE)(CString,CString);
    INITPAGE func;
        func=(INITPAGE)GetProcAddress(hInst,"InitPage");
    if (func)
    {
        oInst=AfxGetResourceHandle();
        AfxSetResourceHandle(hInst);
        func("테스트","테스트1");
        AfxSetResourceHandle(oInst);
    }
    AfxFreeLibrary(hInst);
 
}

 이렇게 사용하면 됩니다.
 여기서 리소스 핸드를 바꿔주고 복구하는 것이죠
 여기서 중요한 포인트는     typedef void ( * INITPAGE)(CString,CString); 입니다.
 DLL 과 함수 선언이 동일해야 합니다. 저의 실수는 처음에 만들때     typedef bool  ( * INITPAGE)(CString,CString); 로 해 놓고 컴파일하니 이상없이 동작 잘 하더군요,  DEBUG 버전에서 릴리즈 버전으로 바꾸어서 테스트 하니  스택에 오류가 생기더군요.. 무엇이 원인인가.. DLL 함수 선언이 문제인가 하고 이것 저것 고민하면서 테스트 했는데,  결론은 DLL 의 평션에서는  void 였는데,  콜할때 선언은 BOOL 로 해서 ,   릴리즈 버전에서 스택에서 리턴값을 클리어하느라 에러가 났던 것입니다.
  반듯이  DLL 과 사용하는 함수의 선언은 리턴값까지 일치 시켜야 합니다.  파라미터에 신경쓰다가 실수한 부분입니다.

 
 5. 다이나믹 DLL 의 해제 시점..

  DLL의 함수에서 메모리 할당을 받았다면,  DLL 의 해제 시점(AfxFreeLibrary 호출 시점)은   메모리 해제한 이후에 해야 합니다.
  무슨 소리냐면, DLL 함수에 구조체를 보내서, DLL에서  구조체의 데이타를 Free 시키고, 새로 할당해서 데이타를 채워서 리턴시키는데,  이것을 Free 하는 시점에서 계속  힙이 깨졌다는 오류가 나오더군요.
 원인 파악을 하기 위해서 6시간정도 고생을 했는데, 결국 DLL 해제 시점을 옮김으로서 해결되더군요.
 만약 DLL 에서 뭔가를 가져왔다면,  반납하기 전에는 DLL을 해제하지 마세요..
 시스템 크래시와 부딪힐 수 있읍니다.


 

 이상입니다.
 과연 몇분에게나 도움이 될런지.....

ps:
 쓰레드간 통신에서  SendMessage 를 가지고 동기화를 하게 되는 경우,  데드락 걸릴 수 있는 여지가 있읍니다.
 그걸 해결하는 방법은 SendMessageTimeout 이란 평션을 사용하면 어느정도 해결됩니다.
 단 메세지 전송되는 핸들이 서로다른 쓰레드일 경우에만 효과가 있다고 하더군요.
 여기 Q/A 에 있는 정보 입니다.


출처 : 
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=4722&ref=1602
반응형
Posted by blueasa
, |

미들웨어 정리

Tip & Tech / 2011. 4. 13. 11:46

[웹사이트][미들웨어] / [제작사] / [설명]


[그래픽]

Speedtree Solution /  Interactive Data Visualization / 나무 생성 
http://www.speedtree.com/

Enlighten / Geomerics / Global illumination, radiosity, ray tracing, soft shadows and many lighting/shading/shadowing optimized technniques middleware 
http://www.geomerics.com/

ProFX / Allegorithmic /Procudually textures middleware
http://www.profxengine.com

Digimask SDK / Digimask / Digital facial model making system middleware
http://www.digimask.com/

 

 

[물리]

Havok Physics SDK / Havok / 기존 플랫폼과 차세대 플랫폼 기반으로 실시간 물리 현상 구현을 위한 SDK
http://havok.com

AGEIA PhysX SDK / AGEIA Technologies/ 물리 모델링 SDK
httP://www.ageia.com

 

[관리]

Umbra / Umbra Software / Scene graph optimized middleware
dPVS /  Umbra Software / Scene graph, optimized middleware
sPVS / Umbra Software / Scene graph, optimized middleware
http://www.umbra.fi/


[비디오]

Bink  / RAD Game Tools / in-game video and movies middleware
http://www.radgametools.com

 

[특수효과]

Havok FX SDk / Havok / 특수효과 미들웨어 라이브러리
http://havok.com


[사운드]

FMOD / Firelight Technologies / 음악 & 사운드효과 시스템
http://www.fmod.org

OpenAL / Creative Labs's/ Audio System
http://www.openal.org

Ogg Vorbis / Xiph / Audio System
http://www.vorbis.com

Miles / RAD Game Tools / 3D 사운드를 지원하는 사운드 시스템
http://www.radgametools.com

 


[애니메이션]

EmotionFX / Mystic Game Development / 게임 개발자용 캐릭터 애니메이션 미들웨어
http://www.emotionfx.com

Havok Animation SDK / Havok / 기존 플랫폼과 차세대 플랫폼 기반 실시간 렌더링을 위한 빠르고 유연한 애니메이션 SDK 
http://havok.com

Granny / RAD Games Tools / 캐릭터 렌더링 엔진
http://www.radgametools.com

 


[네트워크]

Rendez-Vous / QUAZAL / 네트워크 엔진

Spark/  QUAZAL / 네트워크 엔진 
http://www.quazal.com

 


[인공지능]

Kynapse A.I. / Kynogon SA / 인공지능 middleware
http://www.kynogon.com

AI Implant / Engenuity Technologies / 인공지능 middleware
http://www.ai-implant.com

 
[출처] 미들웨어 정리|작성자 FlowEJ

반응형
Posted by blueasa
, |

 

 우선적으로  천몽(iliyard)님이 올리신 내용을 기초로 하여 필요부분을 추가 서술했음을 알려드립니다.

 

 1.    Overview

· 타격감이란??..

  말 그대로 게임내에서 유저가 상대방을 때릴 때나 피격시 느낌을 얼마나 잘 받을수 있게 해주는가를 말하는 것. 이 타격감을 향상 시키기 위해서는 여러가지

  요소가 있는데 각 요소들 완성도를 높여 타격감을 극대화시키는데 중점을 둔다.

 

2.    Animation

    2.1 공격 동작

        2.1.1 무기에 따른 적절한 동작

                ·무기의 종류에 따라 적절한 동작을 해야 한다. , 무기가 칼이냐 도끼냐에 따라 공격 애니메이션이 틀려야 한다.

 

        2.1.2 중량감 표현

                ·같은 무기더라도 어떤 타입이냐에 따라 그 무게가 달라진다. 단검처럼 가벼운 무기는 움직임도 가벼워야 하고 양손 무기처럼 무거운 무기는 

                   움직임에 무게감이 느껴져야 한다. 즉 무게의 차이는 공격속도와 밀접한 관계를 가진다.

 

        2.1.3 속도의 완급 조절

                ·공격을 할때에는 단순히 휘두르기만 하지 않는다. 2.1.2 중량감 표현에서도 설명했듯이 각 무기별로 무게가 다르기때문에 공격 준비동작이나

                    공격시 동작이 각각 다른 속도및 다른 가속도를 가지고 있다.  

                    단검의 경우 무게가 가볍기 때문에 준비동작 자체가 굉장히 짧고, 공격속도로 일정하며, 양손검이나 양손둔기같이 무거운 무기류는 무거운 무게 

                    때문에 준비동작이 긴 반면 가속도는 점점 빨라지게 된다. 

 

    2.2  피격 동작

             ·가장 이상적인 피해 동작은 모든 공격에 대해 대응하는 동작이 있는 것이다. 하지만 그러기엔 게임제작상 리소스가 너무 많이 필요하니 타입에

                따라 몇가지로 축소한다. 보통 2종에서 4종(단순피격, 크리티컬피격, 스턴, 넉백)으로 줄여서 표현하는 경우가 많다.

 

        2.2.1 방향

             · 왼쪽, 오른쪽, 중앙, 후면에서 힘이 가해졌다는 느낌이 들도록 각각의 피격 동작을 만든다.(이 또한 리소스 제약상 줄여서 표현하는 경우가 많다.)

             · 중앙인 경우는 찌르기 공격이나 원거리 공격에 대한 피해 동작으로 맞춰 만든다.

 

        2.2.2 데미지 세기

             · 크리티컬 데미지나 특정 스킬 공격을 받았을 경우에는 뒤로 날라가서 넘어지는 동작(넉백)을 만든다.

 

   3. 프레임 정지

        · 주로 대전 격투류 게임에서 많이 표현되는 표현방법. 타격시 일정프레임을 정지시킨후  다시 그 다음 애니메이션시 정지된 프레임시간부터 나머지

               애니메이션 시간만큼을 빠르게 돌리는 방법. 잠깐의 프레임동안 정지되어 있어서 타격이나 피격에 대한 인지가 강하게 되며, 후에 정지되어 까먹은

               프레임만큼 빨리 돌리더라도 시각적으로는 빠르다고 인지하기가 어렵다. (물론 정지시간이 많으면 인지가 됨 ^^)

 

3.    이펙트

    3.1. 궤적(Trail)

         · 실제 세계에서 칼의 움직임은 연속적이지만 게임에서 칼의 움직임은 비연속적인 칼의 위치들을 나타내는 프레임들을 모아놓은 것이다. 따라서 빠른

             공격 애니메이션의 경우 칼이 움직임이나 어떤 부위를 공격하고 있는지 알아내기란 쉽지 않다. 특히 게임플레이시 FrameRate(초당 프레임수)

             에도 많은 영향을 받는다. 다음과 같은 궤적 효과를 사용함으로써 칼의 움직임이나 공격의 영향이 미치는 범위를 보여준다.

         · 궤적을 나타내는 방법에는 메쉬, 파티클, 왜곡효과및 혼합하여 사용경우도 많다. 

 

 


 

       3.2 파티클(Particle)

               · 대부분의 이펙트에 적용되는데 마법류표현에서 더 많이 쓰인다. 

 

[공격의 방향을 나타내기 위한 2D 파티클 - 피표현- ]

 

 


 


 

 [공격 이펙트]

 

 

         3.3 광원[Light)

                 · 적을 가격하거나 피격 당하는 순간 캐릭터의 타격 지점 & 지형에 광원을 표현 함으로서 타격감을 증진시키는데 중요한 역할을 한다.

                      타격감을 표현하는데 있어서 필수적인 요소중 하나다. 하지만 광원표현은 실시간 계산이 이루어져야 하는만큼 게임 플레이시 상당한

                      포퍼먼스를 요구한다. 고사양을 지향하는 게임이면 모를까 저사양을 고려한 게임이라고 한다면 표현의 한계를 가진다.


 

        3.4 위치

             · 타격 이펙트중 피격자의 몸에서 나타나는 이펙트의 위치는 무기와 피격자가 부딪히는 부분에서 터지게 한다. 이때 그 위치를 계산하기

                 어렵다면 공격 종류에 따라 그 위치를 미리 정해놓는다.

 

        3.5 타이밍

             · 타이밍을 맞추는데는 두 가지 방법 프레임 체크와 시간 체크가 있다.(개발사마다 기준이 다르다.) 

             · 그러나 프레임 체크 방식이 시간 체크 방식보다 정교 하므로 가능한한 프레임 체크 방식(1초=30프레임)으로 한다.

             · 현재 설명중인 모든 요소들이 이 타이밍이 서로 맞지 않으면 어떠한 타격감도 얻을수 없다. 타격위치, 시간, 반응등 모든것이 각기 적절한

                  타이밍 속에서 빛을 발한다.

 

           3.5.1 프레임 체크

                 · 보통 Collision Box를 이용하여 무기가 피격체에 닿았을때 자동으로 필요 이펙트를 표현해 주기도 하지만 이는 플레이시 항상 계산을

                      하고 있어야 하기 때문에 많은 퍼포먼스를 요구한다. 그리하여 공격자의 공격 애니메이션 총 20 프레임이라고 할 때 15 프레임이 무기가

                      적에게 닿는 프레임이라고 하면 그 순간 이펙트를 터트려 주는 방식으로 하여 퍼포먼스를 줄이기도 한다.   

           3.5.2 시간 체크

                 · 프레임 체크방식과 개념은 같다. 공격자의 공격 애니메이션 총 20 프레임이라고 할 때 15 프레임이 무기가 적에게 닿는 프레임이라고

                      하면 1 프레임에서 15 프레임까지의 사간을 계산해서 0.7초라고 한다면 애니메이션이 시작 한 후 0.7초가 지난 다음에 이펙트를 터트려

                      주도록 한다.

 

4. Sound Effect

 · 사운드 효과는 타격감을 살리는데 매우 중요한 역할을 하는데 공격자의 무기 종류와 피격자의 보호구에 따라 그 효과음이 달라져야 한다.

 

 

5. 카메라

    5.1 카메라 흔들기(Camera Shake) 

          · 짧은 시간안에 화면을 랜덤하게 흔들어 주는 방법인데 강력한 공격(크리티컬 데미지)이나 폭발을 일으키는 공격시에 이용한다.

              보통 영화나 미디어의 연출시 많이 사용하는 방식이었으나 게임산업이 발전함에 연출을 강조하는 추세이니 만큼 Camera Shake표현

              또한 많이 해주고 있다. (CameraShake에 대해서는 따로 게시예정)

 

    5.2 카메라 전환(Camera Move)

         · 무기의 중량감이나 강력함, 공격 방향등 공격 효과를 좀 더 극대화 시키기 위한 방법이다.

         · 거대한 검을 수평 방향 왼쪽으로 휘드르게 될 때 그 검이 적에게 맞는 순간 카메라를 왼쪽으로 약간 이동시킨다. 위로 솟구쳐 올리는

             공격일 경우에는 카메라를 위로, 수직 방향으로 내려치는 공격일 경우에는 카메라를 아래로 약간 이동시킨다.

 

6. 동기화(Sync)

        · 위에서 설명한 타이밍과 유사하다고 할수 있다. 하지만 위의 타이밍은 각각의 동기화라고 한다면 현재 설명하는 동기화는 연출전체의

             타이밍이라고 보면 이해가 빠를것이다. 예를 들어 A라는 캐릭터 B라는 몬스터를 공격하는데 A가 공격이 끝나기도 전에 몬스터가

             맞는 동작을 취한다거나 A가 공격 했는데도 불구하고 한 템포 느리게 반응한다면 타격감을 느끼기 힘들다.

        · , 액션이 취해지면 그에 따른 피드백의 타이밍이 적절해야 한다. 이를 위해서는 클라이언트쪽에서의 어느 정도의 연출이 필요하다.

             예를 들어 A B를 때리는 동작에 들어갈 때 서버에 공격 메시지 패킷을 보내면 서버에서는 B가 입는 데미지를 계산하여 클라이언트에

             보내주는데 이때 A의 공격 동작이 다 끝나기도 전에 데미지 패킷이 도착한다면 클라이언트는 데미지를 바로 적용시키는게 아니라 이걸 보관

             하고 있다가 A의 공격 동작에 맞춰서 이펙트와 함께 B는 맞는 동작을 취하며 에너지가 깎이는 식이다.

 

7.    기타

    7.1 데미지 표현

        · 데미지를 입거나 입혔을 때 얼마만큼의 데미지를 입혔는지를 알려주는데 데미지 수치 또한 연출이 필요하다.

            (UI 연출 이펙트로 명명하는 경우가 많다.) 

        ·애니메이션이나 이펙트는 임펙트있게 표현되는데 실제 데미지 수치는 밋밋하게 그냥 뜬다면 좀 뭔가 부족하지 않은가?

     7.2 반전 (Invert)

        · 타격이나 피격시 좀 더 명확하게 인지 하기 위하여 인위적으로 캐릭터나 배경전체의 색을 반전시키는 기법을 말한다.

 

[캐릭터 반전기법의 예]

    7.3 배경블랜딩

       · 이펙트는 주로 어두운 배경에서 그 화려함이 가중된다. 하지만 밝은 캐주얼느낌의 게임이나 한낮의 밝은 필드에서 전투시 이펙트를 화려하게 표현한다

             해도 하얗게 색이 발해버리는 경우를 본적이 있을것이라 생각한다. 이와 같은 경우를 줄이기 위해서 일부러 마법사 같은 법사캐릭의 경우 스킬

             시전시 자신의 캐릭터나 피격되는 캐릭을 제외한 나머지 요소에 대해 일시적으로 어둡게 톤을 낮추어 이펙트 표현 뿐만아니라 시각적으로 집중도를

             높혀 타격감을 배가 시키는 방법이다.

 

타격감에 대해 글을 써보려 했는데 마침 천몽님의 글을 발견하여 더 쉽게 글을 쓸수 있었던듯 하다.

이펙터라면 이런 타격감의 종류와 표현 방식에대해 어느 디자인 파트보다 더 자세히 알고 있어야 한다고 생각한다.

추후 이 타격감요소에 대해 각각 상세 예시를 올려보겠습니다. 

반응형

'Tip & Tech' 카테고리의 다른 글

DLL 사용한다면 참고하세요  (0) 2011.04.19
미들웨어 정리  (0) 2011.04.13
예외 처리 ~~ tip  (0) 2011.02.08
디버깅 메세지 출력 매크로 수정판  (0) 2011.01.31
GPG 명예의 전당.베스트 오브 베스트  (0) 2011.01.21
Posted by blueasa
, |