NDC 2010 발표자료 - 마비노기 영웅전 개발 포스트모템
'Etc' 카테고리의 다른 글
| [M/V] Sunshine Girl (0) | 2011.03.31 |
|---|---|
| 저렴한 거북목 피는 스트레칭 (0) | 2011.02.12 |
| [펌] Getter/Setter 없는 삶 (0) | 2010.11.10 |
| 집에 돌아오면 아내가 죽은척을 해요... (0) | 2010.10.28 |
| [펌] 프로그래머에 관한글 (0) | 2010.10.25 |
| [M/V] Sunshine Girl (0) | 2011.03.31 |
|---|---|
| 저렴한 거북목 피는 스트레칭 (0) | 2011.02.12 |
| [펌] Getter/Setter 없는 삶 (0) | 2010.11.10 |
| 집에 돌아오면 아내가 죽은척을 해요... (0) | 2010.10.28 |
| [펌] 프로그래머에 관한글 (0) | 2010.10.25 |
| Delta3D API Documentation (0) | 2011.01.25 |
|---|---|
| Gamebryo 관련 사이트 (0) | 2011.01.21 |
| C# 배움터 (0) | 2010.12.23 |
| Download D3DX DLLs (d3dx9_xx.dll, d3dx10_xx.dll) (0) | 2010.12.23 |
| 종이천하 (0) | 2010.12.20 |
Visual C++ (.NET 기준)에서 디버깅 시 유용하게 사용할 수 있는 컴파일옵션들을 정리해 보았습니다. 하나하나 다 외우질 못해 프린트해서 그때그때 사용하고 있습니다. ^^
도움이 될 지 모르겠네요.
| /EP /P | C/C++ | Preprocessor | Generate Preprocessed
File (파일전처리) |
전처리 코드에 대한 내용을 소스파일.i 파일로 볼 수 있다. |
| /C | C/C++ | Preprocessor | Keep Comments (주석유지) |
위를 설정하고 이것도 설정하면 선택하면 전처리코드 위의 주석도 유지하면서 보여 줄 것이다. |
| /X | C/C++ | Preprocessor | Ignore Standard Include Path (표준 포함경로무시) |
표준 인클루드 경로 무시 |
| /Zp | C/C++ | Code Generation | Struct Member Alignment (구조체 맴버 맞춤) |
#pragma pack 지시자를 사용하는 것이 더 좋을 것 같다. |
| /Wp64 | C/C++ | General | Detect 64-bit Portability Issues (64비트 이식성 문제 검색) |
나중 64비트 호완성을 돕기위해 설정을 해 두는 것이 좋다. |
| /RTC | C/C++ | Code Generation | Smaller Type Check (작은 형식 검사) |
/RTCc : 값을 작은 데이터 형식으로 변환할 때 데이터손실이 없는 지 검사한다. |
| Basic Runtime Checks (기본 런타임 검사) |
/RTCu : 초기화되지 않은 변수참조를 추적한다. /RTCs : 모든 지역변수들을 0xCC로 초기화 하여 훌륭한 스택 프레임 검사가 로컬변수 언더런과 오버런을 감지하고 스택 충돌에 대해서 스택 포인터를 검증하도록 한다. /RTCsu : 위의 두개 모두 포함 |
|||
| /GS | C/C++ | Code Generation | Buffer Security Check (버퍼 보안 검사) |
바이러스 작성자들의 가장 일반적인 공격인 리턴주소를 악성코드로 리다이렉트 할 수 있도록 하는 버퍼오버런공격을 막아주는 것이다. |
| /O(num) | C/C++ | Optimization | Optimization (최적화) |
/O1(크기최소화), /O2(속도최대화:디폴트) 마이크로소프트 제품은 모두 /O1으로 컴파일..이것으로 컴파일 할 때 같이 SWS(Smooth Working Set)유틸리티를 사용해서 공통적으로 사용하는 함수들을 앞으로 배치되도록 해야 한다.(속도도 높이기 위해) |
| /GL | Main | General | Whole Program
Optimization (전체프로그램최적화) |
설정하면 링커스위치에 /LTCG(밑에 참조 바람)를 설정 |
| /showincludes | C/C++ | Advanced | Show Includes (포함 파일 나열) |
컴파일 할 때 포함되는 include 파일들이 어떤 위치의 것인지를 Output 화면으로 모두 보여준다. |
| /MAP | Linker | Debugging | Generate Map File (맵파일 생성) |
맵파일을 생성하는 스위치로 유용한 정보를 얻기위해서는 모두 사용해야 한다. |
| /MAP:LINES | Linker | Debugging | Map Lines (맵파일에 줄 번호 정보 포함 |
|
| /MAP:EXPORTS | Linker | Debugging | Map Exports (맴파일에 익스포트 함수정보 포함) |
|
| /NODEFAULTLIB | Linker | Input | Ignore All Default Libraries (라이브러리 무시) |
많은 시스템 헤더파일들이 어떤 파일이 링크되는지 지정하기 위해 #pragma comment (lib#,립이름)을 포함하는데 이를 모두 무시하도록 지시한다. |
| /OPT:NOWIN98 | Linker | Optimization | Optimize for Windows98 (Windows98에 맞게 최적화) |
98,ME를 지원하지 않는 다면 설정하는 것이 좋다. 응용프로그램의 크기를 줄일 수 있다. |
| /ORDER | Linker | Optimization | Function Order (함수에 순서 지정) |
SWS(Smooth Working Set) 을 실행한 후 함수의 순서를 포함하고 있는 파일을 지정할 수 있다. |
| /VERBOSE | Linker | General | Show Process (진행 메시지 표시) |
링크되는 라이브러리의 모든 진행 메세지를 표시 |
| /VERBOSE:LIB | Linker | General | Show Process (진행 메시지 표시) |
검색된 라이브러리만 나타내는 진행 메세지를 표시 |
| /LTCG | Main | General | Whole Program
Optimization (전체프로그램최적화) |
/GL스위치와 짝을 이룬다. 링크시간코드를 생성. |
| /RELEASE | Linker | Advanced | Set Checksum (체크섬 설정) |
별로 사용되지 않지만 WinDBG를 사용할 때 책섬을 조사할 때 필요하기 때문에 미리 넣어 두는 게 좋다. |
| /PDBSTRIPPED | Linker | Debugging | Strip Private Symbols (전용 기호 제거된 심볼) |
스택을 탐색하고 해독하기 위해서 필요한 특별한 Frame Pointer Omission(FPO) 데이터를 PDB파일에 포함시키기 위해 설정한다. 각종 변수나 소스 줄정보는 빼고 필요한 FPO데이터와 공용함수들만 남겨놓는다(stripped PDB파일). 이것과 함께 일반 PDB 파일을 같이 생성할 수 있다. 나중에 Dr.Watson 등에서 PDB파일을 로드할 수 있기 위해서는 파일명을 어플리케이션 명과 같게 해줄 필요가 있다. |
[출처] 디버깅에 도움을 주는 컴파일러와 링커옵션 정리|작성자 히댕이
| lib 충돌 관련해서.. 어떤것이 충돌되었는지 확인하는 옵션 (0) | 2011.02.08 |
|---|---|
| link error 해결 방안 모색 (0) | 2011.02.08 |
| (에러) C++ 프로젝트에서 Intellisense문제 해결 항목을 참조하십시오. (0) | 2011.01.06 |
| Visual Studio 도구상자 아이콘 깨짐현상 해결법(VS IDE 리셋) (2) | 2010.11.25 |
| 릴리즈 모드로 build 된 프로그램의 디버깅 (0) | 2010.10.14 |
//////////////////////////////////////////////////////////
//VC++의 출력창을 이용한 디버깅 수단1
#include <Windows.h>
//void main()...
OutputDebugString(msg); //VC출력창에 문자가 출력 된다.
//////////////////////////////////////////////////////////
//별도의 Console창을 이용한 디버깅 수단2
//void main()...
AllocConsole(); // 콘솔창 만든다.
char strBuffer[256]="";
DWORD(또는 size_t) dwWrite;
HANDLE
m_hOut = GetStdHandle(STD_OUTPUT_HANDLE);
// 콘솔창의 핸들 가져옴.
WriteConsole(m_hOut, strBuffer, strlen(strBuffer), &dwWrite, NULL);// 콘솔창에 쓸때
FreeConsole(); // 콘솔창을 없앰.
//////////////////////////////////////////////////////////
//별도의 Console창을 이용한 디버깅 수단3
#include <stdio.h> //또는 #include <iostream>
//void main()...
AllocConsole();
freopen("CONOUT$", "wt", stdout ); //이것을 사용하면 출력함수 사용이 가능하다
printf(""); //또는 std::cout << "";
FreeConsole();
//////////////////////////////////////////////////////////
//별도의 Console창을 이용한 디버깅 수단4
//단 WinMainCRTStartup은 컴파일이 되기전에는 생성되지 않으므로 컴파일 후
삽입해주자
#pragma comment(linker,
"/entry:WinMainCRTStartup /subsystem:console")
#include <stdio.h> //또는 #include <iostream>
//void main()...
printf(""); //또는 std::cout << "";
[출처] 콘솔,출력창을 이용한 실시간 디버깅|작성자 나르메
| GPG 명예의 전당.베스트 오브 베스트 (0) | 2011.01.21 |
|---|---|
| 안전하고, 좋은 냄새가 나는 C++ 코드 만들기 (0) | 2011.01.13 |
| 유용한 전처리기 (0) | 2011.01.07 |
| 게임브리오엔진에서 성능 향상을 위한 방법들.. (0) | 2010.12.20 |
| [VSGesture] - Visual Studio 마우스 동작 인식 추가기능 (2) | 2010.12.06 |
전처리기.
프리컴파일러(Free가 아니다 : PreCompiler)
프로그래머들이 자주 쓰는 전처리기 기능 3가지만 소개하고자 한다.
이것은 쓰라고 강요하기보단 다른 사람(그사람이 현업에서 근무할 가능이 높으므로) 코드를 이해하는데
조금이나마 도움을 주기 때문이다.
#pragma comment()
ex)
#pragma comment(lib, "dxguid.lib")
Project -> Setting -> Link(단축키:ALT+F7)에서 "dxguid.lib"와 "ddraw.lib"와 같은 lib파일을
링크해야 하는 과정을 대신해준다.
#pragma warning ()
ex)
#pragma warning (disable:4244)
4244의 경고 메세지를 출력창에 안보이도록 해준다.
참고로 4244는 무리한(캐스팅연산자가 없이하는) 형변환에 대한 경고이다.
#pragma message()
ex)
#define _QUOT(x) # x
#define QUOT(x) _QUOT(x)
#define OutputMessage(x)
message( __FILE__ "(" QUOT(__LINE__) ") : " #x )
void main()
{
#pragma OutputMessage(하하하)
}
위모양대로 했을경우 컴파일러 출력창에 메세지를 출력해주며 파일과 라인번호를 입력하면
에러났을때 처럼 링크기능이 있다.
cpp의 컴파일 순서를 체크(물론 VC에서는 이에 해당하는 기능도 제공한다)해볼때 유용할거 같다.
| 안전하고, 좋은 냄새가 나는 C++ 코드 만들기 (0) | 2011.01.13 |
|---|---|
| 콘솔,출력창을 이용한 실시간 디버깅 (0) | 2011.01.07 |
| 게임브리오엔진에서 성능 향상을 위한 방법들.. (0) | 2010.12.20 |
| [VSGesture] - Visual Studio 마우스 동작 인식 추가기능 (2) | 2010.12.06 |
| VC++ 버전별 배포방법과 재배포패키지(Redistributable Package) (1) | 2010.12.06 |
*게임브리오 설치 전에 VS 2005를 사용시 반드시 서비스팩1를 설치
(매니패스트 관련 에러가 난다면 버그로 인해 재배포가 안되어서 에러가 나는 것이므로 꼭 패치해야 한다.)
- 추가 라이브러리
NiMesh.lib NiApplication.lib NiSystem.lib NiMain.lib NiInput.lib NiFloodgate.lib NiDx9Renderer.lib NiAnimation.lib




NiEmbedGamebryoLicenseCode;
{
/*
new -> NiNew
delete -> NiDelete
*/
return NiNew CGameApplication;
}
: NiApplication("Game ver 0.1", DEF_SCREEN_WIDTH, DEF_SCREEN_HEIGHT)
* 잠시! 헤더에 대한 설명
NiApplication.h
: public NiMemObject 가 하고 있다. -> 게임브리오가 질접적으로 메모리를 관리하기 위해 사용되고 있는 것
NiRefObject.h
: 참조를 관리해주는 것으로 이것을 상속받고 있는건 참조에 따라 자동삭제를 하기 위해서임(게임브리오에서 쓰는 스마트포인터 같은..)
NiMeshScreenElements.h
: 2D관련해서 작성할 때 추가
NiMesh.h
: 3D관련







{
unsigned int uiWidth = m_pkAppWindow->GetWidth();
unsigned int uiHeight = m_pkAppWindow->GetHeight();
NiDX9Renderer::USE_NOFLAGS, GetWindowReference(),
GetRenderWindowReference());
{
NiMessageBox("Unable to create a renderer!", "Renderer Failure!");
QuitApplication();
return false;
}
return true;
}

