분류 전체보기 187

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

네트워크 - 레이턴시 및 신뢰성

레이턴시 레이턴시 원인 네트워크가 아닌 레이턴시로 입력 샘플링, 랜더링, 인풋렉 등등이 있을 수 있다. 네트워크에 해당하는 레이턴시에는 다음 지연들이 포함된다. 처리 지연 : 네트워크 주소 변환이나 암호화 => 요즘 라우터 성능이 좋아서 크게 신경쓰지 않아도.. 전송 지연 : 물리적 매체에 비트를 기록하는 시간. => 서버의 물리적 위치 조정이나, 패킷을 가능한 크게 만들어서 헤더 비중이 적게 만들어 개선할 수 있음. 큐잉 지연 : 라우터의 처리 용량보다 많은 패킷이 도착했을 때 큐잉해놓고 나중에 처리. 이때 대기열에 머무르는 시간 => 적은 수의 큰 패킷을 보내는게 유리하다. 전파 지연 : 매체를 타고 전파되는데 걸리는 시간. => 일단 물리적 거리를 가깝게 할 수 있음. 그러나 라우터등의 배치에 따라..

이론/기초 2023.09.01

게임 네트워크 토폴로지

개요 네트워크 토폴로지란 여러 컴퓨터가 네트워크상에서 연결되어 있는 모습을 말한다. 대표적으로 클라이언트 - 서버 P2P 가 있으며, 둘을 섞은 토폴로지도 존재한다. . 클라이언트 - 서버(CS) CS 토폴로지에서는 게임 인스턴스 하나를 서버로 두고 나머지 게임 인스턴스는 그 서버에 접속하는 클라이언트가 된다. 각 클라이언트는 오직 서버하고만 통신하며, 서버는 이들 모든 클라와 통신을 전담한다. 클라가 n개면 O(2n)개의 연결이 존재하게 된다. 각 클라가 초당 b바이트 데이터를 보낸다면, 초당 b*n 바이트를 수신할 수 있도록 서버의 대역폭을 확보해야 한다. 즉, 클라가 증가할수록 서버의 대역폭도 선형으로 늘어난다. 클라이언트가 받는 데이터의 양도 작게나마 늘어나긴 한다. 받아야 하는 데이터가 많아지기..

이론/기초 2023.08.27

OS - 라이브러리

라이브러리 여러 프로그램에서 자주 사용하는 함수와 데이터들을 실행이 가능한 바이너리 형태로 묶어놓은 파일을 의미한다. 다음 코드를 보자 #include int main() { printf("Hello"); return 0; } 실행 가능한 printf 함수의 바이너리는 어디에 있을까? stdio.h에 있을까? 그 안에 존재하는 것은 printf함수의 정의가 아니라 선언이다. 그럼 어디에있음? "라이브러리"에 있다. 라이브러리는 정적 라이브러리랑 동적 연결 (Dynamic link)라이브러리로 나눌 수 있다. . 정적 라이브러리(static library) static library를 만드는 상상을 해보자. 헤더에 함수를 선언하고, 적절히 정의도 해놨다. foo.h / foo.cpp 이렇게하고 컴파일 돌리..

이론/기초 2023.08.20