SlideShare a Scribd company logo
Executor with ExceptionCGCIICho sanghyun’s Game Classes II
CGCIICho sanghyun’s Game Classes II
SEH 란 ?
 SEH(Structured Exception Handling) 은 윈도즈 O/S 차원의 예외 처리 시스템이다 .
 SEH 는 C++ Exception 과 별개이며 언어 중립적이다 .
(C++ 의 try, catch 에는 잡히지 않는다 .)
 일반적으로 ‘뻑 !’ 났을 때 덤프 남기는 용도로 많이 사용한다 !!
 보통 SEH 의 사용은 여기까지다 .
덤프 남기는 것만으로도 감사 감사 ~
Structured Exception Handling
예외처리
(Divide by zero, Access Violation at …! 등등 )
try
throw
catch
__try
__ exception
__finally
C++ Exception SEH
CGCIICho sanghyun’s Game Classes II
SHE 란 ?예외처리
하지만 C++ Exception 보장 처리와 SEH 를 연동 처리
하면 뻑이 나도 다운되지 않고 안전하게 동작 가능한 서버를
만들 수 있다 .
그렇다면 !
SEH 로 Windows System Exception 만
무모화 시킨다면 다운 없는 서버 !!!?
오히려 더 큰일난다 !
→ 예외 중립 훼손
( 즉 뻑 ! 났는지도 모르고 아무런 처리도 없이 그냥 넘기면 더 큰일남 )
CGCIICho sanghyun’s Game Classes II
SEH 와 C++ Exception 의 결합
 Visual C++ 의 Project 의 Property 에서 /EHa 옵션을 설정한다 .
즉 C++ Exception 과 SEH 가 연동될 수 있도록 옵션을 설정한다 .
예외처리
CGCIICho sanghyun’s Game Classes II
SEH 사용 (1)
 보통 뻑이 나면 Mini-Dump 를 남기는 용도로만 사용한다 .
void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException)
{
…
CreateDump(p_pException);
…
printf(“ 뻑났슈 !!! 코딩 이렇게 밖에 못해 ?!!”);
}
void main()
{
// 쓰레드마다 설정해 주어야 한다 .
_set_se_translator(&fSEHTranslator);
…
// 뻑 유발자 코드 ( 처리 중 뻑나면 fSEHTranslator 함수를 실행할 것이다 !)
*(int*)0 = 10;
}
void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException)
{
…
CreateDump(p_pException);
…
printf(“ 뻑났슈 !!! 코딩 이렇게 밖에 못해 ?!!”);
}
void main()
{
// 쓰레드마다 설정해 주어야 한다 .
_set_se_translator(&fSEHTranslator);
…
// 뻑 유발자 코드 ( 처리 중 뻑나면 fSEHTranslator 함수를 실행할 것이다 !)
*(int*)0 = 10;
}
예외처리
CGCIICho sanghyun’s Game Classes II
SEH 와 C++ 예외의 결합
void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException)
{
CreateDump(p_pException);
throw std::exception();
}
void main()
{
// 쓰레드마다 설정해 주어야 한다 .
_set_se_translator(&fSEHTranslator);
…
try
{
// 뻑 유발자 !! ( 처리 중 뻑나면 std::exception() 이 발생할 것이다 !!)
*(int*)0 = 10;
}
catch(…)
{
printf(“ 뻑났음 !”);
}
}
void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException)
{
CreateDump(p_pException);
throw std::exception();
}
void main()
{
// 쓰레드마다 설정해 주어야 한다 .
_set_se_translator(&fSEHTranslator);
…
try
{
// 뻑 유발자 !! ( 처리 중 뻑나면 std::exception() 이 발생할 것이다 !!)
*(int*)0 = 10;
}
catch(…)
{
printf(“ 뻑났음 !”);
}
}
2. C++ Exception 을 던진다 !!!!
3. 그럼 C++ Exception 이 여기서 튀어나온다 !!
4. 당연히 C++ Exception 은 여기에서 잡힌다 !
1. 여기서 ‘뻑’난다 !!!
( 이 순간 C++ Exception 이 발생하지 않고 SEH 에 의해 ...)
예외처리
 C++ Exception 과 함께 사용하면 좀더 다른 처리가 가능하다 .
