이벤트 드리븐.pptx

M
이벤트 드리븐 아키텍쳐
DevRookie JINN
스터디 장소에 도착한 나.gif
먼저 온 사람
폴링? 이벤트?
왔는지 계속 체크한다
폴링(Pooling)
1. 성능 문제
폴링 방식은 주기적으로 상태를 체크해야하므로 성능 저하를 야기한다.
2. 정확성 문제
만약 잠깐 업데이트를 쉬는 사이에,
누군가 다녀갔다면 문 앞의 사람을 놓칠 수도 있다.
3. 자원 문제
문 앞에 사람이 없을 경우에도 계속해서 체크해야하므로 불필요하게 비효
율적이다.
이렇게 할 바에 그냥 도착하면 알려주세요…
헐리우드 원칙
•"Don't call us, we'll call you.“
우리한테 연락하지 마세요. 우리가 당신에게 연락할게요.
프로그래밍 측면에서 보았을 때
놀라울 정도로 효율적인 문 열어주는 시스템!
이벤트(Event)
탄생 배경
윈도우 프로그래밍
(Multi Task)
• 동시에 여러 프로그램 실행
• 다양한 이벤트 발생으로 흐름 예
측이 어려움
콘솔 프로그래밍
(Single Task)
• 한번에 하나의 프로그램만 실행
• 흐름을 예측할 수 있음
EDA(Event Driven Architecture)는
동시에 여러 프로그램이 실행되는 환경,
즉, 예측이 힘든 복잡한 상황에 대처하기위해 탄생했다.
Event
:일어나는 일
Driven
:특정 방향으로 몰고가다
Event-Driven
:어떤 일의 발생에 의해
특정 방향으로 가도록 된
Event Driven Architecture
이벤트에 의해 프로그램의 흐름이 결정되는 설계 방식
• 입력 (마우스, 키보드 등)
• 네트워크의 송수신
• 다른 프로그램으로부터의 메시지
• 기타 등등…
게임과 이벤트
게임이란 복잡함의 결정체
온갖 이벤트가 난무하는 이벤트 대환장 파티
고로 게임 역시 이벤트 주도 방식으로 돌아간다
게임에는 대게 A이벤트(ex:타격) 발생 시,
연관된 게임 객체(ex:몬스터)들에게 이벤트를 알
려주고,
그 객체들이 이벤트에 반응할 수 있도록 도와주
는 이벤트 핸들링 이라는 방식을 사용한다.
이렇게 이벤트와 이벤트 핸들링은
이벤트 주도 방식의 핵심 요소!
• 플레이어가 몬스터에게 가까이 다가간다.
• 몬스터가 플레이어를 발견한다.
• 플레이어가 몬스터를 타격한다
• 몬스터의 HP가 줄어든다
기타 등등 거의 모든 것들이 이벤트로서 발생하고 처리 됨
이벤트
이벤트는 간단하게 타입(Type) / 인자(Argument) 로 이뤄져있다
타입은 체력 수치 변동, 타격, 폭발, 아이템 획득과 같은 것들이고
인자는 해당 이벤트에 대한 구체적인 정보
Type : HP 수치 변동
Argument
대상 : 1번 플레이어
수치 : -10
이벤트는 함수의 인자로 넘기거나, 클래스로 만들어 넘기는 방식 등이 있음
이벤트 캡슐화
• 이벤트 캡슐화의 이점
1. 단일 이벤트 핸들러 함수
여러 이벤트 타입에 대해 void OnEvent(Event& event) 와 같은
가상함수 하나만 있다면 모든 이벤트 타입에 대해 처리가 가능
2. 재사용성
함수 호출 방식으로는 함수 리턴 이후, 이벤트 인자를 사용 불가능
나중에 처리되도록 지연처리 방식으로 사용할 수도 있고
복사해서 사용하는등 다방면으로 이점이 있음
3. 이벤트 핸들링 용이
이벤트를 수신한 객체가 이벤트에 대해 전혀 몰라도 사용할 수 있음
예를들어 ‘탈것을 내린다’ 라는 이벤트의 경우
탈것 자체가 내린다 라는 개념이 없어도
승객 객체에 전달하는 식으로 사용할 수 있음
인자를 아예 하드코딩으로 박아버릴 수도 있고
Variant를 이용해 구현하는 방식도 있으며
해당 방식의 경우 고정크기(인자 4개,8개, 12개…) 식으로
메모리 할당 오버헤드를 피할 수도 있음
이벤트 핸들러
• 객체가 이벤트(or 메시지,커맨드)를 받으면 어떤 식으로든 반응해야하는데
이 과정을 이벤트 핸들링이라고 부른다
이렇게 이벤트를 받아서 처리하는 함수를
‘핸들러’ 혹은 ‘콜백’ 이라 부른다
해당 코드와 같이 사용하게 될 경우 이벤트가 늘어날 수록
switch문이 기하 급수적으로 늘어남
윈도우 프로그래밍을 해보신 분이라면
뭔가 익숙한 모양새의 코드 일 것..
윈도우 메시지 역시 같은 방식으로 이벤트를 핸들링 한다
이벤트 주도 개발에 대해 어렵게 생각할 것 없이
윈도우도 이벤트 드리븐으로 이뤄졌다고 보면 됨
Switch문이 늘어나는게 싫다면
MFC의 메시지맵과 같은 방식을 적용할 수도 있음
핸들러 바인딩과 델리게이트
이렇게 만들어진 핸들러를 어디에선가 호출하게 되는데
구현이 호출 위치에 묶이기 때문에 바인딩(Binding)
동적인 환경에서 바인드를 변경 불가능하기 때문에
이벤트 핸들러를 정적 바인딩(Static Binding)했다고 부른다.
(#컴파일러에서의 타입 바인딩과는 다름)
하지만 보통 이벤트 드리븐에서
진짜로 원하는 방식은 ‘동적 바인딩’ 이다
보통 C#이나 다른 언어에서는 Delegate 등으로
동적 바인딩을 지원하지만, C++에서는
동적 바인딩을 자체적으로 구현해 사용해야한다
런타임중 바인딩 변경이 가능한 동적 바인딩( Delegate 방식 )
런타임중 바인딩 변경이 불가능한 정적 바인딩
생성자
중개자
이벤트
핸들러
(CallBack)
구독
이벤트 발생 소비자
소비자에 변경이 있어도
다른 곳에는 영향이 없다
이벤트 중개자와 구독 패턴
옵저버 패턴, 중개자 패턴, 구독 패턴등을 사용하여
확장성, 유연성등 여러 이점을 꾀할 수도 있고
앞서 설명했던 모든 객체를 돌며 검사해야하는 비효율도 회피 가능
이벤트 큐
보통은 이벤트가 보내진 즉시,
동기적으로 처리하는게 일반적이지만
모든 이벤트가 즉시 처리된다면,
이벤트 함수들이 불리는 순서는
예측 불가능하고 제어가 어려움
게임 객체들간의 이벤트 처리에는
순서에 민감한 영향을 받는 경우도 있기때문에
이를 위해 이벤트 큐를 사용함
생성자
중개자 핸들러
(CallBack)
이벤트 발생 소비자
이벤트 큐
이벤트
이벤트
이벤트
이벤트
이벤트 큐
타이머 이벤트 우선순위 고려
CallStack
...
Character::OnEvent()
Event::Send()
Audio::PlayeSound()
Car::OnEvent()
Event::Send()
Animaiton::PlayerAnimation()
Car::OnEvent()
Event::Send()
Character::OnEvent()
Event::Send()
Car::OnEvent()
Event::Send()
Character::OnEvent()
Event::Send()
Car::Update()
GameWorld::UpdateObject()
Engine::GameLoop()
main
이벤트 즉시 처리시 보게되는 콜 스택
이벤트 큐를 사용 시
타이머로 지연 처리를 시킬수도 있고,
우선순위를 통해 처리 순서를 보장해줄 수도 있다.
또한 콜스택이 간결해지는 효과도 볼 수 있음
데이터 드리븐과의 결합
그러나 여전히 이벤트를 보내고 받는 과정이 모두 하드코딩 되어있어,
모든 이벤트의 관리의 책임은 프로그래머의 일.
이벤트 주도 개발 시, 프로그래머는 언어가 지원하는
정적 바인딩 방식을 뛰어넘는 유연성을 가지는 이점이 있다
하지만 데이터 드리븐 방식을 결합하여
데이터에 의해, 이벤트가 실행되게 만든다면?
정리
• 이벤트 드리븐에 대해 각자 해석이 다 다르다. 헷갈린다.
EDA, EDP, EDD 등등 용어도 많다.
• 이벤트 드리븐 아키텍쳐는 이벤트에 의해 흐름이 결정되도록 만드는
개발 방식을 말한다.
• 알게 모르게 전부 이벤트 드리븐으로 동작한다
(OS, 게임, GUI 등등)
• 언리얼도 고급진 이벤트 드리븐 시스템이 구축되어있다
참고자료
• https://www.youtube.com/watch?v=XohG9yQe3Ps&t=167s&a
b_channel=SystemsInnovation
• https://heeonii.tistory.com/3
• https://www.slideshare.net/agebreak/ss-133792919
• 게임엔진 아키텍쳐
1 de 17

Recomendados

온라인 게임 처음부터 끝까지 동적언어로 만들기 por
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기Seungjae Lee
7.7K visualizações62 slides
Ddd start 10장 por
Ddd start 10장Ddd start 10장
Ddd start 10장Sunggon Song
396 visualizações28 slides
Cep 소개 - for developers por
Cep 소개 - for developersCep 소개 - for developers
Cep 소개 - for developersJuhyeon Lee
17.5K visualizações63 slides
9주 dom & event advanced por
9주  dom & event advanced9주  dom & event advanced
9주 dom & event advanced지수 윤
567 visualizações45 slides
More effective c++ chapter3 4 por
More effective c++ chapter3 4More effective c++ chapter3 4
More effective c++ chapter3 4Dong Chan Shin
352 visualizações30 slides
자바병렬프로그래밍 9.gui 애플리케이션 por
자바병렬프로그래밍 9.gui 애플리케이션자바병렬프로그래밍 9.gui 애플리케이션
자바병렬프로그래밍 9.gui 애플리케이션Choonghyun Yang
1.1K visualizações21 slides

Mais conteúdo relacionado

Similar a 이벤트 드리븐.pptx

Android와 Flutter 앱 개발의 큰 차이점 5가지 por
Android와 Flutter 앱 개발의 큰 차이점 5가지Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지Bansook Nam
9.1K visualizações56 slides
Modern android por
Modern androidModern android
Modern androidLeonardo YongUk Kim
2.8K visualizações85 slides
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규 por
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규ChangKyu Song
3.2K visualizações92 slides
외계어 스터디 4/5 Event & Library por
외계어 스터디 4/5 Event & Library외계어 스터디 4/5 Event & Library
외계어 스터디 4/5 Event & Library민태 김
3.9K visualizações53 slides
[E6]2012. netty internals por
[E6]2012. netty internals[E6]2012. netty internals
[E6]2012. netty internalsNAVER D2
8.7K visualizações20 slides
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발 por
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발동현 김
2.2K visualizações61 slides

Similar a 이벤트 드리븐.pptx(20)

Android와 Flutter 앱 개발의 큰 차이점 5가지 por Bansook Nam
Android와 Flutter 앱 개발의 큰 차이점 5가지Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지
Bansook Nam9.1K visualizações
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규 por ChangKyu Song
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
ChangKyu Song3.2K visualizações
외계어 스터디 4/5 Event & Library por 민태 김
외계어 스터디 4/5 Event & Library외계어 스터디 4/5 Event & Library
외계어 스터디 4/5 Event & Library
민태 김3.9K visualizações
[E6]2012. netty internals por NAVER D2
[E6]2012. netty internals[E6]2012. netty internals
[E6]2012. netty internals
NAVER D28.7K visualizações
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발 por 동현 김
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
[HYSS 2016] 쉽고 빠르게 시작하는 Volatility Plugin 개발
동현 김2.2K visualizações
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB) por NAVER D2
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
NAVER D24.5K visualizações
More effective c++ chapter4 이후 항목 29까지 por Dong Chan Shin
More effective c++ chapter4 이후 항목 29까지More effective c++ chapter4 이후 항목 29까지
More effective c++ chapter4 이후 항목 29까지
Dong Chan Shin394 visualizações
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic) por Dong Chan Shin
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
Dong Chan Shin2.8K visualizações
Windows via c++ part 1 por Shin heemin
Windows via c++ part 1Windows via c++ part 1
Windows via c++ part 1
Shin heemin101 visualizações
Effective c++ chapter3, 4 요약본 por Dong Chan Shin
Effective c++ chapter3, 4 요약본Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본
Dong Chan Shin2.8K visualizações
2013 11 unity3 d integration google play game services(남경수) por 경수 남
2013 11 unity3 d integration google play game services(남경수)2013 11 unity3 d integration google play game services(남경수)
2013 11 unity3 d integration google play game services(남경수)
경수 남2.4K visualizações
Event storming based msa training commerce example add_handson_v3 por uEngine Solutions
Event storming based msa training commerce example add_handson_v3Event storming based msa training commerce example add_handson_v3
Event storming based msa training commerce example add_handson_v3
uEngine Solutions1.2K visualizações
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰 por 승민 백
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
승민 백11.4K visualizações
Effective c++ 1~8장 por Shin heemin
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장
Shin heemin535 visualizações
05_스마트 포인터 구현하기 por noerror
05_스마트 포인터 구현하기05_스마트 포인터 구현하기
05_스마트 포인터 구현하기
noerror769 visualizações
윈도우 매니저 스터디: 3. 윈도우 매니저 입력 por nemoux
윈도우 매니저 스터디: 3. 윈도우 매니저 입력윈도우 매니저 스터디: 3. 윈도우 매니저 입력
윈도우 매니저 스터디: 3. 윈도우 매니저 입력
nemoux1.7K visualizações
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019 por min woog kim
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim3.2K visualizações
FP, lazy evaluation por 성범 홍
FP, lazy evaluation FP, lazy evaluation
FP, lazy evaluation
성범 홍47 visualizações

