用于游戏开发的 Kotlin

ale*_*hov 4 garbage-collection kotlin

背景:

我一直在寻找一种语言来代替 Java 进行游戏开发。Kotlin 看起来很有前途,具有良好的 IDE 支持和 Java 互操作性。但游戏的 FPS 杀手之一(尤其是在 Android 上)是 GC 使用。因此,一些库(如 libgdx)正在使用对象池、自定义集合和其他技巧来避免频繁的 GC 运行。对于Java,可以以清晰的方式完成。其他一些 JVM 语言本质上具有使用大量 GC 的功能支持,因此很难避免。

问题:

  1. 与 Java 相比,Kotlin 是否会产生任何不可见的 GC 开销?
  2. Kotlin 的哪些特性可以更好地避免减少 GC 工作?

Tob*_*bse 6

您可以为 JVM 编写 Kotlin 代码,这会导致与 Java 相应逻辑相同的分配。在这两种情况下,您都必须仔细检查库调用是否在堆上分配了新内存。将 Kotlin 与LibGDX结合使用不会引入任何不可见的 GC 开销。这是一种有效的方法并且效果很好(尤其是使用ktx扩展。

但是有一些 Kotlin 语言功能可以帮助您以更少的分配编写代码。

  1. 单例是一种语言特性。(对象声明伴生对象

  2. 您可以为编译为基元的基元类型创建包装类。但是您可以获得类型安全和丰富的域模型(内联类)的强大功能。

  3. 通过运算符重载内联函数的组合,您可以构建漂亮的 API,无需分配新对象即可修改对象。(示例:使用自定义运算符的无分配矢量操作

  4. 如果您使用任何类型的依赖注入机制或对象池来连接您的游戏逻辑并重用对象,那么Reified 类型参数可能有助于以非常优雅的方式使用它。如果编译器知道实际类型,您可以跳过一个类作为类型参数。

但是还有另一种选择确实可以为您提供不同的内存管理行为。感谢Kotlin Multiplatform,您可以将您的游戏逻辑编写为 Kotlin 通用模块并将其交叉编译为本机代码或 Javascript。
我在一个示例游戏项目Candy Crush Clone 中做到了这一点。它适用于Kotlin现代多平台游戏引擎Korge。游戏在 JVM 上运行,作为 HTML 网络应用程序和 Win、Linux、Mac、Android 或 IOS 中的本机二进制文件。
本机编译代码有自己更简单的垃圾收集,可以运行得更快。因此,速度的提高和不同的内存管理可能会让您有足够的能量储备,从而减少 GC 的麻烦。

总之,我可以推荐 Kotlin 用于游戏开发,也用于 GC 关键场景。在我的项目中,当我编写 Kotlin 代码时,我倾向于创建更多的类并分配更多的内存。但这是编程风格的问题,而不是技术问题。


vod*_*dan 3

根据经验,Kotlin 生成的字节码尽可能接近 Java 生成的字节码。因此,例如,如果您使用函数作为值,则会创建一个内部类,就像在 Java 中一样,但仅此而已。还有一些优化技巧,例如IntArray和 ,inline可以表现得更好。

正如 @Peter-Lawrey 所说,衡量特定案例的值始终是一个更好的主意。