Kotlin为游戏开发

时间:2015-06-25 20:09:32

标签: garbage-collection kotlin

背景:

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

问题:

  1. 与Java相比,Kotlin是否会创建任何不可见的GC开销?
  2. Kotlin的哪些功能最好避免GC工作量减少?

3 个答案:

答案 0 :(得分:3)

从技术上讲,你将Kotlin与Java进行比较的问题没有实际意义,他们的表现也是如此。但Kotlin将是一个更好的开发体验。

如果Java有利于编写游戏,那么Kotlin只会因为开发人员的工作效率而更好。

注意:游戏库LWJGL 3部分使用Kotlin,GitHub统计显示67.3%的代码是Kotlin(模板模块看起来主要是Kotlin)。因此,询问使用LWJGL的人会给你最好的答案,因为他们在这方面有很多经验。

Github Language Stats for LWJGL3

答案 1 :(得分:2)

根据经验,Kotlin生成的字节码尽可能接近Java生成的字节码。因此,例如,如果您将函数用作值,则将创建内部类,就像在Java中一样,但不会更多。还有一些优化技巧,如IntArrayinline,可以更好地执行。

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

答案 2 :(得分:1)

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

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

  1. 单语是一种语言功能。 (Object declarationscompanion object

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

  3. 借助Operator overloadingInline Functions的组合,您可以构建漂亮的API,这些API可以修改对象而无需分配新对象。 (例如:Allocation-free Vectorial operations using custom operators

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

但是还有另一个选择确实可以为您提供不同的内存管理行为。感谢Kotlin Multiplatform,您可以将游戏逻辑编写为Kotlin通用模块,并将其交叉编译为本地代码或Javascript。
我在一个示例游戏项目Candy Crush Clone中进行了此操作。它可以与Korge一种用于Kotlin的现代多平台游戏引擎一起使用。该游戏在JVM,HTML Web应用程序以及Win,Linux,Mac,Android或IOS中的本机二进制文件上运行。
本机编译代码具有自己的simpler garbage collection,并且可以run faster。因此,速度的提高和不同的内存管理可以为您提供动力储备,使您不必再为GC烦恼。

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

相关问题