Mais de MUUMUMUMU

Recast Detour.pptx por
Recast Detour.pptxRecast Detour.pptx
Recast Detour.pptxMUUMUMUMU
88 visualizações35 slides
언리얼 애니메이션.pptx por
언리얼 애니메이션.pptx언리얼 애니메이션.pptx
언리얼 애니메이션.pptxMUUMUMUMU
16 visualizações22 slides
언리얼 리플렉션 & CDO.pptx por
언리얼 리플렉션 & CDO.pptx언리얼 리플렉션 & CDO.pptx
언리얼 리플렉션 & CDO.pptxMUUMUMUMU
20 visualizações28 slides
DevRookie 메모리 최적화.pptx por
DevRookie 메모리 최적화.pptxDevRookie 메모리 최적화.pptx
DevRookie 메모리 최적화.pptxMUUMUMUMU
12 visualizações19 slides
DevRookie 언리얼 인터렉션 폴리지.pptx por
DevRookie 언리얼 인터렉션 폴리지.pptxDevRookie 언리얼 인터렉션 폴리지.pptx
DevRookie 언리얼 인터렉션 폴리지.pptxMUUMUMUMU
26 visualizações25 slides
DevRookie 언리얼 EQS.pptx por
DevRookie 언리얼 EQS.pptxDevRookie 언리얼 EQS.pptx
DevRookie 언리얼 EQS.pptxMUUMUMUMU
10 visualizações9 slides

