balatro需要无需介绍,它是一款由 LocalThunk 写的流行的 roguelike.deckbuilder 游戏 (使用 Lua 编写的自由开源 Love2D 引擎)。
您可能已知,我是一个反向爱好者,我喜欢阅读某个游戏/应用程序的代码,因为它帮助我学习它们如何解决 "现实世界" 问题。
还有一点我想要明确的是,是 balatro 的 CODE QUALITY。
正如您已经知道的那样,我是一个反向爱好者,我喜欢阅读某个游戏/应用程序的代码,因为它帮助我学习它们如何解决 "现实世界" 问题。
还有另外一件我想要明确的事情,是 关于 cod _quality 的事情。
正如您在上面看到的,有很多人认为 balatro 的源代码是...嘛,非常糟糕了?
实际上,Balatro 的源代码包含真正的数学小聪明 (因为 LocalThunk 擅长数学,显然)。
一些技术的收获如下:
- 背景材料数乘数公式阐释:我们阅读了Balatro如何在您每次玩它时计算抽到手牌的代码。它如何识别出牌型,如何处理小丑的效果,如何应用特殊效果(铜板,珍藏卡等)。
我们看了balatro每次当玩家抽出手牌时,源代码是如何处理手牌计算的。它是如何识别手牌类型,如何处理小丑效果,如何应用特殊效果(铜板,珍藏卡等)。
- 鼠标位置作为便宜的熵: Balatro使用鼠标抖动作为便宜的硬件熵RNG。零系统调用延迟。超级简单。
我们可以从Balatro当中看出其中一个关于RNG的技巧。程序员将鼠标指针的抖动当作一个使用RNG的来源。这意味着,您并不必须调用系统,因为系统的时间是非常不确定的。Zero OS call overhead. Dead simple.
- 浮点数用于牌组(比较):
Balatro使用的牌组是通过一个聪明的公式来管理的。这个公式是打包各种变量到一个浮点值中。牌的位置,卡片类型,标识符等,都是不同的小数位。
我们看了Balatro管理牌组的方法是什么样的。Balatro使用一个聪明的公式将牌组打包到一个浮点数中。这个公式被用来管理牌的对比过程,如排列牌组、找出牌的规则变化等。
- 代码模式在使用: Flyweight, kind of a Strategy Pattern, etc。我们将要看一下Balatro如何实现一些著名的设计模式。
最后,程序员我们看到了关于Flyweight设计模式的应用。 Flyweight是这样的,它可以在程序中使用一个对象的属性描述一个对象。我们都知道,每种卡都有不同种类,我们只需要使用一个Flyweight来描述这些基本的组成部分。
-
以increment GC+per-frame time budget:Yep, Balatro使用一个自定义GC触发代码。跑GC的一小步每一帧, budget0.3ms + emergency full pass cleanup在300 MB memory阈值。从Max.Cahill的nuGC中借口 。
-
更多内容都包含在全视频中。
全视频:https://www.youtube.com/watch?v=54w9crNNThU
评论 (0)