性能问题

未经优化的调试编译

你可以在 debug 和 dev 模式下启用编译器的优化功能!

即使是启用 opt-level=1 级别的优化也足以让 Bevy 不至于慢得让人痛苦! 你也可以对依赖项启用更高的优化,但不要包括你自己的代码,以保证你自己代码的编译速度!

# 在 `Cargo.toml` 或 `.cargo/config.toml` 中进行配置

# 在调试模式下只启用少量的优化措施:
[profile.dev]
opt-level = 1

# 像下面这样对依赖的库启用更高级别的优化(包括 Bevy ),但不会包括我们自己的代码:
[profile.dev.package."*"]
opt-level = 3

为什么要这样做?

没有编译器优化的 Rust 是 非常慢 的。特别是对于 Bevy,默认的 cargo 调试编译配置会导致 糟糕 的运行性能。资源加载很慢、FPS 很低。

常见的症状:

  • 从 GLTF 文件加载带有大量大型纹理的高清晰 3D 模型文件,可能需要几分钟的时间! 这可能会使你产生错觉,让你以为你的代码不能正常运行,因为直到它准备好之前你在屏幕上看不到任何东西。
  • 甚至在生成几个 2D 精灵或 3D 模型后,帧率可能会下降到到无法播放的水平。

为什么不使用 --release

你可能听说过这样的建议:只要使用 --release 这种发布模式来运行就没有性能问题了! 然而,这是个不好的建议,请不要这样做。

发布模式禁用了"调试断言":在开发期间有用的额外检查。许多库在这个设置下还包括额外的东西。在 Bevy 和 WGPU 中,这包括对着色器和 GPU API 使用的验证。发布模式禁用了这些检查,导致信息量较小的崩溃、热重载问题,或者潜在的错误或无效逻辑没有被注意到。

发布模式也使增量的重新编译变得缓慢。这违背了 Bevy 实现快速编译的目标,在你开发时你可能会非常恼火。


根据本页顶部的建议,如果只是为了测试你的游戏有足够的性能,你不需要使用 --release 来进行编译。你只需要把它用于你发送给用户的 实际 发布版本。

如果你愿意,你也可以为实际的发行版构建启用 LTO(链接时间优化),以极慢的编译时间为代价,挤出更多的性能。

[profile.release]
lto = "thin"