稍微把 Polis 挖坑至今 (2023-08-05) 累積的嘗試做個紀錄。
基本概念
整個開放世界會被拆分成不同的區域,每個區域由獨立的節點 (Polis Node) 負責運算,節點跟節點之間會構成 P2P 網路,形成一個可以橫向擴展的架構,而 Client 端則會在由 Polis Node 構成的 P2P 網路所運算的開放世界中進行漫遊 (Roaming)。其實這種分散式的架構在 ITUGV 的時宜就令我十分著迷,不過那就是另外一段故事了,在這裡稍微提及只是為了讓讀者理解筆者對分散式架構抱有特別的偏好,並且這種構想早就存在於早期的其他專案之中。
POC (Proof Of Concept)
雖然 Polis 作為 Hakoniwa 的子專案,目的一樣是為了建造一個程序化生成 Voxel 開放世界,但是 Polis 將會把重點放在兩個目標上:
- 建立 P2P 網路
- 能夠透過 Client 程式連線
因此在 Polis 的第一個原型中,達到這些條件就算成功完成了概念驗證:
2023-05-13 ~ 2023-05-26
在這個階段我想用 Deno 作為實作 Polis Node 的手段,有幾個原因:
- Typescript 目前是我最熟練的語言。
- WebGPU 已經納入 Web API 中,而部份版本的 Deno 已經實作,因此我能使用 Typescript 解決 server side render 的需求,這麼部份是 Node.js 無法達成的。
- Deno 內建跨平台編譯 (Cross Compiling),因此寫一次程式我就能把節點佈署到除了 Linux 以外的 Windows 或是 macOS 上。
網路連接技術
在挖了坑並且對技術棧 (Technology Stack) 有了粗略的方向之後,首先我想先處理 Polis 中最關鍵的問題:
如何建立 Polis 網路 (P2P 網路)?
在 2020-03-22 的時候我就有 使用 ZeroMQ 進行過傳輸相關的實驗,也是我在 The Key of Huanche 中一直考慮投入使用的函式庫。直到我因為 Polis 的分散式架構回過頭去翻閱它的官方文件的時候,才發現了一件事:
And this is the world we’re targeting with ZeroMQ. When we talk of “scale”, we don’t mean hundreds of computers, or even thousands. Think of clouds of tiny smart and perhaps self-replicating machines surrounding every person, filling every space, covering every wall, filling the cracks and eventually, becoming so much a part of us that we get them before birth and they follow us to death. 1
ZeroMQ 在官方文件 Chapter 8 - A Framework for Distributed Computing 中描述了他們那野心勃勃的願景,老實說這非常打動我。
然而調查下來,發現 Deno 在這方面並沒有多少函式庫可以使用、專案的活躍度也都很低:
- https://github.com/jjeffcaii/deno-zeromq
- https://github.com/rracariu/deno-jszmq
- 似乎只有實作 WekSocket
- https://github.com/trs/zmq
- deno-jszmq 的 fork
- https://github.com/lenkan/deno-amqp
- 兼容 RabbitMQ