SlideShare une entreprise Scribd logo
1  sur  117
Télécharger pour lire hors ligne
사례를 통해 살펴보는 프로파일링과 최적화
넥슨
김이선
veblush at gmail
BNB
프로그래머
카트라이더
리드 프로그래머
버블파이터
프로토타입
리드 프로그래머
에버플래닛
리드 프로그래머
던전엔파이터
테크니컬 디렉터
GTR
프로그래머
오늘 할 이야기 ?
최적화를 어떻게 진행했는지 실제 사례를 들어 설명
아키텍쳐의 설명 혹은 프로파일링 툴 사용법에 대한 내용은 아님
클라이언트
초기 구동 최적화
클라이언트
FPS 최적화
서버
몬스터 이동 최적화
조언
목차
던전엔 파이터 (디버그 빌드)
초기 구동 시간 단축
개발 이터레이션
코딩 빌드 초기구동 결과확인
F5
짧을 수록 좋다
120초
코딩 빌드 초기구동 결과확인
F5
개발 이터레이션
Core i5 760 2.80GHz, 4GB RAM, G2 SSD, XP
해결할 수 있는 문제인가?
이미 최적인지?
아니라면 최적에서 얼마나 먼 상태인지?
프로그램 구동: 하드에 있는 내용을 메모리로
200MB
던파 (디버그) 클라이언트는 구동 직후 200MB 차지
근데 하드가 제일 느리잖아
그래서 하드 속도 이상은 안 될꺼야…
200MB
60MBps
3.3초
Rule of Thumb
120초 / 3.3초 =
36x
목표
< 20초
핫스팟 찾기
A hot spot in computer science is most usually defined as a region of a computer program
where a high proportion of executed instructions occur or
where most time is spent during the program's execution
(not necessarily the same thing since some instructions are faster than others)
- Wikipedia -
가장 문제가 되는 부분을 고치는 것이
일 한 티가 남 효율이 좋음
A:90 B:10
30 10
90 1
3x
10x
Amdahl's law
2x
프로파일링!
In software engineering, profiling ("program profiling", "software profiling") is a form of
dynamic program analysis that measures, for example, the space (memory) or time complexity of a program,
the usage of particular instructions, or frequency and duration of function calls.
The most common use of profiling information is to aid program optimization.
- Wikipedia -
어떤 프로파일러를 사용할까?
= 어떤 최적화를 할지에 따라 다름
디자인
어셈블리
컴파일
코드
문제
레벨

탑랭커 3명 추려보이기
리스트를 정렬해 상위 3명 얻기
sort(list)[:3]
/Ox
예제
typedef vector<pair<int, string>> Scores;
void GetRanker(const Scores& l, Scores& r) {
// sort(list)[:3]
ScoreList m = l;
sort(m.begin(), m.end(), Scores_less);
r.assign(m.begin(), m.begin() + 3);
}
코드 최적화
디자인 최적화
코드 최적화
void GetRanker(const Scores& l, Scores& r) {
vector<const Scores::value_type*> m(l.size());
for (size_t i=0, j=l.size(); i != j; ++i)
m[i] = &(l[i]);
sort(m.begin(), m.end(), pScoreList_less);
for (size_t i=0; i < 3; i++)
r.push_back(*m[i]);
}
4x
디자인 최적화
void GetRanker(const Scores& l, Scores& r) {
// 리스트를 순회하며 가장 높은 점수 3개 찾기
for (auto i=l.begin(), j=l.end(); i != j; ++i) {
if (r.empty() || r.back().first < i->first) {
auto j = upper_bound(r.begin(), r.end(), *i);
r.insert(j, *i);
if (r.size() > 3)
r.pop_back();
}
}
}
+100x
디자인
어셈블리
컴파일
코드
문제

