嘿 r/gamemaker,
我最初是在web开发中开始的,但很快就意识到我讨厌处理UI、前端和任何视觉内容。 我最终转变为系统编程,重点关注原始性能、低级逻辑和数字。最近,我开始帮助朋友的GameMaker项目。他是一个了不起的游戏设计师,但在编程方面是初学者。
在游戏开发过程中,他问我一个简单的问题:“有没有一种方法可以安全地加密我的游戏存档,让人无法轻易修改他们的统计信息?”我以为会有一个标准库来解决这个问题,但我意识到GM生态系统缺乏一个可以直接使用的、健壮的存档安全解决方案。事实上让我很惊讶。GM社区里充满了极具才华的艺术家、音频设计师和游戏设计师,他们花了多年时间精心打造他们的作品。他们不应该学习低级加密或处理损坏的存档文件就为了保护他们的游戏。
所以,我决定自己为GameMaker开发一个合适的AAA级存档系统。它被称为GameMaker-Save,完全免费和开源(MIT/Apache-2.0).
下面是它如何演变和在背后做什么的旅程:
第一个草案(v0.1.0)
我想要一个安全的、跨平台的系统。 我使用ChaCha20-Poly1305构建了初始版本,并设置了FFI以与GML平滑工作。它在Windows、macOS和Linux上都工作得很好,但它有一个缺陷:开发者必须手动编译和链接.dll/.dylib/.so二进制文件。这对于非程序员来说太麻烦了。
重构(v0.2.0)
我花了一个月的时间分析边缘情况并彻底重构了架构。下面是我在新版本中实现的内容:
真正的原子写入(冲突预防):我意识到,如果游戏在玩家点击“手动存档”时触发一个自动存档,临时文件可能会互相覆盖并损坏数据。 我整合了一个临时文件库来为每次写入尝试生成唯一的临时文件,直到最终重命名。你的存档现在是几乎不会崩溃的。
升级加密(XChaCha20):我用XChaCha20替换了ChaCha20。这增加了nonce大小从96位到192位。生成相同nonce的机会已经很小了,但现在它几乎是零了。
密钥轮换(主密钥fallback):如果你的游戏主密钥泄露了, 你可以在下一次补丁中更新它。系统会识别旧密钥,解密存档,然后平滑地重新加密它。
插件与玩:不再需要手动编译。它现在打包成一个单独的.yymps文件。拖拽,放置并使用一个非常简单、简洁的API。
我主要是为了帮助我的朋友而开发的,但我希望这可以帮助任何人在这里想要停止担心存档状态并专注于制作伟大的游戏的人。
链接:
itch.io:[下载和演示项目]
GitHub:[源代码]
我非常希望听到您的反馈,或者如果您对FFI实现或原生侧面有任何问题,请告诉我!
评论 (0)