-
이론 정리 - < IO 멀티플렉싱은 블로킹을 한 곳에 모은다 > TOP NEW
개요 아파트 경비원 한 명이 수백 세대를 맡는다. 세대마다 문 앞에 서 있을 순 없으니 경비실 호출 패널만 본다. 불이 들어온 세대 번호로 가면 된다. 순찰도 돌아야 한다. 규칙은 “호출이 10분 동안 없으면 순찰을 돈다.” 택배가 몰리는 날 호출이 5분마다 오면 순찰은 한 번도 못 돈다..! 게임 서버가 이 경비원이다. 호출 패널은 epoll, 순찰은 틱( 몬스터를 움직이고 버프 시간을 줄이는, 일정 간격의 세계 갱신 )이다. 처음엔 서버도 이 규칙대로 짜면 된다고 생각했다. 패널을 기다리는 함수가 돌려주는 숫자가 0이면 “그동안 호출이 없었다”는 뜻이니 그때 틱을 돌리면 된다고. 그 숫자는 시간이 아니라 ... Read More
-
Python - < 13 > TOP NEW
개요 이번에 배운 건 최단 경로를 구하는 알고리즘 세 가지다. 다익스트라, 벨만-포드, 플로이드-워셜. 셋 다 “가장 싼 길”을 찾지만 쓰는 자리가 다르고, 그 자리를 가르는 건 두 질문이다. 몇 쌍을 묻는가. 한 점에서 출발하는 거리면 다익스트라·벨만-포드, 모든 점 사이의 거리면 플로이드-워셜 음수 간선을 믿을 수 있는가. 간선이 전부 0 이상이면 다익스트라, 음수가 섞이면 벨만-포드·플로이드-워셜 세 알고리즘이 맞는 이유를 한 문장씩으로 줄여 두면, 그 문장이 깨지는 조건도 같이 보인다. 다익스트라: 큐에서 꺼낸 순간 거리가 확정된다. 간선이 0 이상일 때만 참이다 벨만-포드: V−... Read More
-
C# - <5> TOP NEW
개요 보스전이 있는 게임을 떠올려 보자. 화면 위에는 보스 체력바가 있고, 옆에는 퀘스트 기록창이 있다. 둘 다 보스의 “죽었다” 이벤트를 구독해 두고, 보스가 죽으면 알림을 받아 각자 할 일을 한다. 보스 쪽은 알림을 보낸 다음 보상 상자를 떨어뜨린다. 전투 도중 UI가 한 번 다시 만들어지면서 체력바가 닫혔다가 새로 생겼다. 그런데 옛 체력바는 구독을 풀지 않은 채 사라졌다. 이 상태로 보스를 잡으면 보상 상자가 안 떨어진다. 보상 코드에는 아무 문제가 없다. 일은 이렇게 이어진다. 보스가 “죽었다” 알림을 보낸다 알림 목록에 아직 남아 있던 옛 체력바도 알림을 받는다 옛 체력바가 이미 사라... Read More
-
Python - < 12 > TOP NEW
개요 마트 세 곳을 돌며 우유 최저가를 메모지에 적는다고 해보자. 동적 계획법( DP )에서 표의 한 칸에 최솟값을 채우는 일이 이 메모지와 같다. 첫 가게에서는 가격을 그냥 적고, 두 번째 가게부터는 더 쌀 때만 고쳐 적는다. 다 돌고 나면 메모지에 남은 건 마지막에 본 가격이 아니라 최저가다. 같은 메모지를 다음 날 또 들고 나가면 얘기가 달라진다. 첫 가게라고 그냥 덮어쓰면 어제 찾은 최저가가 지워지니, 첫 가게부터 어제 값과 비교해야 한다. 수영장 문제 코드를 고치다가 dp[i]에 첫 후보를 비교 없이 대입하는 줄에서 멈췄다. 이러면 최솟값이 아니라 최신 값만 남는 거 아닌가..? 이번 글에서 헷갈렸... Read More
-
Minor On Air 개발 - < 5 > TOP NEW
개요 반 발짝 옆에서는 되는데 여기서는 안 된다. 같은 바위, 같은 각도, 같은 클릭. 광질 게임을 만들다 만난 이 자리에서는 무엇이 달랐을까? 바위도 서버도 아니었다. 달라진 건 내 몸의 위치였다. 찍을 대상을 고르는 선이 바위보다 내 몸에 먼저 걸렸고, 2편에서 내가 세운 “자기 자신이면 무시” 필터가 그 클릭을 조용히 버렸다.. 이번엔 채굴 방식에 재미 요소를 넣어줬다. Unity NGO(Netcode for GameObjects)처럼 서버가 판정을 쥐는 구조에서 찍는 순간의 소리와 흔들림, 바위에 금이 가거나 부서지는 결과가 화면에서 같아야 한다. 이 둘을 어떻게 나눴는지, 그리고 그 사이에 숨어 있... Read More
-
Minor On Air 기획 - < 4 > TOP NEW
개요 등 뒤에서 쉿 소리가 점점 커진다. 방금 캔 터지는 광물이 가방에 들어갔는데, 가방은 등에 달린 해치라 내가 열 수 없다. 할 수 있는 건 옆 동료에게 “빨리 꺼내줘!!”라고 비는 것뿐이다.. Minor On Air의 세계관을 짜면서 제일 기억에 남는 장면이다. 이 장면은 세계관에서 나온 게 아니라 규칙에서 먼저 나왔다. 1편에서 정한 건 도망가는 광물, 터지는 광물, 팀킬 같은 규칙이었고, 세계관은 그 뒤에 “왜 광물이 움직이지?”, “왜 가방을 못 열지?”에 이유를 대려고 붙였다. 협동 게임을 기획하면서 규칙과 설정 중 뭘 먼저 잡을지 고민 중이라면, 규칙이 먼저 있고 설정이 하나씩 이유를 대 가는 ... Read More
-
Minor On Air 개발 - < 3 > TOP NEW
개요 건물마다 방송실이 하나씩 있다고 해보자. 1동 방송실에서 “광석이 맞았다!”고 방송하면 1동 사람은 다 듣지만, 2동에는 한 마디도 안 들린다. 2동까지 알리려면 전화를 따로 걸어야 한다. Unity NGO 멀티플레이에서 C# 이벤트가 이렇게 움직인다. PC가 건물이고, event가 방송, Rpc가 전화다. 2편에서 곡괭이 타격 검증 끝의 PublishHit은 로그만 찍는 자리였다. 여기에 타격을 기록하는 쪽, 연출하는 쪽이 붙어야 하는데 둘이 만날 곳이 없었다. 발행자(플레이어)는 런타임에 생기는 프리팹이고, 구독자는 씬에 미리 놓인 오브젝트라 서로 참조를 걸 수 없다. 그래서 이벤트 버스를 stat... Read More
-
이론 정리 - < 레드 블랙 트리는 2-3-4 트리다 > TOP NEW
개요 새로 들어온 사람을 무조건 바로 앞 입사자 밑에 붙이는 회사가 있다고 해보자. 사람이 들어올수록 조직도는 한 줄로 늘어지고, 막내의 보고가 대표에게 닿으려면 직원 수만큼 결재를 거쳐야 한다. BST에 정렬된 값을 순서대로 넣으면 이 모양이 된다 ( Python - < 10 >의 편향 트리 ). 이걸 막는 방법은 두 가지다. 어느 팀이든 양쪽 라인의 깊이가 2 이상 벌어지는 순간 그 자리에서 바로 조직을 재편한다. 깐깐한 대신 재편이 잦다. 팀 하나에 최대 세 명까지 두고, 넘치면 가운데 사람을 위 팀으로 올리고 남은 둘을 두 팀으로 쪼갠다. 조직이 아래가 아니라 위로 자라서 모든 말단... Read More