2017-10-20 91 views
0

我是Kotlin的新手,但我想尝试将其用于游戏开发,至少将Android与OpenGL ES 2.0和HTML5与WebGL(我对此非常熟悉)进行对比。对于WebGL和GLES20,我的渲染引擎的类/函数不需要稍微不同的版本显然是一件好事,但是在没有开销的情况下,在Kotlin中实现这一点是否有实际的方法?Kotlin编译器能否优化掉包装函数?

我认为我需要做的是在OpenGL ES 2.0中编写一个实现WebGLRenderingContextBase或其克隆的类(如果需要克隆,我可以使用委托代替WebGL实现)像这样:

override fun bindBuffer(target: Int, buffer, Int) { 
    GLES20.glBindBuffer(target, buffer) 
} 

我会写一个脚本来完成大部分工作。

我的问题是,编译器是否足够聪明,可以优化掉这些包装器,并直接在我的类的vtable或类似的JVM中使用GLES20.glBindBuffer等?当通过对接口或基类的引用调用重写的方法时,推测inline不会有任何用处。

回答

2

Kotlin编译器不会将字节码优化到这个范围,而且它不需要:JVM本身在优化代码方面非常出色。

而且,inline功能并非设计为Kotlin中的性能工具,而是用于非本地控制流和代码转换,而这些转换无需内联就无法实现。

实际上,JVM执行了很多优化,使得编译器不必优化它们在其旁边生成的字节码。内联是JVM可以完成的优化之一。 (1)(2)(3)

虽然这两个编译器nor JVM can inline native methods,因为本机代码的性质完全不同。

Kotlin编译器反过来执行一些本地优化,不影响程序的整体结构。还有一个原因是调试体验难以通过大量优化来保留。要检查确切的Kotlin优化,可以尝试通过将-Xno-optimize flag添加到免费的编译器参数来禁用它们,然后查看生成的字节码或执行一些基准测试。