분류 전체보기 190

IL2CPP가 Virtual Call과 Boxing을 처리하는 방법

이 글의 정보들은 2016년에 작성된 글을 기반으로 함. 따라서 2023년 현재 바뀐 부분이 있을 수 있음. Devirtualization 당연한 얘기지만, Virtual Call은 Direct Call보다 더 느리다. 따라서 일부 컴파일러는 Virtual Call을 Direct Call로 바꾸는 Devirtualization 기법을 사용하기도 한다. 단, 해당 코드가 컴파일 타임에 어떤 메서드를 실행시킬지를 판단할 수 있어야 한다. 이는 IL2CPP도 마찬가지이다. 다만 IL2CPP는 최적화에 보수적이기 때문에... var dog = new Dog(); //Dog는 Animal 클래스를 상속함. dog.Speak(); 위와 같은 상황에서도 Virtual Call을 호출하는 C++코드를 만들어낸다. (2..

Decision Learning(1) - Naive Bayes Classifiers

개요 의사 결정 학습 중 가장 먼저 시도해야봐야 할 것은 나이브 베이즈 분류기(Naive Bayes Classifiers)이다. 이건 구현하기도 쉽고 성능도 좋아서 학문적인 연구에서도 sanity check용으로 씀. 심지어는 많은 머신 러닝 연구들이 얘보다 못하기도 하다. 데이터 운전 중 코너링을 할 때 브레이크를 어디서 밟을지 학습하는 경우를 생각해보자. 이 때 AI는 플레이어의 실제 주행 데이터를 가지고 학습할 수 있다. 플레이어의 실제 주행에서 (브레이크 여부 / 코너까지 거리 / 현재 속도)를 기록할 수 있고, 다음과 같은 데이터가 나왔다고 가정해보자. brake? distance speed ON 2 11 ON 4 70 OFF 65 80 ON 86 84 OFF 8.2 12.5 OFF 81 14...

Game AI 2023.11.12

Learning (3) - 플레이어 행동 예측

개요 플레이어의 행동을 예측하는 것은 여러 성향의 플레이어들에게 대항하는 AI를 만드는 데 도움이 된다. 많은 연구 결과에 따르면 인간은 무작위로 행동하는데 잼병이라 이를 이용하여 플레이어의 행동을 어느정도 예측할 수 있다. 예제로 간단하게 플레이어가 왼쪽을 고르는지, 오른쪽을 고르는지 맞추는 게임이 있다고 하자. 그렇다면 플레이어의 행동을 다음과 같은 방법으로 예측해볼 수 있다. 그냥 확률로 계산 그냥 지금까지 통계적으로 플레이어가 어떤 행동을 했는지를 이용하는 것. 이 방법은 구현이 매우 간단하지만, 플레이어가 이를 눈치채고 다르게 행동할 가능성이 높다. N-Gram 플레이어가 왼쪽을 골랐으면 "L" 오른쪽을 골랐으면 "R"이라는 문자를 이용하여 플레이어가 지금까지 한 행동을 문자열로 표현할 수 있다..

Game AI 2023.10.29

Learning (2) - 파라미터 학습

파라미터 학습 가장 쉬운 학습 알고리즘은 여러 개의 파라미터들의 값을 바꾸는 것. steering 알고리즘이나, 길찾기 알고리즘등에서 사용되는 magic number가 대표적인 예이다. 의사 결정 확률등을 조금 변화시키는 것도 AI동작을 크게 다르게 할 수 있다. 이처럼 파라미터들은 학습하기 좋은 대상이다. 파라미터 그래프 파라미터를 학습할 때, 파라미터 값에 따라 점수를 매길 수 있어야 한다. 점수는 AI에서 해당 파라미터 값이 얼마나 좋은지를 의미한다. 파라미터가 단 하나라면 위 그림처럼 2차원 그래프가 나오겠지만 파라미터가 여러 개라면 다 차원의 그래프가 나올 수 있다. 이런 경우 파라미터 값들의 집합에 따라 점수를 매길 수 있다. 파라미터 학습하기 만약 점수와 값의 그래프가 미분 가능하다면, 그냥..

Game AI 2023.10.22

Learning (1) - 기초

