Maze · Signaling Package

Pheromone System

공간을 매개로 신호를 송수신하는 시스템 패키지입니다. 객체 간 직접 참조 없이, 월드 공간 자체를 통신 채널로 활용합니다.

TTL시간 기반 잔류
Octree공간 최적화
ZeroDirect Reference
scroll
01 — 개요

Mail Box의 한계

기존 Message System 또는 Tactiles System에서 이벤트 처리로 제안된 Mail Box 방식은 신호를 보내는 시점에 수신 객체가 살아있어야 하고, 그 객체를 통해 신호가 직·간접적으로 처리됩니다. 통상적인 상황에서는 이 방식이 안전하지만, 수신자가 누구인지 특정하기 어렵거나 신호를 보내는 쪽과 받는 쪽이 서로를 알지 못하는 추상적인 상황에는 대응하기 어렵습니다. Pheromone System은 이런 경우를 위해 공간에 힌트를 남기는 방식으로 제안되었습니다.

Mail Box 방식
객체 중심 통신
  • 신호를 보내는 시점에 수신 객체가 존재해야 함
  • 송신자가 수신자를 알고 있거나 직·간접적으로 참조해야 함
  • 수신자가 사라지거나 아직 생성되지 않았다면 신호가 소실됨
  • 명시적 연결이 없는 시스템 간 통신이 어려움
Pheromone 방식
공간 중심 통신
  • 신호를 월드 공간에 남겨두고 송신자는 사라져도 됨
  • 수신자를 특정하지 않음 — 해당 공간을 지나는 누구든 감지 가능
  • TTL에 따라 신호가 잔류하여 시간적 분리가 가능
  • 시스템 간 직접 참조 없이 간접 통신 구현
02 — 공간 신호

월드 공간이 채널이다

Pheromone System의 신호 모델은 마인크래프트의 레드스톤 회로와 유사합니다.

src rx A rx B

마인크래프트의 레드스톤 회로에서 레버와 피스톤은 서로를 직접 참조하지 않습니다. 레버가 당겨지면 블록이 놓인 공간을 따라 신호가 전달되고, 그 경로 위에 있는 장치가 반응합니다. 레버는 누가 받을지 모르고, 피스톤은 누가 보냈는지 모릅니다. 공간이 연결의 매개입니다.

Pheromone System도 동일합니다. 송신자는 월드 공간의 특정 위치에 신호를 남기고, 그 공간을 감지하는 시스템이 반응합니다. 누가 보냈는지, 누가 받을지 양쪽 모두 알 필요가 없습니다. 신호는 객체가 아닌 공간에 귀속됩니다.

공간 귀속  신호는 객체의 생존 여부와 독립적입니다. 송신자가 사라진 후에도 신호는 TTL이 남아있는 동안 공간에 잔류합니다.
03 — TTL

Time-To-Live

공간에 남겨진 신호에는 TTL이 지정됩니다. TTL은 신호가 공간에 얼마나 오래 잔류할지를 결정합니다. TTL이 소진되면 신호는 자동으로 소멸하고, 이후 어떤 수신자도 감지할 수 없습니다.

즉시 소멸 (TTL = 0)
신호가 처리된 즉시 소멸합니다. 동일 틱의 수신자만 감지 가능합니다.
단기 잔류
몇 틱 동안 공간에 남아있습니다. 근처를 지나가는 수신자가 있으면 뒤늦게 감지합니다.
장기 잔류
비교적 오랫동안 공간에 유지됩니다. 나중에 생성된 수신자도 감지할 수 있습니다.
잔류 시간 예시
즉시 (0)
0 tick
단기
N tick
중기
N tick
장기
N tick
04 — 공간 최적화

ChunkedVolumeOctree

공간에 분산된 신호를 효율적으로 조회하기 위해 ChunkedVolumeOctree를 사용합니다.

chunk chunk chunk chunk oct

월드 공간을 일정 크기의 청크(Chunk)로 분할하고, 각 청크 내부는 옥트리(Octree) 구조로 세분화합니다. 이 두 단계 구조를 통해 광활한 월드에서도 특정 위치의 신호를 빠르게 조회할 수 있습니다.

신호가 없는 청크는 데이터 구조를 유지하지 않아 유휴 공간에 대한 메모리 낭비를 최소화합니다. 신호가 밀집된 영역에서는 옥트리 세분화가 조회 정밀도를 높여줍니다.

05 — 설계 목표

시스템 철학

Pheromone System이 지향하는 핵심 설계 원칙입니다.

간접 통신이 기본
직접 연결되지 않은 시스템 간의 통신은 기본적으로 Pheromone를 통해 이루어집니다. Flame System이 열 신호를 남기면, Audio System은 그것을 감지하여 반응합니다. 두 시스템은 서로를 알 필요가 없습니다.
참조 직렬화 배제
엔티티에 대한 직접 참조를 신호에 포함시키지 않는 것이 목표입니다. 신호는 공간 좌표와 데이터만 담습니다. 이를 통해 수신 측이 송신 측의 생존 여부에 의존하지 않도록 합니다.
시간적 분리
TTL 덕분에 신호의 송신 시점과 수신 시점이 일치하지 않아도 됩니다. 수신자가 나중에 생성되거나, 나중에 해당 공간에 진입하더라도 신호를 감지할 수 있습니다.
추상적 상황 대응
수신자가 누구인지, 수신자가 지금 존재하는지 알 수 없는 추상적인 상황에서도 신호를 전달할 수 있습니다. 공간에 "힌트"를 남기는 것만으로 충분합니다.