SlideShare a Scribd company logo
1 of 62
C++에서 극한의 생산성 뽑아내기
M2 AI코드 개발 생산성 향상 사례
코드 핫로딩과 자체 제작 스크립트 언어
넥슨코리아 W엔지니어링팀
이승재
카바티나 스토리 2007~2009
데스크탑 히어로즈 2010~2011
마비노기2 2011~
이승재
프로그래머
어젠다
1. 런타임에 코드를 교체하는 기법을 소개하고,
2. C++에 찰싹 달라붙는 스크립트 언어를 만들어본 경험을
공유합니다.
작년가을
“AI를 맡으세요”
“헉”
미션: 기존 코드 튜닝, AI 패턴 추가
AI 작업의특징
• 외부 코드에 많이 의존한다.
• 시간의 흐름에 따라 연속적으로 변화한다.
• 자연스러운 행동이란 뭐지?
• 군집 행동의 테스트 케이스는 어떻게 하지?
유닛 테스트는 어렵겠고…
이터레이션 속도 = 생산성!
이터레이션
• 코드 수정
• 빌드
• 로딩
• 테스트
이 루프가 1분 이상;;
일반적인해결책들
• 컴파일 시간: PCH, 의존성 감소
• 링크 시간: DLL 빌드
• 로딩 시간: 로딩 최적화
이미 잘 적용되어 있고 내가 손대기 어려운 것들…
이래선,
안되겠어.
빨리
어떻게든
하지
않으면
….
1. 실행 중 DLL 교체
2. 스크립트 언어 자체 제작
10:41:13 김주복 [EIAS] 간단히 말하면 플러그인이잖......
플러그인?
• Dynamic Linked Library (DLL)
– 실행 시점에 코드를 메모리에 로드한다
• DLL 링크 방법
– Implicit Link (묵시적 링크)
– Explicit Link (명시적 링크)
ImplicitLink
• 보통 접하는 DLL 빌드__declspec(dllimport)
• 라이브러리 프로젝트 빌드하면 .lib와 .dll 생성됨
• 사용하는 쪽에선 .lib을 스태틱 링크한다.
• .lib이 초기화될 때 .dll을 찾아서 자동으로 로드한다.
– DLL의 생명주기를 통제할 수 없다.
– 언로드하거나 교체할 수 없다.
ExplicitLink
• HMODULE WINAPI LoadLibrary(
LPCTSTR lpFileName); // DLL을 로드한다.
• typedef int (FAR WINAPI *FARPROC)();
• FARPROC WINAPI GetProcAddress(
HMODULE hModule,
LPCSTR lpProcName); // 함수 주소를 얻는다.
원리는 정말 간단
문제와 해결책들
진입점문제
extern “C” 로 묶어주지 않으면 이름이 바뀐다!;;네임 맹글링;;
노출하는 함수가 많으면 피곤하다. 일일이 GetProcAddress 해야 하므로..
함수 시그니처 어긋남을 컴파일러가 감지하지 못한다.
진입점문제:해결책
• 인터페이스 클래스를 라이브러리와 호출부가 공통 참조하고,
이것을 상속·구현한 객체를 라이브러리 함수가 리턴하게 했다.
• GetProcAddress 로 단 하나의 함수만 불러오면 된다.
• COM의 QueryInterface와도 비슷하다.
외부심볼참조문제
• Explicit Link DLL은 EXE의 심볼을 볼 수 없다.
• 프로그램의 다른 부분이 Implicit Link DLL로 되어 있다면
추가 비용 없이 그대로 사용 가능하다.
• 아니라면 좀 어려운 문제.
DLL안전하게해제
DLL 해제하기 전에,
내부로의 연결을 모두 끊어야 한다. 빠뜨리면 크래시!
→ DLL을 해제하지 않게 해서 해결.
코드 변경할 때마다 계속 중복 로드하게 함
DLL덮어쓰기
로드된 DLL은 덮어쓰기 불가능.. 빌드가 되지 않는다!
→ 로드 전에 DLL 파일 이름을 랜덤하게 바꾸어서 해결
이름이 비슷한 DLL 파일이 계속 쌓인다!
→ 클라이언트 처음 뜰 때 검색해서 삭제
빌드구성
• 릴리스 버전에는 DLL 교체가 필요 없다.
• 스태틱 링크가 가능할까?
빌드구성
디버그 계열 빌드 릴리스 계열 빌드
라이브러리의 출력 형태 DLL 정적 라이브러리
사용하는 프로젝트에 추가 종속성 설정 안 함 링크될 .lib 이름
EXPLICIT_LOAD_LIBRARY(“AI.dll”) LoadLibrary(“AI.dll”) 사라짐
EXPLICIT_GET_PROC_ADDRESS(
h, FuncType, Func)
(FuncType)GetProcAddress(
h, “Func”)
&Func
※ 공통: 사용하는 프로젝트에서 참조 프로젝트로 라이브러리 프로젝트를 추가하되, 라이브러리 종속성은 끈다.
빌드 순서는 유지하되 Implicit link는 막기 위함
행복해졌습니다
한동안은..
1. 실행 중 DLL 교체
2. 스크립트 언어 자체 제작
기존AI코드
• C++, 스테이트 패턴
• AI 종류별 설정 파일이 존재
거대한 고정 파이프라인C++이 있고
이것을 제어하는 스위치들데이터이 잔뜩 붙어있는 형태
기존코드의문제
• 복잡도가 아주 빠르게 증가한다.
– 기존 코드를 최대한 활용하고,
필요한 곳에서 분기하도록 만들게 되는 경향이 있다.
– 보스는 전용 기능 덩어리..
• 디버깅하기 어렵다.
– 이 설정 항목의 의미는 뭐지?
– 얘는 왜 이렇게 행동하지?
대안: 스크립트로이식하자
• 거대 고정 파이프라인을 해체하자.
– 예) 기존: ‘공격중’ 스테이트를 많은 AI종류가 공유
대안: 각 AI 스크립트에 ‘공격중’ 스테이트를 둔다
• 중복이 있더라도 부담 없도록, 표현이 간결해야 한다.
• 비슷한 유형은 묶어서 표현할 수 있도록 하자.
선택지
• Lua
• 다른 게임 스크립팅 언어들
• 자체 제작
선택지: Lua
• 장점:
– 널리 알려져 있다.
– 나도 익숙하다.
• 단점:
– FSM을 원하는 만큼 간결하게 표현 못한다.
– 단순 실수를 컴파일 타임에 잡지 못한다!
NDC’11 <온라인 게임 처음부터 끝까지 동적언어로 만들기> 참고.
선택지: 다른게임스크립팅언어들
• AngelScript, Squirrel, GameMonkey, …
• 잘 몰라서 탈락.
어떤 특성이 있는지, 어떤 함정이 있는지…
선택지: 자체제작
• 할 수 있을까?
• 정말 좋을까?
• 비용은 얼마나 들까?
할수있을까?
Lua 5.0 구현 논문과, Lua로 된 Lua 파서 코드를 봤었다.
딱히 외계인 기술이 아니다, 도전해 볼만한 일이라고 판단.
정말좋을까?
• 전에 해 봤다: FSM 언어
– 카바티나 스토리
– 캐릭터 조작계와 AI에 사용
– 간단한 구조
변수와 Expression 없음, 한정된 형태의 제어문
– 적은 투자로 큰 효과를 봤던 기억
[시작]
전투중이면 -> 가만서있는다=0.5, [전투중]
!다돌아왔으면 -> 제자리로돌아간다, [돌아가기]
무조건 -> 배회한다=$배회주기
[전투중]
!전투중이면 -> 제자리로돌아간다, [돌아가기]
스킬사용해본다( $스킬_평타 ) -> 시전성공
무조건 -> 가만서있는다=0.1
[돌아가기]
전투중이면 -> 가만서있는다=0.5, [전투중]
다돌아왔으면 -> 가만서있는다=0.5, [시작]
무조건 -> 제자리로돌아간다
비용은얼마나들까?
• 개인 시간에 proof-of-concept을 시도해 보았다.
• if문과 변수 선언을 갖는 언어를 구현하는 데 며칠 걸림.
할 수 있겠다!
HFSMHierarchicalFiniteStateMachine
스테이트 머신을 위한 문법
실행 중 일시 정지
한글 식별자
멤버 변수 초기화
구문 강조
HFSM 언어: 잘 한 것
주로 언어의 모양과 기능
스테이트머신을표현하는문법
• [State]
• # Update { … }
• # Enter { … }, # Leave { … } 실제로는 거의 사용하지 않았다.
• if (…) { goto [State]; }
실행중일시정지
• yield;
• 홀드(30)~;
• 공격준비동작실행(…)~;
(일종의) 코루틴.
함수호출이 없으므로 중간 상태 보관 구현이 아주 간단했다.
잘 쓰면 스테이트 개수를 아주 많이 줄일 수 있다.
컴파일타임타입체크
• 모든 문Statement의 유효성과 식Expression의 타입을
컴파일 타임에 체크한다.
– 컴파일 타임 = 스크립트 로드 시점
– 바인딩 정보를 활용한다.
일단 로딩에 성공하면 스크립트 실행중 에러가 나지 않는다.
격렬한 리팩토링도 무섭지 않다.
사용자정의타입
• 클래스의 바인딩을 C++ 코드로 작성한다.
• 스크립트에서 바로 멤버 변수를 읽고 쓸 수 있다.
• 스크립트에서 바로 멤버 함수를 호출할 수 있다.
스크립트에서 직접 클래스를 선언하는 문법을 만들지 않았다.
멤버변수초기화
var 탈것서브어택 = AttackType() {
준비시간 = MinMax(40, 45),
공격액션 = "SubAttack"
};
var 탈것서브어택 = AttackType();
탈것서브어택.준비시간 = MinMax(40, 45);
탈것서브어택.공격액션 = "SubAttack";
• C#을 모방.
• 복잡한 데이터 서술에 좋다.
• 일반적인 데이터 로딩에도
활용할 수 있을 것 같다.
=
파생스크립트
• 비슷한 AI들이 많다.
• 다 따로 만들면 관리하기 어렵다.
아직 코드가 굳어지기 전에는 더욱.
• 상속 같은 걸 끼얹나?
파생스크립트
• 스탠드얼론 AI 스크립트
– 모든 기능을 사용할 수 있다.
– 행동의 절차를 서술한다.
• 확장 스크립트
– extend XXXX; 로 시작한다.
– Init 전역 함수만 만들 수 있다.
– 수정이 필요한 설정이나 전역변수를
Init에서 변경한다.
파생스크립트
“예전 구조랑 똑같지 않나요?”
• 한 AI = 한 파일이기 때문에 Copy&Paste가 부담 없다.
• 스탠드얼론 AI 스크립트를 여러 종 둘 수 있다.
• 특이한 구현이 일반적인 구현을 더럽히지 않는다.
• 특히 보스 AI의 구현이 완전히 격리된다.
매뉴얼자동생성
• 바인딩 정보는 이미 다 가지고 있다.
• 어떤 함수와 클래스가 있는지 html 파일로 출력하게 했다.
실행로그
• 그 틱에서 실행한 라인을 표시한다.
• 브레이크포인트보다 훨씬 편하다.
• 특히 여러 AI를 동시에 관찰할 때.
한글식별자
• 상당수의 함수에 주석이 필요 없었다.
에디트플러스구문강조파일
• 만들기 쉽다.
HFSM 언어: 아쉬운 것
주로 내부 구현
파서/타입체커/코드생성기가한몸
• 1-pass
• Recursive Descent 파서의 재귀호출 과정에서 모든 작업을 수행
• 별 생각 없이 루아 컴파일러 구조를 모방한 것;;;
문법 바꾸거나 새로운 거 추가할 때 고생했다.
파스 트리를 먼저 생성하고 나서,
그 파스 트리를 해석해서 타입체크하고 바이트코드를 생성하는 것이 바람직할 듯.
정수형이없다
• 값으로 취급하는 내장 타입들: number, bool, string
• HFSM number = C++ float
• 이것도 별 생각 없이 루아 모방…
C++ 코드에서 매번 캐스팅하기 은근히 귀찮다.
사용자정의타입은힙에만넣을수있다
• 스크립트에 바인딩하는 클래스는 ReferenceCounter 상속을 강제했다.
• 별 생각 없이 자바 모방
아주 간단한 객체에도 스마트 포인터를 써야 하는 부담이 있다.
레지스터머신
• number/bool, string, object의 레지스터 3종 세트
• 전역변수가 점유하고 남는 레지스터 공간을 지역변수가 사용
스크립트 언어 안에서의 함수호출을 만들 수가 없네?;
레지스터 공간 추적하기도 엄청 까다롭네?;
스테이트 사이사이에 전역변수를 추가할 수가 없네?;
1-pass 컴파일러다 보니…
제네릭리스트구현
• ‘객체의 리스트’ 문법을 내장.
• 리스트 구현은 한 벌만 짜고, 컴파일러 트릭으로 구현을 공유했다.
• 문법은 파이썬, 구현은 자바를 모방 역시 별 생각이 없었다.
귀찮은 문제가 잡다하게 발생;;
타입 체크가 아주 복잡하다던가
리스트를 객체의 멤버로 넣을 수가 없다던가
내장 타입의 리스트를 만들 수가 없다던가 (더러운 박싱 언박싱…)
var 일반공격1 = AttackType() { … };
var 일반공격2 = AttackType() { … };
var 일반공격목록 = [ 일반공격1, 일반공격2 ];
바인딩
• 템플릿+매크로 서커스
역시 별 생각이 없었다. 익숙한 대로 했을 뿐…
• 읽기도 고치기도 어렵다.
• 노출한 함수를 C++에서 호출하기 어렵다.
특수한 주석으로 추가하고, 코드생성 하는 게 낫지 않을까?
(NDC’11 코드 생성을 사용해 개발 속도 높이기 / 김이선님 발표)
다시만든다면
• 스마트 포인터를 언어의 핵심에서 제거하고,
• 모든 타입을 값으로 취급한다. The STL Way!
• 스크립트 스택 메모리에 직접 객체를 할당하고 관리.
• 제네릭도 제거한다. List<A>와 List<B>는 전혀 다른 타입으로 취급.
• 레퍼런스 시맨틱을 쓰고 싶으면 스마트 포인터를 직접 바인딩하게 한다.
C++와 심리스하게 붙는 스태틱 타입 스크립트 언어를 만들려면, 이게 가장 심플한 답이 아닐까…
요약 & 결론
코드핫로딩
• 실행 중 DLL 교체!
• 간단히 적용 가능.
DLL 빌드 대응이 되어 있지 않으면 좀 힘들겠지만…
자체제작스크립트언어
• 잘 쓰고 있다.
• 의외로 만들기 어렵지 않았다.
• 더 넓은 범위에서 써도 되지 않을까!
• 내부 구현이 좀 아쉽다.
생각없이 베끼다 보니까…
게임 스크립트 언어, 만족하십니까?
Q/A
명령어구조
• 컴파일하면 코드 뭉치와 각종 테이블이 나온다. 컴파일을 먼저 해서 배포하는 것을 염두에 둠.
• 1 명령어 = 32비트. 19종류. 레지스터는 9비트.
• 명령어의 맥락을 보고 3종류의 레지스터 중 어느 것을 쓸지 알 수 있다.
모르는 경우에는 명렁어 내부에 힌트를 인코딩해 넣어서 해결.
• 함수호출이나 필드 액세스의 경우 별도의 테이블이 있고 명령어에는 테이블 인덱스만 저장.
– 예) 함수호출: this 레지스터, 인자가 담긴 레지스터들, 리턴값을 담을 레지스터, 호출 직후에 yield할까
• 스트링/숫자 리터럴도 별도의 테이블에 넣고 명령어에는 테이블 인덱스만 저장.

