2017-10-20 7 views
0

私はKotlinを初めて使っていますが、OpenGL ES 2.0のAndroidとWebGLのHTML5をターゲットにしたゲーム開発に使ってみたいと思います。 WebGLとGLES20用のレンダリングエンジンのクラス/ファンクションのバージョンが少し違うことは明らかに良いことですが、オーバーヘッドなしでこれを実現する実用的な方法がありますか?Kotlinコンパイラはラッパー関数を最適化できますか?

WebGLRenderingContextBaseまたはそのクローン(クローンが必要な場合は、私はWebGL実装用にデリゲートを使用することができます)を実装するクラスを作成することです。OpenGL ES 2.0では、このように:

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

大部分の作業を行うスクリプトを作成します。

私の質問は、このようなラッパーを最適化し、GLES20.glBindBufferなどを直接クラスのvtableやJVMの同等のものに使用するのに十分なスマートなのですか?おそらくinlineは、インターフェイスまたは基本クラスへの参照を介してオーバーライドされたメソッドを呼び出すときには使用できません。

答えて

2

Kotlinコンパイラは、この程度までバイトコードを最適化しておらず、JVM自体がコードを最適化するのに非常に優れています。

さらに、inline関数は、Kotlinでパフォーマンスツールとして設計されていたのではなく、インライン展開なしでは達成できない非ローカル制御フローとコード変換に使用されます。

実際には、JVMは多くの最適化を実行します。コンパイラは、生成するバイトコードを最適化する必要がないようにしています。インライン展開は、JVMが行う最適化の1つです。 (1)(2)(3)

ネイティブコードの性質が全く異なるため、nor JVM can inline native methodsのコンパイラはありません。

Kotlinコンパイラは、プログラム全体の構造に影響を与えないいくつかのローカル最適化を実行します。これを行うもう1つの理由は、大幅な最適化で保存するのが難しいデバッグ経験です。正確なKotlinの最適化を確認するには、無料のコンパイラ引数に-Xno-optimize flagを追加して無効にしてから、生成されたバイトコードを調べたり、ベンチマークを行ったりできます。

関連する問題