//--직접적으로DirectX를제어하고싶을때
NiRenderer* renderer = m_spRenderer;
NiDX9Renderer* pDX9Renderer = ((NiDX9Renderer*)renderer);
LPDIRECT3DDEVICE9 pp =pDX9Renderer->GetD3DDevice();
-> 스마트 포인터 때문에 NiRenderer* 포인터로 한번 받아온다.
출처 : http://blog.naver.com/fantaldh/40067964992
[출처] Gamebryo 셋팅|작성자 대봉이
| 무기잔상효과 (0) | 2011.02.08 |
|---|---|
| 캐릭터 기울기 연산 (0) | 2011.02.08 |
| 게임브리오 강좌(?) 링크 (3) | 2010.04.14 |
| Gamebryo 2.5 (0) | 2010.04.12 |
| [링크] 게임브리오 강좌 (0) | 2010.04.10 |
VS도움말에도 나와있는 내용이지만 프로젝트가 거대해지면 어쩔 수 없이 헤더파일이 이리저리 엉키고 중복선언하게되는데, 그렇게되면 잘 작동하던 Intellisense가 갑자기 작동하지 않고 상태표시줄에 아래와 같은 메시지가 뜨는 것을 볼 수가 있다.
![]()
그림 1 : 에러메시지. (Intellisense가 정상작동하는데도 .또는 ->가 뒤바뀌어서 같은 메시지가 뜨는 경우도 있다. )
사실 아래와 같은 Intellisense가 뜨는게 정상인데 말이다.

