프로그래밍/General 64

유한상태머신(FSM)으로 텍스트 젤다의 전설 만들기

유한상태머신이란? 유한 상태 기계(finite-state machine, FSM) 또는 유한 오토마톤(finite automaton, FA; 복수형: 유한 오토마타 finite automata)는 컴퓨터 프로그램과 전자 논리 회로를 설계하는 데에 쓰이는 수학적 모델이다. 간단히 '상태 기계'라고 부르기도 한다. 유한 상태 기계는 유한한 개수의 상태를 가질 수 있는 오토마타, 즉 추상 기계라고 할 수 있다. 이러한 기계는 한 번에 오로지 하나의 상태만을 가지게 되며, 현재 상태(Current State)란 임의의 주어진 시간의 상태를 칭한다. 이러한 기계는 어떠한 사건(Event)에 의해 한 상태에서 다른 상태로 변화할 수 있으며, 이를 전이(Transition)이라 한다. 특정한 유한 오토마톤은 현재 상..

Android Studio Custom Shortcuts

Tool Windows Logcat: Cmd + 8 App Inspection: Cmd + 4 Window > Editor Tabs 오른쪽으로 창 나누기(Split and Move Right): Option + Cmd + 방향키(우) 하단으로 창 나누기(Split and Move Down): Option + Cmd + 방향키(하) 다음 창으로 이동(Goto Next Splitter): Option + Cmd + ] 이전 창으로 이동(Goto Previous Splitter): Option + Cmd + [ 창 합치기(Unsplit All): Option + Cmd + U 현재 탕의 다른 탭 닫기(Close Other Tabs): Option + Cmd + W

[VideoJS] 영상 타임라인에 프리뷰를 표시하는 방법

유튜브나 트위치에서 SeekBar에 마우스를 가져다대면, 특정 주기마다 영상 프리뷰가 살짝살짝씩 보인다. 당연히 될거라고 생각했던 기능이지만 이 프리뷰는 (당연히 ㅎㅎ) 손수 만들어주어야한다. 과정은 다음과 같다. 1. 영상을 특정 Interval 마다 잘라서 썸네일을 만든다. 2. 만들어진 썸네일을 한 장의 Sprite 이미지로 만든다. 3. VideoJS에 videojs-sprite-thumbnails Plugin을 적용해서 Sprite를 영상에 설정해준다. 나는 ts파일이 이미 10초 단위로 쪼개져있었기 때문에 폴더안의 모든 파일을 돌면서 한 장씩 썸네일을 만들어주었다. ffmpeg -i -s 160x90 -vframes 1 .jpg 그리고 만들어진 사진들을 imagemagick의 montage를 ..

멀티 플레이 게임서버 구현 4편: 지연 보정

들어가며 이 글은 https://www.gabrielgambetta.com/lag-compensation.html의 글을 공부하면서 옮긴 것으로, 번역과 의역이 섞여있습니다. 이전 3편에 걸친 글에서 다룬 클라이언트 - 서버 아키텍쳐에대한 설명은 다음과 같이 요약할 수 있습니다. 서버는 모든 클라이언트에서 타임스탬프와 함께 입력을 받습니다. 서버는 입력을 처리하고 월드 상태를 업데이트 합니다. 서버는 모든 클라이언트에게 정기적으로 월드 스냅샷을 전송합니다. 클라이언트는 입력을 전송하고 로컬에서 그것을 시뮬레이션 합니다. 클라이언트는 월드를 업데이트 받고 로컬에서 예측한 상태를 서버에서 받은 상태와 동기화 합니다. 다른 엔티티의 과거 상태를 보간합니다. 플레이어의 관점에서 이것은 2가지 중요한 결과를 가져..

멀티플레이 게임서버 구현 3편: 엔티티 인터폴레이션

들어가며 이 글은 https://www.gabrielgambetta.com/entity-interpolation.html의 글을 공부하면서 옮긴 것으로, 번역과 의역이 섞여있습니다. 이번에는 동일한 서버에서 다른 플레이어가 컨트롤하는 캐릭터에 대해서 탐구해보겠습니다. 서버 타임 스텝(Server time step) 이전 글에서 서버의 동작은 비교적 간단했습니다. 클라이언트가 주는 입력을 받아서 게임 상태를 업데이트하고 다시 돌려주면 되었죠. 하지만 여러 클라이언트가 연결된 경우, 메인 서버 루프는 다소 달라집니다. 이 시나리오에서는 여러 클라이언트가 동시에, 그리고 빠른 속도로 연이어 입력을 보낼 수 있습니다. 모든 클라이언트에서 입력이 수신될 때마다 게임 월드를 업데이트하고 게임 상태를 브로드캐스트 하..

멀티 플레이 게임서버 구현 2편: 클라이언트측 예측과 서버측 재조정

들어가며 이 글은 https://www.gabrielgambetta.com/client-side-prediction-server-reconciliation.html 글을 공부하면서 옮긴 것으로, 번역과 의역이 섞여있습니다. 이전 글에서는 권위 있는 서버와 입력만 서버로 보내고 서버가 업데이트된 게임 상태를 보낼 때까지 렌더링하는 멍청한 클라이언트를 가진 클라이언트-서버 모델을 알아보았습니다. 그러나 이런 시스템을 그냥 구현하게 되면 사용자 입력과 화면 변경 사이에 지연이 발생하게 됩니다. 예를 들어, 플레이어가 오른쪽 화살표 키를 누르면 캐릭터가 움직이기 시작하기 전에 0.5초 정도의 시간이 걸립니다. 이는 클라이언트 입력이 먼저 서버로 이동하고, 서버가 입력을 처리하고 새로운 상태를 계산하며, 업데이트..

멀티플레이 게임서버 구현 1편: 클라이언트 - 서버 게임 아키텍쳐

들어가며 이 글은 https://www.gabrielgambetta.com/client-server-game-architecture.html 글을 공부하면서 옮긴 것으로, 번역과 의역이 섞여있습니다. 어떤 종류든 게임을 개발하는 것 자체가 어려운 일이지만, 멀티플레이어 게임은 완전히 새로운 문제를 다루어야하는 독특한 어려움이 있습니다. 호흡이 빠른 멀티플레이어 게임의 클라이언트 - 서버 아키텍쳐를 구성하는 방법에 대해서 알아보겠습니다. 부정행위 문제 (The Problem of cheating) 모든 것은 부정행위에서 시작됩니다. 게임 개발자로서, 싱글 플레이 게임에서 플레이어가 부정행위를 행하는지 여부에는 관심을 두지 않습니다. 그러나 멀티 플레이 게임은 다릅니다. 경쟁 게임에서 부정을 저지르는 플레이..

CPU Overcommit이란?

관련 용어 정리 pCPU 물리 코어의 수. pCPU = 코어 수 * CPU 소켓 수로 계산할 수 있다. [예시] 호스트에 4개의 core가 있는 2개의 CPU가 있을 경우: 8 pCPU vCPU 가상머신에 할당된 가상코어 수. 하이퍼 스레딩 (Hyper Threading) 단일 물리코어가 논리 코어가 2개인 것처럼 동작할 수 있는 기술. 이를 활성화할 경우, 코어당 vCPU 개수가 2개가 된다. 성능도 2배로 늘어나는 것은 아니고 대략 30% 정도 좋아진다고 하며, 돌리는 애플리케이션에 따라 다르다. CPU Overcommit? 스케줄러가 1개의 pCPU당 할당하는 vCPU의 수다. 4 pCPU의 호스트에 4v CPU, 2 vCPU를 할당한 가상머신 2대를 띄웠다면 1.5 : 1의 CPU Overcomm..

포맷 후 cli로 설치 셋업

평소에 사용하는 프로그램들을 새로운 Mac에서 쉽게 설치하는 용도로 모아보았다. brew install --cask google-chrome brew install --cask visual-studio-code brew install --cask slack brew install --cask notion brew install --cask docker brew install --cask karabiner-elements brew install --cask postman brew install --cask iterm2 brew install --cask figma brew install --cask displaylink brew install --cask dbeaver-community brew insta..