客户端 Godot 4,服务端 Rust
游戏玩法很简单,类似 agar.io
- 使用鼠标控制移动方向
- 按下鼠标左键进行冲刺
- 冲刺会掉落 20% 的质量
- 质量太小的玩家不能冲刺
- 质量差距大于 1.5 倍才能吃掉另一个玩家
- 玩家的质量会随时间慢慢掉落,质量越大掉落几率越高
- 质量与半径的换算公式:
质量 = PI * 半径 * 半径
1
共 9 条评论, 1 页
客户端 Godot 4,服务端 Rust
游戏玩法很简单,类似 agar.io
质量 = PI * 半径 * 半径
评论区
写评论可以将每个 MatchArm 的具体实现封装成一个单独的函数
目的是把每个 MatchArm 化简为只有几行代码
这样看起来会清爽一些,提升代码可读性
--
👇
miaomiao1992: 大佬,如果后期业务逻辑更加复杂,Command枚举体会膨胀得厉害,导致match语句庞大,该如何解决?
大佬,如果后期业务逻辑更加复杂,Command枚举体会膨胀得厉害,导致match语句庞大,该如何解决?
学习大佬代码。 tokio select,我也考虑过该方案,完美无锁,英雄所见略同!
我稍微看了一下,你好像在 2 周前 fork 了我的项目
所以我猜测你看的应该是旧代码
你可以去我的上游看最新的代码,因为 fork 的项目是不会和上游自动同步的
2 周前 client_agent 确实是有锁的,那时候我还在几个方案之间摇摆不定,而且还得分心处理客户端的问题
--
👇
miaomiao1992: SplitSink和SplitStream内部是互斥锁(websocket stream读写会互斥),db_player用了读写锁
不能算完全的无锁编程
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互斥锁,难道不能无锁编程?
这个 agarust 项目就是不带锁的,client_agent 和 hub 都是 Actor,它们之间使用 channel 通信
当然,我也不能断定 channel 就一定比 Mutex 好
Go Wiki 针对这个问题还专门有一个页面用来讨论:https://go.dev/wiki/MutexOrChannel
结论就是:根据情况使用最具有表现力或者最简单的 :)
--
👇
miaomiao1992: 大佬,我看过许多带有广播功能的tcp游戏服务器,主要架构都带有Mutex互斥锁,难道不能无锁编程?
大佬,我看过许多带有广播功能的tcp游戏服务器,主要架构都带有Mutex互斥锁,难道不能无锁编程?
谢谢你的建议
cargo update
升级所有依赖--
👇
miaomiao1992: 建议依赖写好具体版本,不然过几个月删了lock文件没法跑啊
[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文件没法跑啊