그림 2 : Intellisense
이럴 땐 VS를 종료하고 프로젝트폴더 안을 보면 프로젝트명.ncb의 파일이 존재하는데 가차없이 삭제해주고 VB를 재실행하면 해결된다.
(레퍼런스)----------------------------------------------------------------------
Visual Studio 도움말
-----------------------------------------------------------------------------
| link error 해결 방안 모색 (0) | 2011.02.08 |
|---|---|
| 디버깅에 도움을 주는 컴파일러와 링커옵션 정리 (0) | 2011.01.07 |
| Visual Studio 도구상자 아이콘 깨짐현상 해결법(VS IDE 리셋) (2) | 2010.11.25 |
| 릴리즈 모드로 build 된 프로그램의 디버깅 (0) | 2010.10.14 |
| 디버깅을 위한 컴파일러 옵션 조정과 디버깅 활용. (0) | 2010.10.14 |
#################
컨테이너 종류
#################
표준 STL 시퀀스 컨테이너 : vector, string, deque, list
표준 STL 연관 컨테이너 : set, multiset, map, multimap
비표준 시퀀스 컨테이너 : slit, rope
비표준 연관 컨테이너 : hash_set, hash_multiset, hash_map, hash_multimap
string 대한 vector<char>
표준 연관 컨테이너 대신 사용 되는 vector
STL에 속하지 않는 표준 컨테이너 : 배열, bitset, valarray, stack, queue, priority_queue
-------------------------
연속 메모리 컨테이너
-------------------------
삽입 삭제시 메모리가 밀려 지거나 땡겨 지는 컨테이너(무효화!!! <-- 특히 이넘을 조심 해야 함.)
vector, string, deque.
---------------------
노드 기반 컨테이너
---------------------
삽입 삭제시 메모리 포인터만 영향을 받음. 밀리는 현상 없음.
list, slist, set, multiset, map, multimap,
hash_set, hash_multiset, hash_map, hash_multimap
#######################################
STL은 복사에서 시작 하고 복사로 끝난다.
#######################################
값을 얻거나 넣거나 할때 모두 복사로 이루어 집니다.
상속된 클래스를 사용할 경우 베이스 클래스로 형 지정 했다면,
복사라는 특징 때문에 상속된 클래스는 잘리게 됩니다.(slicing problem)
이에 대한 해결 책은 클래스 포인터를 사용 하는 것입니다.(추후 설명)
배열
T w[maxT];
사이즈 0
vector<T> vw;
max T 만큼 미리 확보
vector<T> vw;
vw.reserve(maxT);
######################################
size() == 0을 쓰지 말고 empty()를 써라
######################################
size()를 제공 하지 않는 것도 있다. 예 list
######################################
단일 요소 반복 대신 범위 함수를 쓰자
######################################
void container::assign(시작, 끝)
void container::contrainer(시작, 끝)
void container::insert(삽입위치, 삽입 시작, 끝)
iterator container::erase(시작, 끝) - 시퀀스 컨테이너
void container::erase(시작, 끝) - 연관 컨테이너(반복자의 반환으로 성능 저하 되므로...)
#####################
C++의 어이 없는 동작
#####################
#include <iostream>
class T {
public:
T() { cout << "ok" << endl;}
};
int main() {
T t1(); // 함수 선언, nothing...
T t2; // t 객체 생성, out "ok"
}
같은 원리로...
ifstream dataFile("ints.dat");
list<int> data(istream_iterator<int>(dataFile), istream iterator<int>()); // 단순한 함수 선언에 불과 하다.
list<int> data((istream_iterator<int>(dataFile)), istream iterator<int>()); // 해결, 범용성 떨어짐
<해결>
ifstream dataFile("ints.dat");
istream_iterator<int> dataBegin(dataFile);
istream_iterator<int> dataEnd;
list<int> data(dataBegin, dataEnd);
############################################################################
new로 생성한 포인터 컨테이너는 컨테이너가 소멸 되기 전에 포인터를 delete하자
############################################################################
vector<Widget *> vwp;
for(int i=0; i<NUM; ++i) {
vwp.push_back(new Widget); // new로 생성
}
//... 사용
for(vectro<Widget *>::iterator i = vwp.begin(); i!=vwp.end(); ++i)
delete *i; // delete로 소멸
<문제>
1. for루프는 for_each보다 명확하지 못하다.
2. 사용 중에 vwp가 예외를 던진 다음 메모리 누수 문제는 여전히 남는다.
<1번 해결>
struct Delete Object {
template<typename T>
void operator()(const T*ptr) const {
delete ptr;
}
};
for_each(vwp.begin(), vwp.end(), DeleteObject());
<2번 해결>
www.boost.org의 스마트 포인터 라이브러리를 사용 합니다.
void doSomething()
{
typedef boost::shared_ptr<Widget> SPW;
vector<SPW> vwp;
for(int i=0; i<NUM; ++i)
vwp.push)back(SPW(new Widget));
...
}
doSomething()함수가 끝나더라도, 예외가 발생 해도 메모리가 새지 않습니다.
##############################
auto_ptr 은 절대로 쓰지 말아라
##############################
auto_ptr은 스마트 포인터가 아니다. 자세한것은 Effective STL 참조!!!
##################
삭제의 조심 스러움
##################
무효화된 i에 대하여 ++i를 하고 있다.
AssocContainer<int> c; // AssocContainer는 연관 컨테이너.
...
for(AssocContainer<int>::iterator i=c.begin(); i!=c.end(); ++i) {
if(badValue(*i)) c.erase(i);
}
<해결>
AssocContainer<int> c;
...
for(AssocContainer<int>::iterator i=c.begin(); i!=c.end(); ) {
if(badValue(*i)) c.erase(i++);
else ++i;
}
연속 컨테이너인 경우 i++시 전체가 무효화 됩니다.
<해결>
for(SeqContainer<int>::iterator i=c.begin(); i!=c.end();) {
if(badValue(*i)) {
i = c.erase(i);
}
else ++i;
}
######################################################
STL 쓰레드는 쓰레드에 안전하지 않다.(직접 관리 해야함)
출처 : http://blog.naver.com/jinowin/6000269089
[출처] Effective STL 읽은 후 정리~|작성자 지노윈
| 유틸 클래스 pair (0) | 2011.04.08 |
|---|---|
| 2.1 문자열을 키로 쓰는 map, set 성능 향상시키기 (0) | 2011.02.07 |
| 항목 27 : const_iterator를 iterator로 바꾸는 데에는 distance와 advance를 사용하자. (0) | 2010.11.03 |
| 부스트(boost) 관련 스프링노트 (0) | 2010.06.11 |
| C++ STL int -> string, string -> int 로 변환하기 (1) | 2010.04.27 |
| 무협 본고장의 MMORPG 구음진경 (0) | 2011.07.31 |
|---|---|
| 철권6 리리 기술표 (0) | 2011.06.17 |
| 공방작렬! 수라 온라인 플레이 영상 최초 공개 (0) | 2010.10.20 |
| Tekken Tag Tournament 2 발표! (0) | 2010.09.28 |
| 메탈 기어 솔리드 라이징 E3 트레일러 (0) | 2010.06.23 |
| [DllImport("user32.dll", SetLastError = true)] | |
| static extern IntPtr FindWindow(string lpClassName, string lpWindowName); | |
| [DllImport("user32.dll", SetLastError = true)] | |
| static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); | |
| [DllImport("user32.dll")] | |
| private static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam); | |
| static void Main(string[] args) | |
| { | |
| // Use this to send key strokes | |
| const int WM_KEYDOWN = 0x100; | |
| IntPtr windowHandle = FindWindow("NOTEPAD", null); | |
| IntPtr editHandle = FindWindowEx(windowHandle, IntPtr.Zero, "EDIT", null); | |
| PostMessage(editHandle, WM_KEYDOWN, 'A', 0); | |
| Console.ReadKey(); | |
| } |
| [DllImport("user32.dll")] | |
| public static extern int SendMessage(int hWnd, int msg, int wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam); | |
| [DllImport("user32.dll", SetLastError = true)] | |
| static extern IntPtr FindWindow(string lpClassName, string lpWindowName); | |
| [DllImport("user32.dll", SetLastError = true)] | |
| static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); | |
| static void Main(string[] args) | |
| { | |
| const int WM_SETTEXT = 0x0C; | |
| IntPtr windowHandle = FindWindow("NOTEPAD", null); | |
| IntPtr editHandle = FindWindowEx(windowHandle, IntPtr.Zero, "EDIT", null); | |
| string textToSendToFile = "Input here your text"; | |
| SendMessage((int)editHandle, WM_SETTEXT, 0, textToSendToFile); | |
| Console.ReadKey(); | |
| } |
| C# TAB, 방향키, Control, Alt, Shift Key 입력 처리 (2) | 2011.01.20 |
|---|---|
| [펌] 외부 응용프로그램 실행하기 (Process.Start 메서드) - CMD (0) | 2011.01.13 |
| C# SendMessage Keypress (1) | 2010.12.26 |
| 윈폼에서 토글 버튼(Make Toggle Button for WinForm) 만들기 (2) | 2010.12.14 |
| Microsoft Win32 to Microsoft .NET Framework API Map (0) | 2010.12.10 |