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
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기ChangKyu Song
 
에버플래닛의 글로브뷰 렌더링 NDC2011
에버플래닛의 글로브뷰 렌더링 NDC2011에버플래닛의 글로브뷰 렌더링 NDC2011
에버플래닛의 글로브뷰 렌더링 NDC2011Esun Kim
 
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건강 민우
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPSeungmo Koo
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr내훈 정
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010devCAT Studio, NEXON
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현noerror
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019devCAT Studio, NEXON
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010Ryan Park
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들영욱 오
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기Seungjae Lee
 
NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계tcaesvk
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자KyeongWon Koo
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기Sang Heon Lee
 
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들DongMin Choi
 
게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법Chris Ohk
 
[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지
[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지
[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지Minjung Ko
 

Tendances (20)

[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
 
에버플래닛의 글로브뷰 렌더링 NDC2011
에버플래닛의 글로브뷰 렌더링 NDC2011에버플래닛의 글로브뷰 렌더링 NDC2011
에버플래닛의 글로브뷰 렌더링 NDC2011
 
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
 
NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
 
게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법
 
[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지
[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지
[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지
 

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

[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규ChangKyu Song
 
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
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)Sang Don Kim
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
 
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)

[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
 
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_김성익_슈퍼클래스
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 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
 

Dernier

캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 

Dernier (6)

캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 

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