< 返回版块

jerryshell 发表于 2025-01-16 10:12

客户端 Godot 4,服务端 Rust

游戏玩法很简单,类似 agar.io

  • 使用鼠标控制移动方向
  • 按下鼠标左键进行冲刺
    • 冲刺会掉落 20% 的质量
    • 质量太小的玩家不能冲刺
  • 质量差距大于 1.5 倍才能吃掉另一个玩家
  • 玩家的质量会随时间慢慢掉落,质量越大掉落几率越高
  • 质量与半径的换算公式:质量 = PI * 半径 * 半径

GitHub: https://github.com/jerryshell/agarust

评论区

写评论
作者 jerryshell 2025-02-07 19:57

可以将每个 MatchArm 的具体实现封装成一个单独的函数

目的是把每个 MatchArm 化简为只有几行代码

这样看起来会清爽一些,提升代码可读性

--
👇
miaomiao1992: 大佬,如果后期业务逻辑更加复杂,Command枚举体会膨胀得厉害,导致match语句庞大,该如何解决?

miaomiao1992 2025-02-06 22:00

大佬,如果后期业务逻辑更加复杂,Command枚举体会膨胀得厉害,导致match语句庞大,该如何解决?

miaomiao1992 2025-02-01 17:44

学习大佬代码。 tokio select,我也考虑过该方案,完美无锁,英雄所见略同!

作者 jerryshell 2025-02-01 12:16

我稍微看了一下,你好像在 2 周前 fork 了我的项目

所以我猜测你看的应该是旧代码

你可以去我的上游看最新的代码,因为 fork 的项目是不会和上游自动同步的

2 周前 client_agent 确实是有锁的,那时候我还在几个方案之间摇摆不定,而且还得分心处理客户端的问题

--
👇
miaomiao1992: SplitSink和SplitStream内部是互斥锁(websocket stream读写会互斥),db_player用了读写锁

不能算完全的无锁编程

miaomiao1992 2025-01-31 21:55

SplitSink和SplitStream内部是互斥锁(websocket stream读写会互斥),db_player用了读写锁

不能算完全的无锁编程

--
👇
jerryshell: 这个 agarust 项目就是不带锁的,client_agent 和 hub 都是 Actor,它们之间使用 channel 通信

当然,我也不能断定 channel 就一定比 Mutex 好

Go Wiki 针对这个问题还专门有一个页面用来讨论:https://go.dev/wiki/MutexOrChannel

结论就是:根据情况使用最具有表现力或者最简单的 :)

--
👇
miaomiao1992: 大佬,我看过许多带有广播功能的tcp游戏服务器,主要架构都带有Mutex互斥锁,难道不能无锁编程?

作者 jerryshell 2025-01-31 13:55

这个 agarust 项目就是不带锁的,client_agent 和 hub 都是 Actor,它们之间使用 channel 通信

当然,我也不能断定 channel 就一定比 Mutex 好

Go Wiki 针对这个问题还专门有一个页面用来讨论:https://go.dev/wiki/MutexOrChannel

结论就是:根据情况使用最具有表现力或者最简单的 :)

--
👇
miaomiao1992: 大佬,我看过许多带有广播功能的tcp游戏服务器,主要架构都带有Mutex互斥锁,难道不能无锁编程?

miaomiao1992 2025-01-30 23:29

大佬,我看过许多带有广播功能的tcp游戏服务器,主要架构都带有Mutex互斥锁,难道不能无锁编程?

作者 jerryshell 2025-01-17 13:24

谢谢你的建议

  • lock 文件进了 git 所以不担心删掉
  • 版本号写 * 的话方便我这种懒人用简单的命令 cargo update 升级所有依赖
  • 不是什么严肃的项目,所以我就怎么舒服怎么来了
  • 如果是公司的商业项目或者是团队合作的项目那当然是写具体版本号最好

--
👇
miaomiao1992: 建议依赖写好具体版本,不然过几个月删了lock文件没法跑啊

miaomiao1992 2025-01-17 09:19

[package] name = "agarust-server" version = "0.1.0" edition = "2021"

[dependencies] tracing = "" tracing-appender = "" tracing-subscriber = "" prost = "" tokio = { version = "", features = ["full"] } tokio-tungstenite = "" futures-util = "" nanoid = "" rand = "" hashbrown = "" sqlx = { version = "", features = ["runtime-tokio", "sqlite"] } dotenv = "" bcrypt = "*"

[build-dependencies] prost-build = "*"

[profile.release] lto = true strip = true panic = "abort" codegen-units = 1

代码能跑,好评。不过建议依赖写好具体版本,不然过几个月删了lock文件没法跑啊

1 共 9 条评论, 1 页