Mais de MUUMUMUMU(11)

Recast Detour.pptx por MUUMUMUMU
Recast Detour.pptxRecast Detour.pptx
Recast Detour.pptx
MUUMUMUMU88 visualizações
언리얼 애니메이션.pptx por MUUMUMUMU
언리얼 애니메이션.pptx언리얼 애니메이션.pptx
언리얼 애니메이션.pptx
MUUMUMUMU16 visualizações
언리얼 리플렉션 & CDO.pptx por MUUMUMUMU
언리얼 리플렉션 & CDO.pptx언리얼 리플렉션 & CDO.pptx
언리얼 리플렉션 & CDO.pptx
MUUMUMUMU20 visualizações
DevRookie 메모리 최적화.pptx por MUUMUMUMU
DevRookie 메모리 최적화.pptxDevRookie 메모리 최적화.pptx
DevRookie 메모리 최적화.pptx
MUUMUMUMU12 visualizações
DevRookie 언리얼 인터렉션 폴리지.pptx por MUUMUMUMU
DevRookie 언리얼 인터렉션 폴리지.pptxDevRookie 언리얼 인터렉션 폴리지.pptx
DevRookie 언리얼 인터렉션 폴리지.pptx
MUUMUMUMU26 visualizações
DevRookie 언리얼 EQS.pptx por MUUMUMUMU
DevRookie 언리얼 EQS.pptxDevRookie 언리얼 EQS.pptx
DevRookie 언리얼 EQS.pptx
MUUMUMUMU10 visualizações
DevRookie 언리얼 에셋과 패키지.pptx por MUUMUMUMU
DevRookie 언리얼 에셋과 패키지.pptxDevRookie 언리얼 에셋과 패키지.pptx
DevRookie 언리얼 에셋과 패키지.pptx
MUUMUMUMU29 visualizações
DevRookie 언리얼 군중 애니메이션.pptx por MUUMUMUMU
DevRookie 언리얼 군중 애니메이션.pptxDevRookie 언리얼 군중 애니메이션.pptx
DevRookie 언리얼 군중 애니메이션.pptx
MUUMUMUMU21 visualizações
DevRookie 리펙터링.pptx por MUUMUMUMU
DevRookie 리펙터링.pptxDevRookie 리펙터링.pptx
DevRookie 리펙터링.pptx
MUUMUMUMU8 visualizações
DevRookie 플로킹 알고리즘.pptx por MUUMUMUMU
DevRookie 플로킹 알고리즘.pptxDevRookie 플로킹 알고리즘.pptx
DevRookie 플로킹 알고리즘.pptx
MUUMUMUMU19 visualizações
Dev Rookie 파이썬 GUI.pptx por MUUMUMUMU
Dev Rookie 파이썬 GUI.pptxDev Rookie 파이썬 GUI.pptx
Dev Rookie 파이썬 GUI.pptx
MUUMUMUMU22 visualizações