CGCIICho sanghyun’s Game Classes II
CGCII 예외 시스템
void CExecutorIOCP::Execute(DWORD p_tickWait)
{
// 쓰레드마다 설정해 주어야 한다 .
_set_se_translator(&fSEHTranslator);
while(m_bDone)
{
DWORD dwResult;
DWORD dwBytes;
ULONG_PTR pHKey;
LPOVERLAPPED pOverlapped;
dwResult = GetQueuedCompletionStatus(m_hCP, &dwBytes, &pHKey, &pOverlapped, p_tickWait);
ICGExecutable* pExecuable = static_cast<ICGExecutable*>(pOverlapped);
pExecutable->ProcessExecute(dwResult, dwBytes);
pExecutable->Release();
}
}
void CExecutorIOCP::Execute(DWORD p_tickWait)
{
// 쓰레드마다 설정해 주어야 한다 .
_set_se_translator(&fSEHTranslator);
while(m_bDone)
{
DWORD dwResult;
DWORD dwBytes;
ULONG_PTR pHKey;
LPOVERLAPPED pOverlapped;
dwResult = GetQueuedCompletionStatus(m_hCP, &dwBytes, &pHKey, &pOverlapped, p_tickWait);
ICGExecutable* pExecuable = static_cast<ICGExecutable*>(pOverlapped);
pExecutable->ProcessExecute(dwResult, dwBytes);
pExecutable->Release();
}
}
 SEH 와 C++ Exception 이 결합한다면 ?
 IOCP Executor 의 처리를 try-catch 문으로 처리한다 .
try
{
pExecutable->ProcessExecute(dwResult, dwBytes);
}
catch(…)
{
}
참고 ) 성능을 위해 while 문에 try-catch 문은 최대한 빼도록 구현함 . try-catch 문을 밖으로 빼고 이중 while 문을 쓰는 것이 일반적임 .
예외처리
만약 , 이 함수 실행 중 ‘뻑’이 났다면…
이 ProcessExecute() 함수가 Strong Exception Guarantee 를 제공
하는 함수라면…
try-catch 블록으로 감싼다 .
CGCIICho sanghyun’s Game Classes II
CGCII 예외 시스템
 CGCII 의 모든 Engine 시스템의 실행 처리는 CGCII 의 Execute System 하에서
동작을 하며 완벽한 Strong Exception Guarantee 를 보장한다 .
 쉽게 말해서 아래와 같이 동작한다 .
1. 예외발생 정보 저장 .
2. Mini Dump 남김 .
3. 예외 알림 .
예외처리
CGCIICho sanghyun’s Game Classes II
CGCII 예외 처리
 Pairing 처리를 해주어야 하는 것 !! 들
예외처리
예를 들어 접속 처리 과정에서 OnConnect() 가 정상적으로 호출되었다면 반드시
OnDisconnect() 가 호출되어야 한다 .
OnEnter() 함수가 호출되었으면 반드시 OnLeave() 함수가 호출되어야 한다 .
 객체에 예외처리 전달
- Message 의 처리 과정에서 Message 처리 도중 전달되는 객체에도 예외처리 권한이
주어져야 한다 .
 기타 등등…
원하는 시기에 원하는 대상에 원하는 내용의 예외를 처리할 수 있는 구조를 지원해주어야 한다
.
CGCIICho sanghyun’s Game Classes II
강제 예외 발생
 강제 예외 발생 (Force Rasing Exception) 이란 강제로 예외를 발생 시키는 것 .
 ‘ 데드락’이나 ‘무한루프’에 빠진 쓰레드에 강제로 예외를 발생시켜 해결할 수 있다 .
