2017-10-20 278 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添加到免費的編譯器參數來禁用它們,然後查看生成的字節碼或執行一些基準測試。