이벤트 드리븐.pptx

  • 3. 먼저 온 사람 폴링? 이벤트? 왔는지 계속 체크한다 폴링(Pooling) 1. 성능 문제 폴링 방식은 주기적으로 상태를 체크해야하므로 성능 저하를 야기한다. 2. 정확성 문제 만약 잠깐 업데이트를 쉬는 사이에, 누군가 다녀갔다면 문 앞의 사람을 놓칠 수도 있다. 3. 자원 문제 문 앞에 사람이 없을 경우에도 계속해서 체크해야하므로 불필요하게 비효 율적이다. 이렇게 할 바에 그냥 도착하면 알려주세요…
  • 4. 헐리우드 원칙 •"Don't call us, we'll call you.“ 우리한테 연락하지 마세요. 우리가 당신에게 연락할게요. 프로그래밍 측면에서 보았을 때 놀라울 정도로 효율적인 문 열어주는 시스템! 이벤트(Event)
  • 5. 탄생 배경 윈도우 프로그래밍 (Multi Task) • 동시에 여러 프로그램 실행 • 다양한 이벤트 발생으로 흐름 예 측이 어려움 콘솔 프로그래밍 (Single Task) • 한번에 하나의 프로그램만 실행 • 흐름을 예측할 수 있음 EDA(Event Driven Architecture)는 동시에 여러 프로그램이 실행되는 환경, 즉, 예측이 힘든 복잡한 상황에 대처하기위해 탄생했다.
  • 6. Event :일어나는 일 Driven :특정 방향으로 몰고가다 Event-Driven :어떤 일의 발생에 의해 특정 방향으로 가도록 된 Event Driven Architecture 이벤트에 의해 프로그램의 흐름이 결정되는 설계 방식 • 입력 (마우스, 키보드 등) • 네트워크의 송수신 • 다른 프로그램으로부터의 메시지 • 기타 등등…
  • 7. 게임과 이벤트 게임이란 복잡함의 결정체 온갖 이벤트가 난무하는 이벤트 대환장 파티 고로 게임 역시 이벤트 주도 방식으로 돌아간다 게임에는 대게 A이벤트(ex:타격) 발생 시, 연관된 게임 객체(ex:몬스터)들에게 이벤트를 알 려주고, 그 객체들이 이벤트에 반응할 수 있도록 도와주 는 이벤트 핸들링 이라는 방식을 사용한다. 이렇게 이벤트와 이벤트 핸들링은 이벤트 주도 방식의 핵심 요소! • 플레이어가 몬스터에게 가까이 다가간다. • 몬스터가 플레이어를 발견한다. • 플레이어가 몬스터를 타격한다 • 몬스터의 HP가 줄어든다 기타 등등 거의 모든 것들이 이벤트로서 발생하고 처리 됨
  • 8. 이벤트 이벤트는 간단하게 타입(Type) / 인자(Argument) 로 이뤄져있다 타입은 체력 수치 변동, 타격, 폭발, 아이템 획득과 같은 것들이고 인자는 해당 이벤트에 대한 구체적인 정보 Type : HP 수치 변동 Argument 대상 : 1번 플레이어 수치 : -10 이벤트는 함수의 인자로 넘기거나, 클래스로 만들어 넘기는 방식 등이 있음
  • 9. 이벤트 캡슐화 • 이벤트 캡슐화의 이점 1. 단일 이벤트 핸들러 함수 여러 이벤트 타입에 대해 void OnEvent(Event& event) 와 같은 가상함수 하나만 있다면 모든 이벤트 타입에 대해 처리가 가능 2. 재사용성 함수 호출 방식으로는 함수 리턴 이후, 이벤트 인자를 사용 불가능 나중에 처리되도록 지연처리 방식으로 사용할 수도 있고 복사해서 사용하는등 다방면으로 이점이 있음 3. 이벤트 핸들링 용이 이벤트를 수신한 객체가 이벤트에 대해 전혀 몰라도 사용할 수 있음 예를들어 ‘탈것을 내린다’ 라는 이벤트의 경우 탈것 자체가 내린다 라는 개념이 없어도 승객 객체에 전달하는 식으로 사용할 수 있음 인자를 아예 하드코딩으로 박아버릴 수도 있고 Variant를 이용해 구현하는 방식도 있으며 해당 방식의 경우 고정크기(인자 4개,8개, 12개…) 식으로 메모리 할당 오버헤드를 피할 수도 있음
  • 10. 이벤트 핸들러 • 객체가 이벤트(or 메시지,커맨드)를 받으면 어떤 식으로든 반응해야하는데 이 과정을 이벤트 핸들링이라고 부른다 이렇게 이벤트를 받아서 처리하는 함수를 ‘핸들러’ 혹은 ‘콜백’ 이라 부른다 해당 코드와 같이 사용하게 될 경우 이벤트가 늘어날 수록 switch문이 기하 급수적으로 늘어남 윈도우 프로그래밍을 해보신 분이라면 뭔가 익숙한 모양새의 코드 일 것.. 윈도우 메시지 역시 같은 방식으로 이벤트를 핸들링 한다 이벤트 주도 개발에 대해 어렵게 생각할 것 없이 윈도우도 이벤트 드리븐으로 이뤄졌다고 보면 됨 Switch문이 늘어나는게 싫다면 MFC의 메시지맵과 같은 방식을 적용할 수도 있음
  • 11. 핸들러 바인딩과 델리게이트 이렇게 만들어진 핸들러를 어디에선가 호출하게 되는데 구현이 호출 위치에 묶이기 때문에 바인딩(Binding) 동적인 환경에서 바인드를 변경 불가능하기 때문에 이벤트 핸들러를 정적 바인딩(Static Binding)했다고 부른다. (#컴파일러에서의 타입 바인딩과는 다름) 하지만 보통 이벤트 드리븐에서 진짜로 원하는 방식은 ‘동적 바인딩’ 이다 보통 C#이나 다른 언어에서는 Delegate 등으로 동적 바인딩을 지원하지만, C++에서는 동적 바인딩을 자체적으로 구현해 사용해야한다 런타임중 바인딩 변경이 가능한 동적 바인딩( Delegate 방식 ) 런타임중 바인딩 변경이 불가능한 정적 바인딩
  • 12. 생성자 중개자 이벤트 핸들러 (CallBack) 구독 이벤트 발생 소비자 소비자에 변경이 있어도 다른 곳에는 영향이 없다 이벤트 중개자와 구독 패턴 옵저버 패턴, 중개자 패턴, 구독 패턴등을 사용하여 확장성, 유연성등 여러 이점을 꾀할 수도 있고 앞서 설명했던 모든 객체를 돌며 검사해야하는 비효율도 회피 가능
  • 13. 이벤트 큐 보통은 이벤트가 보내진 즉시, 동기적으로 처리하는게 일반적이지만 모든 이벤트가 즉시 처리된다면, 이벤트 함수들이 불리는 순서는 예측 불가능하고 제어가 어려움 게임 객체들간의 이벤트 처리에는 순서에 민감한 영향을 받는 경우도 있기때문에 이를 위해 이벤트 큐를 사용함 생성자 중개자 핸들러 (CallBack) 이벤트 발생 소비자 이벤트 큐 이벤트 이벤트 이벤트 이벤트
  • 14. 이벤트 큐 타이머 이벤트 우선순위 고려 CallStack ... Character::OnEvent() Event::Send() Audio::PlayeSound() Car::OnEvent() Event::Send() Animaiton::PlayerAnimation() Car::OnEvent() Event::Send() Character::OnEvent() Event::Send() Car::OnEvent() Event::Send() Character::OnEvent() Event::Send() Car::Update() GameWorld::UpdateObject() Engine::GameLoop() main 이벤트 즉시 처리시 보게되는 콜 스택 이벤트 큐를 사용 시 타이머로 지연 처리를 시킬수도 있고, 우선순위를 통해 처리 순서를 보장해줄 수도 있다. 또한 콜스택이 간결해지는 효과도 볼 수 있음
  • 15. 데이터 드리븐과의 결합 그러나 여전히 이벤트를 보내고 받는 과정이 모두 하드코딩 되어있어, 모든 이벤트의 관리의 책임은 프로그래머의 일. 이벤트 주도 개발 시, 프로그래머는 언어가 지원하는 정적 바인딩 방식을 뛰어넘는 유연성을 가지는 이점이 있다 하지만 데이터 드리븐 방식을 결합하여 데이터에 의해, 이벤트가 실행되게 만든다면?
  • 16. 정리 • 이벤트 드리븐에 대해 각자 해석이 다 다르다. 헷갈린다. EDA, EDP, EDD 등등 용어도 많다. • 이벤트 드리븐 아키텍쳐는 이벤트에 의해 흐름이 결정되도록 만드는 개발 방식을 말한다. • 알게 모르게 전부 이벤트 드리븐으로 동작한다 (OS, 게임, GUI 등등) • 언리얼도 고급진 이벤트 드리븐 시스템이 구축되어있다