다만 ! 예외 안전이 처리되었을 때만 제대로 처리 가능하다 . 그렇지 않다면 예외 발생시켜봐
야 어차피 엉망진창된다 .
 Managed C++ 에는 이런 기능 있지만 Native C++ 에서는 직접 만들어야 된다 .
 강제 예외 발생 구현은 시간 및 공간 제한 상 생략 ~
예외처리
CGCIICho sanghyun’s Game Classes II
질문 ?예외처리
질문 ?
sangducks@gmail.com

More Related Content

PPTX
Next-generation MMORPG service architecture
PPT
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
PDF
실시간 게임 서버 최적화 전략
PPTX
NDC 11 자이언트 서버의 비밀
PDF
MMOG Server-Side 충돌 및 이동처리 설계와 구현
PDF
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
PDF
NDC12_Lockless게임서버설계와구현
PDF
임태현, MMO 서버 개발 포스트 모템, NDC2012
Next-generation MMORPG service architecture
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
실시간 게임 서버 최적화 전략
NDC 11 자이언트 서버의 비밀
MMOG Server-Side 충돌 및 이동처리 설계와 구현
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
NDC12_Lockless게임서버설계와구현
임태현, MMO 서버 개발 포스트 모템, NDC2012

What's hot (20)

PDF
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
PDF
Multiplayer Game Sync Techniques through CAP theorem
PDF
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
PDF
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
PDF
테라로 살펴본 MMORPG의 논타겟팅 시스템
PDF
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
PDF
게임 서버 성능 분석하기
PPTX
Ndc14 분산 서버 구축의 ABC
PDF
Windows Registered I/O (RIO) vs IOCP
PDF
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
PDF
임태현, 게임 서버 디자인 가이드, NDC2013
PDF
중앙 서버 없는 게임 로직
PDF
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
PPTX
게임 분산 서버 구조
PPTX
게임프로젝트에 적용하는 GPGPU
PPTX
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
PDF
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
PPT
GCGC- CGCII 서버 엔진에 적용된 기술 (1)
PDF
Windows IOCP vs Linux EPOLL Performance Comparison
PDF
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
Multiplayer Game Sync Techniques through CAP theorem
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
테라로 살펴본 MMORPG의 논타겟팅 시스템
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
게임 서버 성능 분석하기
Ndc14 분산 서버 구축의 ABC
Windows Registered I/O (RIO) vs IOCP
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
임태현, 게임 서버 디자인 가이드, NDC2013
중앙 서버 없는 게임 로직
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
게임 분산 서버 구조
게임프로젝트에 적용하는 GPGPU
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
GCGC- CGCII 서버 엔진에 적용된 기술 (1)
Windows IOCP vs Linux EPOLL Performance Comparison
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
Ad

Viewers also liked (12)

PPT
GCGC- CGCII 서버 엔진에 적용된 기술 (7) - Multiple Inhertance
PPT
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
PPT
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
PPT
GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
PPT
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
PPTX
Sencha architect
PDF
인터렉 리서치
PDF
Iocp advanced
PPTX
서울우유 이벤트프로모션
PDF
[KOSSA] C++ Programming - 14th Study - template
PDF
Barista mobile m2c07
PPTX
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
GCGC- CGCII 서버 엔진에 적용된 기술 (7) - Multiple Inhertance
GCGC- CGCII 서버 엔진에 적용된 기술 (3) - Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (8) - Group System
GCGC- CGCII 서버 엔진에 적용된 기술 (4) - Executing System
Sencha architect
인터렉 리서치
Iocp advanced
서울우유 이벤트프로모션
[KOSSA] C++ Programming - 14th Study - template
Barista mobile m2c07
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
Ad

Similar to GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception (20)