탑랭커 3명 추려보이기
리스트를 정렬해 상위 3명 얻기
sort(list)[:3]
/Ox
예제
SIMD? PREFETCH?
임의로 뽑은 100명중 상위 3명
순회만으로 상위 3명 얻기
sort(&list)[:3]
/Ox /NO_DEBUG
최적화
x4
x100
x1000
x3
x2
디자인
어셈블리
컴파일
코드
문제
여지 익숙도레벨 툴여부
CPU 프로파일러레벨
CodeAnalyst
VTune
Visual Studio Profiler
Very Sleepy
Glow Code
In-house Profiler
Brain
GPU 프로파일러
Perfhud
Perfstudio
GPA
PIX
X Engine Profiler
Eye
In-house Profiler
디자인
어셈블리
컴파일
코드
문제
s = clock();
do_something_big();
print(clock() – s);
전체 뷰를 보기 위해
번거롭지만 무료
선택한 프로파일러
핫스팟 코드/함수 보기
무료, 간편
In-house Profiler AMD CodeAnalyst
In-house Profiler
AMD CodeAnalyst
테스트 시나리오가 쉽게 반복되도록!
개선 정도를 쉽게 확인 할 수 있어야!
목표설정 프로파일링 최적화
결과확인
& 검증
최적화 과정
최적화 사례
문제확인 원인분석 해결
디버그에서 STL 이 느림
STL Debugging
_ITERATOR_DEBUG_LEVEL
(>= VS2012)
_SECURE_SCL, _HAS_ITERATOR_DEBUGGING
(<= VS2010)
STL Debugging
STL Debugging
디버그 빌드 때
_ITERATION_DEBUG_LEVEL = 2 → 1
STL Debugging
Checked & Debug
Checked
zlib 등 라이브러리 함수가
프로파일러에 많이 등장함
Optimization Flag
디버그 빌드라고 모든 모듈을
디버그 할 필요 없음!
Optimization Flag
라이브러리중 신뢰도가 높으면서
빠른 성능이 필요한 것은
최적화 옵션을 사용한 빌드를 사용
Optimization Flag
Optimization Flag
프로젝트 내부에 독립된 모듈로 존재하는 라이브러리는
모듈만 최적화 옵션을 사용해 성능 향상을 꾀함
Optimization Flag
item_map[0] = Item();
// Item::Item() { clear(); }
// item_map = std::map<Item>
Big Constructor & Map
item_map[0] = Item();
// item_map[0] – Item::Item() called
// Item() – Item::Item() called
// a = b – operator =
// ~Item() - Item()::~Item() called
Big Constructor & Map
if item_map.has_key(0)
item_map[0].clear();
else
item_map[0];
Big Constructor & Map
이상하게 debug.assert 함수가
CPU 를 많이 사용하고 있음
ASSERT
#define ASSERT(b) 
debug.assert(b, _T(#b), …)
void debug::assert(b, …) {
if (b) return;
…
ASSERT
#define ASSERT(b) 
if (b) ; else debug.assert(b, _T(#b), …)
ASSERT
폰트 로딩에 CPU 를 많이 사용하고 있다
FontLoad
void load_font(font) {
for (g in font-glyphs)
max_size = max(max_size, getsize(g));
…
}
FontLoad
void load_font(font) {
if size_cache_map.has(font, size)
max_size = size_cache_map[font, size];
else
for (g in font-glyphs)
max_size = max(max_size, getsize(g));
log(“missing:”, font, size);
…
FontLoad
ParseString 함수가 많은 시간을 소모
ParseString
ParseString(String) → Key, Value
ParseString(“Key1>테스트”) → “Key1”, “테스트”
ParseString
// 주석
Key1>테스트
Key2>개행도n됩니다n하하하
ParseString
길이 제한 검사 (strlen)
문자열 마지막의 ‘n’ ‘r’ 제거
문자열 앞 공백문자 건너뛰기
주석인지 검사
‘>’ 위치 찾기
키 길이 확인
‘>’ 앞뒤의 문자열 얻기 (string assign)
“n” 를 찾고 개행 문자로 치환
Key1>테스트문자열입니다
scan
scan
scan
alloc
ParseString
공백 건너뛰기
주석이거나 빈줄이면 리턴
‘>’ 위치 찾기
키가 없거나 너무 길면 에러
EOS 찾기 및 “n”를 개행 문자로 치환
Key1>테스트문자열입니다
scan
함수 load_data 가 CPU 를 많이 차지
Flex Performance
void Read_Game_Data() {
for (file in files) {
d = load_data(file);
item = parse(d);
}
}
Flex Performance
Flex Performance
Data
File
Data Grammar
load_data
function
Tokens
Flex
Options
element :=
id |
num |
string
load_data()
generated
[power] 1 5
[pos] 10 20
[power]
1
5
…
Flex Performance
Options
load_data 생성에 최적화 옵션 사용
Flex Performance
목표설정 프로파일링 최적화
결과확인
& 검증
검증
특히 라이브 상태라면
무엇보다 중요하다
최적화 전 동작 = 최적화 후 동작
검증
ParseString 의 예
// 기존 함수와 새 함수가 동일한
// 결과를 반환하는지 확인
ParseString(line, key, val);
ParseStringNew(line, key2, val2);
ASSERT(key == key2 && val == val2);
15초
< 20초
2012.9 에 5초 도달
마비노기2 (개발 빌드)
몬스터 200 마리 스폰 상태에서 FPS 올리기
200 마리 몬스터
1fps
(개발 빌드에서)
I7-2600 (3.40GHz), 8GB, GTS 450, W7-64bit
목표
> 20fps
어느정도 해결 가능한 것으로 추정
내부 프로파일러 정보를 통해 렌더링이
병목이 아닌 것은 알고 있었다
프로파일러
AMD CodeAnalyst
VerySleepy
Intel VTune, Scaleform AMP
보조적으로 사용
프로파일러
In-house Counter
In-house Profiler
시작 시간 단축과 달리
매번 동일한 상황을 만들기 번거로우니 않으니.
F5 -> 게임 입장까지 절차 자동화
준비 (실행)
프로파일러가 콜스택을 잘 보이도록
준비 (빌드 옵션)
• CL Global Optimization 끔
(켜 있으면 /Oy- 와 관계없이 FBO 가 되는 현상이 있음)
• CL Frame Buffer Omission 끔
(프로파일러가 콜 스택을 잘 보도록)
• LINK COMDAT Folding 끔
(Identical Function 이 합쳐지는 것 방지)
몬스터 수 20 → 200 비교하기
배수가 아닌 항목을 찾자
20 200
목표설정 프로파일링 최적화
결과확인
& 검증
최적화 과정
최적화 사례
문제확인 원인분석 해결
Enum Constructor
단순 enum 타입
Enum Constructor
ValueType
Object
GC
virtual
AbnormalConditionType
Enum Constructor
AbnormalConditionType
ValueType
진단 로그 범람
printf 류의 함수가 사용하는 함수
DaignosticScene:
개발 보조도구로 거의 모든 게임 정보를
텍스트 형태로 볼 수 있는 로그
진단 로그 범람
진단 로그 범람
msg = format(“%d %d %d”, pos)
diag_log(msg);
// if (diag_on)
// display_and_save_log(msg)
진단 로그 범람
if (diag_on) {
msg = format(“%d %d %d”, pos)
diag_log(msg);
}
PerformanceCounter Lock
PerformanceCounter Lock
Counter* FindCounter(name) {
scope_lock(lock);
return map.find(name);
}
FindCounter(“update”)->Add(1);
PerformanceCounter Lock
Counter* FindCounter(name) {
scope_read_lock(lock);
return map.find(name);
}
FindCounter(“update”)->Add(1);
두 벡터의 각도를 구하는 함수에서 시간 소모!
두 벡터의 각도
두 벡터의 각도
float getAngle(vec a, vec b) {
r = atan2f(a.y, a.x);
v = atan2f(b.y, b.x);
return r - v;
}
if (abs(getAngle(a, b)) < 0.2f);
두 벡터의 각도
float getAngleCos(vec a, vec b) {
v = dot(a, b) / len(a) / len(b);
return v;
}
if (getAngleCos(a, b) < cosf(0.2f));
게임 로직의 대부분의 함수가
전반적으로 느림
Object Component Locality
Object = Component*
Character = [Pos] [Status] [Equip] [Account] …
Monster = [Pos] [Status] [Equip] [AI] …
Object Component Locality
Object* CreateMonster(info) {
obj = new Object()
obj->create<PosComponent>();
obj->create<StatusComponent>();
…
return obj;
}
Object Component Locality
Object
Pos
Status
AI
void ThinkMonster(Object* m) {
pc = m->get<PosComponent>();
sc = m->get<StatusComponent>();
ac = m->get<AIComponent>();
(pc … sc … ac…)
…
}
Object Component Locality
Object
Pos
Status
AI
Object Component Locality
Object Pos
Status AI
Object Pos
Status AI
Object Pos
Status AI
Object* CreateMonster(info) {
obj = new Object()
tls_obj = obj;
obj->create<PosComponent>();
…
void* Component::operator new(size_t s) {
return tls_obj->malloc(s);
}
Object Component Locality
메모리 침범 디버깅을 위한 검사 코드가
CPU 를 많이 사용함
Allocator Guard
메모리 침범 디버깅을 위해 guard 버퍼 사용
Allocator Guard
Chunk guard Chunk guard Chunk
0xabababab … ababab
Allocator Guard
bool memcheck(byte* p, int len) {
byte* e = p + len;
for (; p < e; ++p) {
if (*p != 0xab)
return false;
return true;
}
Allocator Guard
bool memcheck(byte* p, int len) {
dword* d = (dword*)p
dword* e = p + len / 4;
for (; d < e; ++d) {
if (*d != 0xabababab)
return false;
return true;
}
몬스터간 충돌에 Kynapse 를 사용
Kynapse Collision
왜 원이 아니고 사각형인가?Collision_RectangularBody
Shape(r, r) vs Shape(r)
Kynapse Collision
Kynapse Collision
검증
간단히 가능하지 않으면 대충 넘어감
(라이브가 아니라서… 그래서 한 번 터짐…)
34fps
> 20fps
에버플래닛
몬스터 이동 서버 처리량 최적화
MMORPG 는 필드에 몬스터가 가장 많음
몬스터는 대부분의 시간을 돌아다니거나 추적하며 보냄
때문에 개발 초기 단계부터
서버에서 처리 할 몬스터 이동에 대해 고민
길 찾기 알고리즘
(몬스터가 현 위치에서 목표 지점 위치까지 어떻게 가는지)
Athlon 64 x2 3800+ (2.0GHz), 2GB, XP
A* Hierarchical A* Go & Turn
81 ops 3,668 ops 488,281 ops
Go & Turn Hierarchical A*
Fail?
Go & Turn 으로 95% 이상 길 찾기 가능
▽
서버에서 초당 (코어당) 400,000 번 길 찾기 가능
Idle 상태의 몬스터 이동 최적화
t=0
t=10
t=20
f(t, pos, seed)
서버가 t, pos, seed 를
전송하면 클라이언트가
위치 계산 가능
이동에 대한 데이터를
더 이상 보낼 필요 없음
서버 부하 줄어듬
네트워크 부하 줄어듬
나이스?
조언
목표설정 프로파일링 최적화
결과확인
& 검증
최적화 과정
목표가 있어야
작업이 종료됨
Rule of Thumb
적절한 툴/방법 찾기 상상력 동원 성능 향상 확인 및
지식화
검증은 라이브라면
더더욱!
최적화 단계를 개발 단계에 넣을 것
최적화는 디버깅과 유사 → 나중에 하면 어렵다!
최저 사양 / 권장 사양 PC 를 옆에 두고
사용하는 것도 좋은 방법.
개발 단계
성능 지표를 개발 / 라이브 단계에서
주기적으로 확인 필요
성능은 단순한 버그로도 급격하게
나빠질 수 있다.
개발 단계
자주 불리는 함수는 최적화에 신경써야
초당 1000번 불리는 함수는 초당 1번 불리는 것에 1000배?
개발 단계
설계 단계에서 성능 고려
이미 결정된 설계를 나중에 변경하기란 쉽지 않다
개발 단계
감사합니다!

Contenu connexe

Tendances

[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화Jaeseung Ha
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현noerror
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremSeungmo Koo
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들MinGeun Park
 
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기복연 이
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010Ryan Park
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010devCAT Studio, NEXON
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기Sang Heon Lee
 
서비스중인 게임 DB 설계 (쿠키런 편)
서비스중인 게임 DB 설계 (쿠키런 편)서비스중인 게임 DB 설계 (쿠키런 편)
서비스중인 게임 DB 설계 (쿠키런 편)_ce
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018devCAT Studio, NEXON
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅DongMin Choi
 
게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법Chris Ohk
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기ChangKyu Song
 
[IGC2018] 에이스프로젝트 안현석 - 유니티로 실시간 멀티플레이 게임서버를 만들 수 있을까?
[IGC2018] 에이스프로젝트 안현석 - 유니티로 실시간 멀티플레이 게임서버를 만들 수 있을까?[IGC2018] 에이스프로젝트 안현석 - 유니티로 실시간 멀티플레이 게임서버를 만들 수 있을까?
[IGC2018] 에이스프로젝트 안현석 - 유니티로 실시간 멀티플레이 게임서버를 만들 수 있을까?강 민우
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011Esun Kim
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 

Tendances (20)

[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
 
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
서비스중인 게임 DB 설계 (쿠키런 편)
서비스중인 게임 DB 설계 (쿠키런 편)서비스중인 게임 DB 설계 (쿠키런 편)
서비스중인 게임 DB 설계 (쿠키런 편)
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
 
게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
 
[IGC2018] 에이스프로젝트 안현석 - 유니티로 실시간 멀티플레이 게임서버를 만들 수 있을까?
[IGC2018] 에이스프로젝트 안현석 - 유니티로 실시간 멀티플레이 게임서버를 만들 수 있을까?[IGC2018] 에이스프로젝트 안현석 - 유니티로 실시간 멀티플레이 게임서버를 만들 수 있을까?
[IGC2018] 에이스프로젝트 안현석 - 유니티로 실시간 멀티플레이 게임서버를 만들 수 있을까?
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 

Similaire à 사례를 통해 살펴보는 프로파일링과 최적화 NDC2013

NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
Deview 2019 눈발자국
Deview 2019 눈발자국Deview 2019 눈발자국
Deview 2019 눈발자국hanbeom Park
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스Sungik Kim
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)Sang Don Kim
 
DEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptxDEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptxhanbeom Park
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9진현 조
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10Ryan Park
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) Tae Young Lee
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기지수 윤
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crowJaeseung Ha
 
파이썬 스터디 2주차
파이썬 스터디 2주차파이썬 스터디 2주차
파이썬 스터디 2주차Han Sung Kim
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2Chris Ohk
 
스플렁크 머신러닝 연동
스플렁크 머신러닝 연동스플렁크 머신러닝 연동
스플렁크 머신러닝 연동Seung-Woo Kang
 
스플렁크 Machine Learning Integration
스플렁크 Machine Learning Integration스플렁크 Machine Learning Integration
스플렁크 Machine Learning IntegrationTIMEGATE
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10흥배 최
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019min woog kim
 
객체지향 정리. Part1
객체지향 정리. Part1객체지향 정리. Part1
객체지향 정리. Part1kim HYUNG JIN
 

Similaire à 사례를 통해 살펴보는 프로파일링과 최적화 NDC2013 (20)

NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
Deview 2019 눈발자국
Deview 2019 눈발자국Deview 2019 눈발자국
Deview 2019 눈발자국
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
 
DEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptxDEVIEW-FULL-감독판.pptx
DEVIEW-FULL-감독판.pptx
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
 
Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
 
파이썬 스터디 2주차
파이썬 스터디 2주차파이썬 스터디 2주차
파이썬 스터디 2주차
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2
 
스플렁크 머신러닝 연동
스플렁크 머신러닝 연동스플렁크 머신러닝 연동
스플렁크 머신러닝 연동
 
스플렁크 Machine Learning Integration
스플렁크 Machine Learning Integration스플렁크 Machine Learning Integration
스플렁크 Machine Learning Integration
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
객체지향 정리. Part1
객체지향 정리. Part1객체지향 정리. Part1
객체지향 정리. Part1
 

사례를 통해 살펴보는 프로파일링과 최적화 NDC2013