More Related Content

What's hot

이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015devCAT Studio, NEXON
 
이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016
이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016
이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016devCAT Studio, NEXON
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013devCAT Studio, NEXON
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012devCAT Studio, NEXON
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018devCAT Studio, NEXON
 
이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017
이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017
이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017devCAT Studio, NEXON
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직Hoyoung Choi
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018devCAT Studio, NEXON
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017devCAT Studio, NEXON
 
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017devCAT Studio, NEXON
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현noerror
 
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
 
취미로 엔진 만들기
취미로 엔진 만들기취미로 엔진 만들기
취미로 엔진 만들기Jiho Choi
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기ChangKyu Song
 
NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2
NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2
NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2Jubok Kim
 
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출 NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출 정주 김
 
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발주항 박
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)Heungsub Lee
 
[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기
[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기
[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기flashscope
 

What's hot (20)

이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
 
이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016
이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016
이희영, 글로벌 원빌드 모바일 게임 런칭과 라이브 개발, NDC2016
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
 
이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017
이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017
이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
 
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
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
 
취미로 엔진 만들기
취미로 엔진 만들기취미로 엔진 만들기
취미로 엔진 만들기
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
 
NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2
NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2
NDC2012 - 완벽한 MMO 클라이언트 설계에의 도전, Part2
 
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출 NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출
 
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
오픈 소스를 활용한 캐쥬얼 게임 서버 프레임워크 개발
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기
[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기
[NHN NEXT]실전프로젝트 밴드 게임 만들기 후기
 

Viewers also liked

김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵
김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵
김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵devCAT Studio, NEXON
 
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012devCAT Studio, NEXON
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기Seungjae Lee
 
이원 김한경, 거의 모든 무기의 역사, NDC2013
 이원 김한경, 거의 모든 무기의 역사, NDC2013 이원 김한경, 거의 모든 무기의 역사, NDC2013
이원 김한경, 거의 모든 무기의 역사, NDC2013devCAT Studio, NEXON
 
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012김기용, 영화 속 액션 연출가와 애니메이터, NDC2012
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012devCAT Studio, NEXON
 
모바일 게임 테스트 자동화 (Appium 확장)
모바일 게임 테스트 자동화 (Appium 확장)모바일 게임 테스트 자동화 (Appium 확장)
모바일 게임 테스트 자동화 (Appium 확장)Jongwon Kim
 
김재석, Gamification 101:실전 감량 사례로 알아보는 메카닉, NDC2012
김재석, Gamification 101:실전 감량 사례로 알아보는 메카닉, NDC2012김재석, Gamification 101:실전 감량 사례로 알아보는 메카닉, NDC2012
김재석, Gamification 101:실전 감량 사례로 알아보는 메카닉, NDC2012devCAT Studio, NEXON
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화sung ki choi
 
김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...
김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...
김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...devCAT Studio, NEXON
 
최호영, TYPESCRIPT - Javascript의 안정성을 높이기 위한 시도, NDC2013
최호영, TYPESCRIPT - Javascript의 안정성을 높이기 위한 시도, NDC2013최호영, TYPESCRIPT - Javascript의 안정성을 높이기 위한 시도, NDC2013
최호영, TYPESCRIPT - Javascript의 안정성을 높이기 위한 시도, NDC2013devCAT Studio, NEXON
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유Hwan Min
 
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011devCAT Studio, NEXON
 
Dll파일 호출
Dll파일 호출Dll파일 호출
Dll파일 호출abapier
 
Ccx03.cocos builder
Ccx03.cocos builderCcx03.cocos builder
Ccx03.cocos builder우진 이
 
GameMath-Chapter 01 벡터
GameMath-Chapter 01 벡터GameMath-Chapter 01 벡터
GameMath-Chapter 01 벡터Mark Choi
 
Cocos2d x a to z (상)
Cocos2d x a to z (상)Cocos2d x a to z (상)
Cocos2d x a to z (상)SeungIl Choi
 
Silverlight vs flash
Silverlight vs flashSilverlight vs flash
Silverlight vs flash권 태혁
 
C# 뉴비를 위한 맛보기 2
C# 뉴비를 위한 맛보기 2C# 뉴비를 위한 맛보기 2
C# 뉴비를 위한 맛보기 2진상 문
 
[NDC14] 파워포인트로 그래픽 리소스 만들기
[NDC14] 파워포인트로 그래픽 리소스 만들기[NDC14] 파워포인트로 그래픽 리소스 만들기
[NDC14] 파워포인트로 그래픽 리소스 만들기Sun Park
 
4.5부동소수점
4.5부동소수점4.5부동소수점
4.5부동소수점JaeHong Park
 

Viewers also liked (20)

김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵
김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵
김동건, 게임팅커가 되자, 2015년 데브캣 스튜디오 워크샵
 
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
 
이원 김한경, 거의 모든 무기의 역사, NDC2013
 이원 김한경, 거의 모든 무기의 역사, NDC2013 이원 김한경, 거의 모든 무기의 역사, NDC2013
이원 김한경, 거의 모든 무기의 역사, NDC2013
 
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012김기용, 영화 속 액션 연출가와 애니메이터, NDC2012
김기용, 영화 속 액션 연출가와 애니메이터, NDC2012
 
모바일 게임 테스트 자동화 (Appium 확장)
모바일 게임 테스트 자동화 (Appium 확장)모바일 게임 테스트 자동화 (Appium 확장)
모바일 게임 테스트 자동화 (Appium 확장)
 
김재석, Gamification 101:실전 감량 사례로 알아보는 메카닉, NDC2012
김재석, Gamification 101:실전 감량 사례로 알아보는 메카닉, NDC2012김재석, Gamification 101:실전 감량 사례로 알아보는 메카닉, NDC2012
김재석, Gamification 101:실전 감량 사례로 알아보는 메카닉, NDC2012
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...
김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...
김재석, C++ 게임 개발자를 위한 c# 활용 기법, 월간 마이크로소프트웨어 창간 28주년 기념 C++ 개발자를 위한 게임 프로그래밍 실전...
 
최호영, TYPESCRIPT - Javascript의 안정성을 높이기 위한 시도, NDC2013
최호영, TYPESCRIPT - Javascript의 안정성을 높이기 위한 시도, NDC2013최호영, TYPESCRIPT - Javascript의 안정성을 높이기 위한 시도, NDC2013
최호영, TYPESCRIPT - Javascript의 안정성을 높이기 위한 시도, NDC2013
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유
 
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
 
Dll파일 호출
Dll파일 호출Dll파일 호출
Dll파일 호출
 
Ccx03.cocos builder
Ccx03.cocos builderCcx03.cocos builder
Ccx03.cocos builder
 
GameMath-Chapter 01 벡터
GameMath-Chapter 01 벡터GameMath-Chapter 01 벡터
GameMath-Chapter 01 벡터
 
Cocos2d x a to z (상)
Cocos2d x a to z (상)Cocos2d x a to z (상)
Cocos2d x a to z (상)
 
Silverlight vs flash
Silverlight vs flashSilverlight vs flash
Silverlight vs flash
 
C# 뉴비를 위한 맛보기 2
C# 뉴비를 위한 맛보기 2C# 뉴비를 위한 맛보기 2
C# 뉴비를 위한 맛보기 2
 
[NDC14] 파워포인트로 그래픽 리소스 만들기
[NDC14] 파워포인트로 그래픽 리소스 만들기[NDC14] 파워포인트로 그래픽 리소스 만들기
[NDC14] 파워포인트로 그래픽 리소스 만들기
 
4.5부동소수점
4.5부동소수점4.5부동소수점
4.5부동소수점
 

Similar to 이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013

아이폰에 포팅해보기
아이폰에 포팅해보기아이폰에 포팅해보기
아이폰에 포팅해보기changehee lee
 
프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들Lee Geonhee
 
Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Dong Chan Shin
 
LinqPad for DevOps
LinqPad for DevOpsLinqPad for DevOps
LinqPad for DevOps성수 이
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기Chris Ohk
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)Jay Park
 
[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
 
클린 코드 part2
클린 코드 part2클린 코드 part2
클린 코드 part2Minseok Jang
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자Sewon Ann
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터Dong Chan Shin
 
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다KWON JUNHYEOK
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍QooJuice
 
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규ChangKyu Song
 
소스리딩워크샵 - NHN NEXT
소스리딩워크샵 - NHN NEXT소스리딩워크샵 - NHN NEXT
소스리딩워크샵 - NHN NEXTMinsuk Lee
 
이클립스 플랫폼
이클립스 플랫폼이클립스 플랫폼
이클립스 플랫폼Kenu, GwangNam Heo
 
객체지향프로그래밍 특강
객체지향프로그래밍 특강객체지향프로그래밍 특강
객체지향프로그래밍 특강uEngine Solutions
 
간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈Seo YoungHoon
 
OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)Jinwook On
 

Similar to 이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013 (20)

아이폰에 포팅해보기
아이폰에 포팅해보기아이폰에 포팅해보기
아이폰에 포팅해보기
 
프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들
 
Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬
 
LinqPad for DevOps
LinqPad for DevOpsLinqPad for DevOps
LinqPad for DevOps
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)
 
[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에, 좌충우돌 마이그레이션 이야기
 
클린 코드 part2
클린 코드 part2클린 코드 part2
클린 코드 part2
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터
 
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
 
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
 
소스리딩워크샵 - NHN NEXT
소스리딩워크샵 - NHN NEXT소스리딩워크샵 - NHN NEXT
소스리딩워크샵 - NHN NEXT
 
이클립스 플랫폼
이클립스 플랫폼이클립스 플랫폼
이클립스 플랫폼
 
객체지향프로그래밍 특강
객체지향프로그래밍 특강객체지향프로그래밍 특강
객체지향프로그래밍 특강
 
1 2 1
1 2 11 2 1
1 2 1
 
간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈
 
OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)
 

More from devCAT Studio, NEXON

김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019devCAT Studio, NEXON
 
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019devCAT Studio, NEXON
 
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019devCAT Studio, NEXON
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019devCAT Studio, NEXON
 
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019devCAT Studio, NEXON
 
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019devCAT Studio, NEXON
 
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019devCAT Studio, NEXON
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019devCAT Studio, NEXON
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019devCAT Studio, NEXON
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019devCAT Studio, NEXON
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018devCAT Studio, NEXON
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018devCAT Studio, NEXON
 
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018devCAT Studio, NEXON
 
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018devCAT Studio, NEXON
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018devCAT Studio, NEXON
 
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012devCAT Studio, NEXON
 
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011devCAT Studio, NEXON
 
백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010devCAT Studio, NEXON
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017devCAT Studio, NEXON
 
노기태, 김대우, 모바일 게임 데이터에 입각한 머신러닝 예측 분석 도입 및 삽질 후기, NDC2017
노기태, 김대우, 모바일 게임 데이터에 입각한 머신러닝 예측 분석 도입 및 삽질 후기, NDC2017노기태, 김대우, 모바일 게임 데이터에 입각한 머신러닝 예측 분석 도입 및 삽질 후기, NDC2017
노기태, 김대우, 모바일 게임 데이터에 입각한 머신러닝 예측 분석 도입 및 삽질 후기, NDC2017devCAT Studio, NEXON
 

More from devCAT Studio, NEXON (20)

김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
 
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
 
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
 
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
 
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
 
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
 
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
 
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
 
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
 
백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
 
노기태, 김대우, 모바일 게임 데이터에 입각한 머신러닝 예측 분석 도입 및 삽질 후기, NDC2017
노기태, 김대우, 모바일 게임 데이터에 입각한 머신러닝 예측 분석 도입 및 삽질 후기, NDC2017노기태, 김대우, 모바일 게임 데이터에 입각한 머신러닝 예측 분석 도입 및 삽질 후기, NDC2017
노기태, 김대우, 모바일 게임 데이터에 입각한 머신러닝 예측 분석 도입 및 삽질 후기, NDC2017
 

Recently uploaded

Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
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
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 

Recently uploaded (6)

Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
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)
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 

이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013

  • 1. C++에서 극한의 생산성 뽑아내기 M2 AI코드 개발 생산성 향상 사례 코드 핫로딩과 자체 제작 스크립트 언어 넥슨코리아 W엔지니어링팀 이승재
  • 2. 카바티나 스토리 2007~2009 데스크탑 히어로즈 2010~2011 마비노기2 2011~ 이승재 프로그래머
  • 3. 어젠다 1. 런타임에 코드를 교체하는 기법을 소개하고, 2. C++에 찰싹 달라붙는 스크립트 언어를 만들어본 경험을 공유합니다.
  • 5. AI 작업의특징 • 외부 코드에 많이 의존한다. • 시간의 흐름에 따라 연속적으로 변화한다. • 자연스러운 행동이란 뭐지? • 군집 행동의 테스트 케이스는 어떻게 하지? 유닛 테스트는 어렵겠고… 이터레이션 속도 = 생산성!
  • 6. 이터레이션 • 코드 수정 • 빌드 • 로딩 • 테스트 이 루프가 1분 이상;;
  • 7. 일반적인해결책들 • 컴파일 시간: PCH, 의존성 감소 • 링크 시간: DLL 빌드 • 로딩 시간: 로딩 최적화 이미 잘 적용되어 있고 내가 손대기 어려운 것들…
  • 9. 1. 실행 중 DLL 교체 2. 스크립트 언어 자체 제작
  • 10. 10:41:13 김주복 [EIAS] 간단히 말하면 플러그인이잖......
  • 11. 플러그인? • Dynamic Linked Library (DLL) – 실행 시점에 코드를 메모리에 로드한다 • DLL 링크 방법 – Implicit Link (묵시적 링크) – Explicit Link (명시적 링크)
  • 12. ImplicitLink • 보통 접하는 DLL 빌드__declspec(dllimport) • 라이브러리 프로젝트 빌드하면 .lib와 .dll 생성됨 • 사용하는 쪽에선 .lib을 스태틱 링크한다. • .lib이 초기화될 때 .dll을 찾아서 자동으로 로드한다. – DLL의 생명주기를 통제할 수 없다. – 언로드하거나 교체할 수 없다.
  • 13. ExplicitLink • HMODULE WINAPI LoadLibrary( LPCTSTR lpFileName); // DLL을 로드한다. • typedef int (FAR WINAPI *FARPROC)(); • FARPROC WINAPI GetProcAddress( HMODULE hModule, LPCSTR lpProcName); // 함수 주소를 얻는다. 원리는 정말 간단
  • 15. 진입점문제 extern “C” 로 묶어주지 않으면 이름이 바뀐다!;;네임 맹글링;; 노출하는 함수가 많으면 피곤하다. 일일이 GetProcAddress 해야 하므로.. 함수 시그니처 어긋남을 컴파일러가 감지하지 못한다.
  • 16. 진입점문제:해결책 • 인터페이스 클래스를 라이브러리와 호출부가 공통 참조하고, 이것을 상속·구현한 객체를 라이브러리 함수가 리턴하게 했다. • GetProcAddress 로 단 하나의 함수만 불러오면 된다. • COM의 QueryInterface와도 비슷하다.
  • 17. 외부심볼참조문제 • Explicit Link DLL은 EXE의 심볼을 볼 수 없다. • 프로그램의 다른 부분이 Implicit Link DLL로 되어 있다면 추가 비용 없이 그대로 사용 가능하다. • 아니라면 좀 어려운 문제.
  • 18. DLL안전하게해제 DLL 해제하기 전에, 내부로의 연결을 모두 끊어야 한다. 빠뜨리면 크래시! → DLL을 해제하지 않게 해서 해결. 코드 변경할 때마다 계속 중복 로드하게 함
  • 19. DLL덮어쓰기 로드된 DLL은 덮어쓰기 불가능.. 빌드가 되지 않는다! → 로드 전에 DLL 파일 이름을 랜덤하게 바꾸어서 해결 이름이 비슷한 DLL 파일이 계속 쌓인다! → 클라이언트 처음 뜰 때 검색해서 삭제
  • 20. 빌드구성 • 릴리스 버전에는 DLL 교체가 필요 없다. • 스태틱 링크가 가능할까?
  • 21. 빌드구성 디버그 계열 빌드 릴리스 계열 빌드 라이브러리의 출력 형태 DLL 정적 라이브러리 사용하는 프로젝트에 추가 종속성 설정 안 함 링크될 .lib 이름 EXPLICIT_LOAD_LIBRARY(“AI.dll”) LoadLibrary(“AI.dll”) 사라짐 EXPLICIT_GET_PROC_ADDRESS( h, FuncType, Func) (FuncType)GetProcAddress( h, “Func”) &Func ※ 공통: 사용하는 프로젝트에서 참조 프로젝트로 라이브러리 프로젝트를 추가하되, 라이브러리 종속성은 끈다. 빌드 순서는 유지하되 Implicit link는 막기 위함
  • 23. 1. 실행 중 DLL 교체 2. 스크립트 언어 자체 제작
  • 24. 기존AI코드 • C++, 스테이트 패턴 • AI 종류별 설정 파일이 존재 거대한 고정 파이프라인C++이 있고 이것을 제어하는 스위치들데이터이 잔뜩 붙어있는 형태
  • 25. 기존코드의문제 • 복잡도가 아주 빠르게 증가한다. – 기존 코드를 최대한 활용하고, 필요한 곳에서 분기하도록 만들게 되는 경향이 있다. – 보스는 전용 기능 덩어리.. • 디버깅하기 어렵다. – 이 설정 항목의 의미는 뭐지? – 얘는 왜 이렇게 행동하지?
  • 26. 대안: 스크립트로이식하자 • 거대 고정 파이프라인을 해체하자. – 예) 기존: ‘공격중’ 스테이트를 많은 AI종류가 공유 대안: 각 AI 스크립트에 ‘공격중’ 스테이트를 둔다 • 중복이 있더라도 부담 없도록, 표현이 간결해야 한다. • 비슷한 유형은 묶어서 표현할 수 있도록 하자.
  • 27. 선택지 • Lua • 다른 게임 스크립팅 언어들 • 자체 제작
  • 28. 선택지: Lua • 장점: – 널리 알려져 있다. – 나도 익숙하다. • 단점: – FSM을 원하는 만큼 간결하게 표현 못한다. – 단순 실수를 컴파일 타임에 잡지 못한다! NDC’11 <온라인 게임 처음부터 끝까지 동적언어로 만들기> 참고.
  • 29. 선택지: 다른게임스크립팅언어들 • AngelScript, Squirrel, GameMonkey, … • 잘 몰라서 탈락. 어떤 특성이 있는지, 어떤 함정이 있는지…
  • 30. 선택지: 자체제작 • 할 수 있을까? • 정말 좋을까? • 비용은 얼마나 들까?
  • 31. 할수있을까? Lua 5.0 구현 논문과, Lua로 된 Lua 파서 코드를 봤었다. 딱히 외계인 기술이 아니다, 도전해 볼만한 일이라고 판단.
  • 32. 정말좋을까? • 전에 해 봤다: FSM 언어 – 카바티나 스토리 – 캐릭터 조작계와 AI에 사용 – 간단한 구조 변수와 Expression 없음, 한정된 형태의 제어문 – 적은 투자로 큰 효과를 봤던 기억 [시작] 전투중이면 -> 가만서있는다=0.5, [전투중] !다돌아왔으면 -> 제자리로돌아간다, [돌아가기] 무조건 -> 배회한다=$배회주기 [전투중] !전투중이면 -> 제자리로돌아간다, [돌아가기] 스킬사용해본다( $스킬_평타 ) -> 시전성공 무조건 -> 가만서있는다=0.1 [돌아가기] 전투중이면 -> 가만서있는다=0.5, [전투중] 다돌아왔으면 -> 가만서있는다=0.5, [시작] 무조건 -> 제자리로돌아간다
  • 33. 비용은얼마나들까? • 개인 시간에 proof-of-concept을 시도해 보았다. • if문과 변수 선언을 갖는 언어를 구현하는 데 며칠 걸림. 할 수 있겠다!
  • 34. HFSMHierarchicalFiniteStateMachine 스테이트 머신을 위한 문법 실행 중 일시 정지 한글 식별자 멤버 변수 초기화 구문 강조
  • 35. HFSM 언어: 잘 한 것 주로 언어의 모양과 기능
  • 36. 스테이트머신을표현하는문법 • [State] • # Update { … } • # Enter { … }, # Leave { … } 실제로는 거의 사용하지 않았다. • if (…) { goto [State]; }
  • 37. 실행중일시정지 • yield; • 홀드(30)~; • 공격준비동작실행(…)~; (일종의) 코루틴. 함수호출이 없으므로 중간 상태 보관 구현이 아주 간단했다. 잘 쓰면 스테이트 개수를 아주 많이 줄일 수 있다.
  • 38. 컴파일타임타입체크 • 모든 문Statement의 유효성과 식Expression의 타입을 컴파일 타임에 체크한다. – 컴파일 타임 = 스크립트 로드 시점 – 바인딩 정보를 활용한다. 일단 로딩에 성공하면 스크립트 실행중 에러가 나지 않는다. 격렬한 리팩토링도 무섭지 않다.
  • 39. 사용자정의타입 • 클래스의 바인딩을 C++ 코드로 작성한다. • 스크립트에서 바로 멤버 변수를 읽고 쓸 수 있다. • 스크립트에서 바로 멤버 함수를 호출할 수 있다. 스크립트에서 직접 클래스를 선언하는 문법을 만들지 않았다.
  • 40. 멤버변수초기화 var 탈것서브어택 = AttackType() { 준비시간 = MinMax(40, 45), 공격액션 = "SubAttack" }; var 탈것서브어택 = AttackType(); 탈것서브어택.준비시간 = MinMax(40, 45); 탈것서브어택.공격액션 = "SubAttack"; • C#을 모방. • 복잡한 데이터 서술에 좋다. • 일반적인 데이터 로딩에도 활용할 수 있을 것 같다. =
  • 41. 파생스크립트 • 비슷한 AI들이 많다. • 다 따로 만들면 관리하기 어렵다. 아직 코드가 굳어지기 전에는 더욱. • 상속 같은 걸 끼얹나?
  • 42. 파생스크립트 • 스탠드얼론 AI 스크립트 – 모든 기능을 사용할 수 있다. – 행동의 절차를 서술한다. • 확장 스크립트 – extend XXXX; 로 시작한다. – Init 전역 함수만 만들 수 있다. – 수정이 필요한 설정이나 전역변수를 Init에서 변경한다.
  • 43. 파생스크립트 “예전 구조랑 똑같지 않나요?” • 한 AI = 한 파일이기 때문에 Copy&Paste가 부담 없다. • 스탠드얼론 AI 스크립트를 여러 종 둘 수 있다. • 특이한 구현이 일반적인 구현을 더럽히지 않는다. • 특히 보스 AI의 구현이 완전히 격리된다.
  • 44. 매뉴얼자동생성 • 바인딩 정보는 이미 다 가지고 있다. • 어떤 함수와 클래스가 있는지 html 파일로 출력하게 했다.
  • 45. 실행로그 • 그 틱에서 실행한 라인을 표시한다. • 브레이크포인트보다 훨씬 편하다. • 특히 여러 AI를 동시에 관찰할 때.
  • 46. 한글식별자 • 상당수의 함수에 주석이 필요 없었다.
  • 48. HFSM 언어: 아쉬운 것 주로 내부 구현
  • 49. 파서/타입체커/코드생성기가한몸 • 1-pass • Recursive Descent 파서의 재귀호출 과정에서 모든 작업을 수행 • 별 생각 없이 루아 컴파일러 구조를 모방한 것;;; 문법 바꾸거나 새로운 거 추가할 때 고생했다. 파스 트리를 먼저 생성하고 나서, 그 파스 트리를 해석해서 타입체크하고 바이트코드를 생성하는 것이 바람직할 듯.
  • 50. 정수형이없다 • 값으로 취급하는 내장 타입들: number, bool, string • HFSM number = C++ float • 이것도 별 생각 없이 루아 모방… C++ 코드에서 매번 캐스팅하기 은근히 귀찮다.
  • 51. 사용자정의타입은힙에만넣을수있다 • 스크립트에 바인딩하는 클래스는 ReferenceCounter 상속을 강제했다. • 별 생각 없이 자바 모방 아주 간단한 객체에도 스마트 포인터를 써야 하는 부담이 있다.
  • 52. 레지스터머신 • number/bool, string, object의 레지스터 3종 세트 • 전역변수가 점유하고 남는 레지스터 공간을 지역변수가 사용 스크립트 언어 안에서의 함수호출을 만들 수가 없네?; 레지스터 공간 추적하기도 엄청 까다롭네?; 스테이트 사이사이에 전역변수를 추가할 수가 없네?; 1-pass 컴파일러다 보니…
  • 53. 제네릭리스트구현 • ‘객체의 리스트’ 문법을 내장. • 리스트 구현은 한 벌만 짜고, 컴파일러 트릭으로 구현을 공유했다. • 문법은 파이썬, 구현은 자바를 모방 역시 별 생각이 없었다. 귀찮은 문제가 잡다하게 발생;; 타입 체크가 아주 복잡하다던가 리스트를 객체의 멤버로 넣을 수가 없다던가 내장 타입의 리스트를 만들 수가 없다던가 (더러운 박싱 언박싱…) var 일반공격1 = AttackType() { … }; var 일반공격2 = AttackType() { … }; var 일반공격목록 = [ 일반공격1, 일반공격2 ];
  • 54. 바인딩 • 템플릿+매크로 서커스 역시 별 생각이 없었다. 익숙한 대로 했을 뿐… • 읽기도 고치기도 어렵다. • 노출한 함수를 C++에서 호출하기 어렵다. 특수한 주석으로 추가하고, 코드생성 하는 게 낫지 않을까? (NDC’11 코드 생성을 사용해 개발 속도 높이기 / 김이선님 발표)
  • 55. 다시만든다면 • 스마트 포인터를 언어의 핵심에서 제거하고, • 모든 타입을 값으로 취급한다. The STL Way! • 스크립트 스택 메모리에 직접 객체를 할당하고 관리. • 제네릭도 제거한다. List<A>와 List<B>는 전혀 다른 타입으로 취급. • 레퍼런스 시맨틱을 쓰고 싶으면 스마트 포인터를 직접 바인딩하게 한다. C++와 심리스하게 붙는 스태틱 타입 스크립트 언어를 만들려면, 이게 가장 심플한 답이 아닐까…
  • 57. 코드핫로딩 • 실행 중 DLL 교체! • 간단히 적용 가능. DLL 빌드 대응이 되어 있지 않으면 좀 힘들겠지만…
  • 58. 자체제작스크립트언어 • 잘 쓰고 있다. • 의외로 만들기 어렵지 않았다. • 더 넓은 범위에서 써도 되지 않을까! • 내부 구현이 좀 아쉽다. 생각없이 베끼다 보니까…
  • 59. 게임 스크립트 언어, 만족하십니까?
  • 60. Q/A
  • 61.
  • 62. 명령어구조 • 컴파일하면 코드 뭉치와 각종 테이블이 나온다. 컴파일을 먼저 해서 배포하는 것을 염두에 둠. • 1 명령어 = 32비트. 19종류. 레지스터는 9비트. • 명령어의 맥락을 보고 3종류의 레지스터 중 어느 것을 쓸지 알 수 있다. 모르는 경우에는 명렁어 내부에 힌트를 인코딩해 넣어서 해결. • 함수호출이나 필드 액세스의 경우 별도의 테이블이 있고 명령어에는 테이블 인덱스만 저장. – 예) 함수호출: this 레지스터, 인자가 담긴 레지스터들, 리턴값을 담을 레지스터, 호출 직후에 yield할까 • 스트링/숫자 리터럴도 별도의 테이블에 넣고 명령어에는 테이블 인덱스만 저장.