PDF
Windows os 상에서 효율적인 덤프
PDF
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
PDF
Exception&log
PPTX
예외처리가이드
PDF
HI-ARC PS 101
PDF
Tcpl 14장 예외처리
PDF
M3 4 1
PPTX
포스트모템디버깅과 프로세스 덤프 실전
PDF
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
PDF
Effective c++ chapter1 2_dcshin
PPT
카사 공개세미나1회 W.E.L.C.
PPTX
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
PPTX
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
PPT
Working Effectively With Legacy Code - xp2005
PDF
당신의 디버깅에 니코니코니
PDF
[2007 CodeEngn Conference 01] 김기오 - NASM 어셈블러 사용법과 Calling Convention
PPTX
Startup JavaScript 3 - 조건문, 반복문, 예외처리
PDF
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
PPT
프로그램은 왜 실패 하는가
PDF
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
Windows os 상에서 효율적인 덤프
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
Exception&log
예외처리가이드
HI-ARC PS 101
Tcpl 14장 예외처리
M3 4 1
포스트모템디버깅과 프로세스 덤프 실전
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
Effective c++ chapter1 2_dcshin
카사 공개세미나1회 W.E.L.C.
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
Working Effectively With Legacy Code - xp2005
당신의 디버깅에 니코니코니
[2007 CodeEngn Conference 01] 김기오 - NASM 어셈블러 사용법과 Calling Convention
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
프로그램은 왜 실패 하는가
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍

GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception

  • 1. Executor with ExceptionCGCIICho sanghyun’s Game Classes II
  • 2. CGCIICho sanghyun’s Game Classes II SEH 란 ?  SEH(Structured Exception Handling) 은 윈도즈 O/S 차원의 예외 처리 시스템이다 .  SEH 는 C++ Exception 과 별개이며 언어 중립적이다 . (C++ 의 try, catch 에는 잡히지 않는다 .)  일반적으로 ‘뻑 !’ 났을 때 덤프 남기는 용도로 많이 사용한다 !!  보통 SEH 의 사용은 여기까지다 . 덤프 남기는 것만으로도 감사 감사 ~ Structured Exception Handling 예외처리 (Divide by zero, Access Violation at …! 등등 ) try throw catch __try __ exception __finally C++ Exception SEH
  • 3. CGCIICho sanghyun’s Game Classes II SHE 란 ?예외처리 하지만 C++ Exception 보장 처리와 SEH 를 연동 처리 하면 뻑이 나도 다운되지 않고 안전하게 동작 가능한 서버를 만들 수 있다 . 그렇다면 ! SEH 로 Windows System Exception 만 무모화 시킨다면 다운 없는 서버 !!!? 오히려 더 큰일난다 ! → 예외 중립 훼손 ( 즉 뻑 ! 났는지도 모르고 아무런 처리도 없이 그냥 넘기면 더 큰일남 )
  • 4. CGCIICho sanghyun’s Game Classes II SEH 와 C++ Exception 의 결합  Visual C++ 의 Project 의 Property 에서 /EHa 옵션을 설정한다 . 즉 C++ Exception 과 SEH 가 연동될 수 있도록 옵션을 설정한다 . 예외처리
  • 5. CGCIICho sanghyun’s Game Classes II SEH 사용 (1)  보통 뻑이 나면 Mini-Dump 를 남기는 용도로만 사용한다 . void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException) { … CreateDump(p_pException); … printf(“ 뻑났슈 !!! 코딩 이렇게 밖에 못해 ?!!”); } void main() { // 쓰레드마다 설정해 주어야 한다 . _set_se_translator(&fSEHTranslator); … // 뻑 유발자 코드 ( 처리 중 뻑나면 fSEHTranslator 함수를 실행할 것이다 !) *(int*)0 = 10; } void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException) { … CreateDump(p_pException); … printf(“ 뻑났슈 !!! 코딩 이렇게 밖에 못해 ?!!”); } void main() { // 쓰레드마다 설정해 주어야 한다 . _set_se_translator(&fSEHTranslator); … // 뻑 유발자 코드 ( 처리 중 뻑나면 fSEHTranslator 함수를 실행할 것이다 !) *(int*)0 = 10; } 예외처리
  • 6. CGCIICho sanghyun’s Game Classes II SEH 와 C++ 예외의 결합 void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException) { CreateDump(p_pException); throw std::exception(); } void main() { // 쓰레드마다 설정해 주어야 한다 . _set_se_translator(&fSEHTranslator); … try { // 뻑 유발자 !! ( 처리 중 뻑나면 std::exception() 이 발생할 것이다 !!) *(int*)0 = 10; } catch(…) { printf(“ 뻑났음 !”); } } void fSEHTranslator(unsigned int, LPEXCEPTION_POINTERS p_pException) { CreateDump(p_pException); throw std::exception(); } void main() { // 쓰레드마다 설정해 주어야 한다 . _set_se_translator(&fSEHTranslator); … try { // 뻑 유발자 !! ( 처리 중 뻑나면 std::exception() 이 발생할 것이다 !!) *(int*)0 = 10; } catch(…) { printf(“ 뻑났음 !”); } } 2. C++ Exception 을 던진다 !!!! 3. 그럼 C++ Exception 이 여기서 튀어나온다 !! 4. 당연히 C++ Exception 은 여기에서 잡힌다 ! 1. 여기서 ‘뻑’난다 !!! ( 이 순간 C++ Exception 이 발생하지 않고 SEH 에 의해 ...) 예외처리  C++ Exception 과 함께 사용하면 좀더 다른 처리가 가능하다 .
  • 7. CGCIICho sanghyun’s Game Classes II CGCII 예외 시스템 void CExecutorIOCP::Execute(DWORD p_tickWait) { // 쓰레드마다 설정해 주어야 한다 . _set_se_translator(&fSEHTranslator); while(m_bDone) { DWORD dwResult; DWORD dwBytes; ULONG_PTR pHKey; LPOVERLAPPED pOverlapped; dwResult = GetQueuedCompletionStatus(m_hCP, &dwBytes, &pHKey, &pOverlapped, p_tickWait); ICGExecutable* pExecuable = static_cast<ICGExecutable*>(pOverlapped); pExecutable->ProcessExecute(dwResult, dwBytes); pExecutable->Release(); } } void CExecutorIOCP::Execute(DWORD p_tickWait) { // 쓰레드마다 설정해 주어야 한다 . _set_se_translator(&fSEHTranslator); while(m_bDone) { DWORD dwResult; DWORD dwBytes; ULONG_PTR pHKey; LPOVERLAPPED pOverlapped; dwResult = GetQueuedCompletionStatus(m_hCP, &dwBytes, &pHKey, &pOverlapped, p_tickWait); ICGExecutable* pExecuable = static_cast<ICGExecutable*>(pOverlapped); pExecutable->ProcessExecute(dwResult, dwBytes); pExecutable->Release(); } }  SEH 와 C++ Exception 이 결합한다면 ?  IOCP Executor 의 처리를 try-catch 문으로 처리한다 . try { pExecutable->ProcessExecute(dwResult, dwBytes); } catch(…) { } 참고 ) 성능을 위해 while 문에 try-catch 문은 최대한 빼도록 구현함 . try-catch 문을 밖으로 빼고 이중 while 문을 쓰는 것이 일반적임 . 예외처리 만약 , 이 함수 실행 중 ‘뻑’이 났다면… 이 ProcessExecute() 함수가 Strong Exception Guarantee 를 제공 하는 함수라면… try-catch 블록으로 감싼다 .
  • 8. CGCIICho sanghyun’s Game Classes II CGCII 예외 시스템  CGCII 의 모든 Engine 시스템의 실행 처리는 CGCII 의 Execute System 하에서 동작을 하며 완벽한 Strong Exception Guarantee 를 보장한다 .  쉽게 말해서 아래와 같이 동작한다 . 1. 예외발생 정보 저장 . 2. Mini Dump 남김 . 3. 예외 알림 . 예외처리
  • 9. CGCIICho sanghyun’s Game Classes II CGCII 예외 처리  Pairing 처리를 해주어야 하는 것 !! 들 예외처리 예를 들어 접속 처리 과정에서 OnConnect() 가 정상적으로 호출되었다면 반드시 OnDisconnect() 가 호출되어야 한다 . OnEnter() 함수가 호출되었으면 반드시 OnLeave() 함수가 호출되어야 한다 .  객체에 예외처리 전달 - Message 의 처리 과정에서 Message 처리 도중 전달되는 객체에도 예외처리 권한이 주어져야 한다 .  기타 등등… 원하는 시기에 원하는 대상에 원하는 내용의 예외를 처리할 수 있는 구조를 지원해주어야 한다 .
  • 10. CGCIICho sanghyun’s Game Classes II 강제 예외 발생  강제 예외 발생 (Force Rasing Exception) 이란 강제로 예외를 발생 시키는 것 .  ‘ 데드락’이나 ‘무한루프’에 빠진 쓰레드에 강제로 예외를 발생시켜 해결할 수 있다 . 다만 ! 예외 안전이 처리되었을 때만 제대로 처리 가능하다 . 그렇지 않다면 예외 발생시켜봐 야 어차피 엉망진창된다 .  Managed C++ 에는 이런 기능 있지만 Native C++ 에서는 직접 만들어야 된다 .  강제 예외 발생 구현은 시간 및 공간 제한 상 생략 ~ 예외처리
  • 11. CGCIICho sanghyun’s Game Classes II 질문 ?예외처리 질문 ? sangducks@gmail.com

Editor's Notes

  • #3: TLS를 사용하여 성능을 향상시킬 수 있다!! 아무리 Lock-Free라 해도 그냥 값을 복사하는 것보다는 성능이 확실히 떨어진다. 그래서 Lock의 최소화를 위해 TLS를 사용한다.
  • #4: 생성하려는 객체는 반드시 ICGPoolable&amp;lt;T&amp;gt;를 상속받아야 한다. 사용할 때는 그냥 Alloc()함수를 호출하면 되고… 사용이 끝나게 되면 Free()함수를 호출하면 되는데 일반적으로 OnFinalRelease()함수에서 해준다.
  • #5: Windows의 기본 할당자와 CGPool의 성능을 비교한다.(Windows는 기본적으로 16Kbyte까지 LFH가 적용된다.)
  • #6: Object Pool은 객체의 할당을 위한 Pool이다. 사용방법은 매우 간단하다!!! 첫째 CGPool::CObject&amp;lt;T&amp;gt; 라고 하면 된다~~ 그러면 그냥 Alloc(), Free()함수를 사용하여 객체의 할당과 할당해제를 수행할 수 있다 Pool 객체의 대상이 되는 객체는 무조건 ICGPoolable&amp;lt;T&amp;gt;을 상속받아야만 한다!!! 그리고 참조계수로 관리되므로 OnFinalRelease에 delete this가 아니라 Free(this)가 호출되어야 한다. 즉 다 사용되면 지워지는 것이 아니라 풀로 되돌려지는 것이다.
  • #7: 생성하려는 객체는 반드시 ICGPoolable&amp;lt;T&amp;gt;를 상속받아야 한다. 사용할 때는 그냥 Alloc()함수를 호출하면 되고… 사용이 끝나게 되면 Free()함수를 호출하면 되는데 일반적으로 OnFinalRelease()함수에서 해준다.
  • #9: Alloc()/Free()를 사용하고 또 매번 OnFinalRelease()를 호출하도록 하려면 귀찬다. 따라서 NCGPoolable을 지원해준다.
  • #10: 또 NCGPoolable&amp;lt;T&amp;gt;만 상속받았으면 NEW&amp;lt;T&amp;gt;로 생성한다면 자동으로 Pool에서 할당을 해준다.
  • #11: 또 NCGPoolable&amp;lt;T&amp;gt;만 상속받았으면 NEW&amp;lt;T&amp;gt;로 생성한다면 자동으로 Pool에서 할당을 해준다.