我在WarExpand,一个浏览器级大战略游戏上独自玩了整整一年,地图是现实世界上的行政省份。以下是工作和痛苦的经验。
地图
将国家/省份的多边形转换成节点图:每个省份有一个节点,相邻省份之间的边,海洋是~30公里的水节点网格。通过Node脚本生成,存储为PostgreSQL中的纯节点和边表;服务器在启动时将整个图加载到内存中并进行路径寻找;客户端使用Three.js进行渲染。第一次错误:解析和三角化GeoJSON在主线程上冻结浏览器2分钟。将其移动到Web Worker,预先三角化到二进制格式,缓存在IndexedDB中。现在只需要几秒钟。
服务器主导移动
军队在实时移动沿着边缘。第一版让客户端拥有太多,它每个bug都导致了脱序。重写后,服务器拥有移动,战斗和撤退,客户端只渲染通过WebSocket推送的快照。重写期间的特性测试保持了平衡。
死锁
一个事务等待第二个数据库连接池连接,而连接池已经满了。整个游戏都冻结了。解决方案很枯燥:每个连接上的语句和空闲事务超时,外部事务管理器之外的任何事务都不应触摸仓库。
内存
浏览器客户端克隆了地图图(约108k个节点,约311k条边)六次或更多。通过共享一个拷贝并将其视为不可变的,JS堆的标签从1-2GB降低到~340MB。
堆栈
:Angular 22,NestJS + Fastify,PostgreSQL 16 + PostGIS,Three.js,Nx monorepo,Docker Compose。
当前状态
免费的alpha版,社区非常少。如果你想看到结果:https://warexpand.com。欢迎回答任何问题。
评论 (0)