ale*_*hov 4 garbage-collection kotlin
背景:
我一直在寻找一种语言来代替 Java 进行游戏开发。Kotlin 看起来很有前途,具有良好的 IDE 支持和 Java 互操作性。但游戏的 FPS 杀手之一(尤其是在 Android 上)是 GC 使用。因此,一些库(如 libgdx)正在使用对象池、自定义集合和其他技巧来避免频繁的 GC 运行。对于Java,可以以清晰的方式完成。其他一些 JVM 语言本质上具有使用大量 GC 的功能支持,因此很难避免。
问题:
您可以为 JVM 编写 Kotlin 代码,这会导致与 Java 相应逻辑相同的分配。在这两种情况下,您都必须仔细检查库调用是否在堆上分配了新内存。将 Kotlin 与LibGDX结合使用不会引入任何不可见的 GC 开销。这是一种有效的方法并且效果很好(尤其是使用ktx扩展。
但是有一些 Kotlin 语言功能可以帮助您以更少的分配编写代码。
您可以为编译为基元的基元类型创建包装类。但是您可以获得类型安全和丰富的域模型(内联类)的强大功能。
通过运算符重载和内联函数的组合,您可以构建漂亮的 API,无需分配新对象即可修改对象。(示例:使用自定义运算符的无分配矢量操作)
但是还有另一种选择确实可以为您提供不同的内存管理行为。感谢Kotlin Multiplatform,您可以将您的游戏逻辑编写为 Kotlin 通用模块并将其交叉编译为本机代码或 Javascript。
我在一个示例游戏项目Candy Crush Clone 中做到了这一点。它适用于Kotlin的现代多平台游戏引擎Korge。游戏在 JVM 上运行,作为 HTML 网络应用程序和 Win、Linux、Mac、Android 或 IOS 中的本机二进制文件。
本机编译代码有自己更简单的垃圾收集,可以运行得更快。因此,速度的提高和不同的内存管理可能会让您有足够的能量储备,从而减少 GC 的麻烦。
总之,我可以推荐 Kotlin 用于游戏开发,也用于 GC 关键场景。在我的项目中,当我编写 Kotlin 代码时,我倾向于创建更多的类并分配更多的内存。但这是编程风格的问题,而不是技术问题。
根据经验,Kotlin 生成的字节码尽可能接近 Java 生成的字节码。因此,例如,如果您使用函数作为值,则会创建一个内部类,就像在 Java 中一样,但仅此而已。还有一些优化技巧,例如IntArray
和 ,inline
可以表现得更好。
正如 @Peter-Lawrey 所说,衡量特定案例的值始终是一个更好的主意。
归档时间: |
|
查看次数: |
3480 次 |
最近记录: |