오프라인 및 온라인 학습 플레이어가 게임을 하는 중에도 AI는 학습할 수 있는데, 이런 걸 온라인 학습이라고 부른다. 온라인 학습은 플레이어의 행동에 따라 동적으로 대응이 가능하다는 장점이 있다. 그러나 온라인 학습은 행동의 예측이나 테스트가 어렵다는 단점이 있음. 만약 버그라도 발생했다? 이슈 재현부터 쉽지 않음. 대부분의 게임 AI에서 학습은 오프라인임. 어떤 지형에서 정확한 길찾기나 이동에 관한 정보를 학습한다든지, 물리 엔진을 이용하여 상호작용하는 것을 학습한다든지 할 때 많이 쓰인다. 로딩 중에 학습하는 것도 오프라인이지만 온라인 학습의 단점을 동일하게 지닌다고 보면 됨. . 행동 내부 학습 intra-behavior learning 학습 중에 가장 간단한 부류로, 캐릭터의 행동 중 작은 부분을..

Game AI 2023.10.09

CLR? .NET? Mono?

선 정리 CTS, CLS는 닷넷 호환 언어가 지켜야하는 규약 닷넷 호환 언어는 CIL을 만들어낸다. CIL을 가지고 어떡할지에 대한 규격이 CLI CLI를 구현한 것이 CLR, Mono 닷넷 코어, 닷넷 프레임워크 등은 CLI 구현체 (ex. CLR)을 포함하고 추가적인 기능 제공 CIL CIL(Common Intermediate Language)는 그냥 IL이라고도 쓴다. IL코드는 CPU에 독립적인 결과물이다. 닷넷 호환 언어들은 소스코드를 IL로 컴파일하고, CLR같은 애들이 IL 코드를 CPU기계어로 최종 번역한다. . CTS CTS(Common Type System)는 닷넷 호환 언어가 뭘 구현할 수 있느냐를 정의한 규격. 가령 CTS에서는 다중 상속을 지원하지 않기 때문에 CTS를 만족하는 언..

언어/C# 2023.10.01

게임 네트워크 - 보안

패킷 스니핑 중간자 공격을 막기 위해서는 민감한 데이터를 암호화해야 한다. 평범한 리플리케이션 같은 정도라면 중간자가 감청해봤자 별 소용이 없을 것이다. 그럼에도 패킷 스니핑 측면에서는 암호화도 고려할만 한다. 모든 네트워크 게임은 호스트 머신에서 수행하는 패킷 스니핑에 노출되어 있다고 봐야 한다. 아무리 암호화를 해도 실행 파일 어딘가에는 암호를 해독하는 체계가 있을 것이고 이런 체계를 밝히는 것은 시간 문제이다. 그럼에도 잠재적인 치터가 분석하기 어렵도록 암호화를 하는 게 좋다. 더 나아가 암호 키와 메모리 오프셋을 주기적으로 변경하는것이 좋은데, 치터를 귀찮게 할 수 있기 때문이다. 어쨋든 결국에 암호화는 뚫릴 것이기 때문에 호스트에게 내려주는 정보를 제한하는 것도 하나의 방법이다. (ex. FPS..

이론/네트워크 2023.09.17

네트워크 - 스코프

객체 스코프 멀리 떨어져서 알 필요 없는 플레이어의 정보를 동기화 하는것은 리소스 낭비이다. 따라서 어떤 객체가 특정 클라이언트의 동기화 대상이라면, 해당 객체가 클라이언트의 스코프 내에 있다 혹은 해당 클라이언트와 연관성(relevancy)이 있다라고 표현할 수 있다. 스코프를 나눌 때, 얼마나 떨어져 있는지를 기준으로 쓸 수 있다. 그러나 FPS의 줌같은 개념때문에 거리만 가지고 판단하는것은 애매하다. 또 벽 뒤나 등 뒤에 있는 객체들은 거리만 가지고 판단하기 애매한데, 그래서 가시성을 객체 스코프 판정에 활용하기도 한다. . 스태틱 존 스코프에 포함되는 잠재적인 객체 수를 줄이는 방법 중 하나로, 월드를 고정된 여러 지역으로 나눌 수 있다. 이렇게 나준 지역을 스태틱 존이라고 한다. 가령 MMORP..

이론/네트워크 2023.09.10