2017-10-20 41 views
0

Je suis nouveau sur Kotlin, mais je veux essayer de l'utiliser pour le développement de jeux, en ciblant au moins Android avec OpenGL ES 2.0 et HTML5 avec WebGL (avec lequel je suis raisonnablement familier). Ne pas devoir avoir des versions légèrement différentes des classes/fonctions de mon moteur de rendu pour WebGL et GLES20 serait évidemment une bonne chose, mais y a-t-il un moyen pratique de réaliser cela à Kotlin sans surcharge?Le compilateur Kotlin peut-il optimiser les fonctions de wrapper?

Je pense que je vais devoir faire est d'écrire une classe qui implémente WebGLRenderingContextBase ou un clone de celui-ci (si un clone est nécessaire, je peux utiliser un délégué pour la mise en œuvre de WebGL) dans OpenGL ES 2.0, plein de méthodes comme ceci:

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

Je vais écrire un script pour faire le gros du travail. Ma question est, est-ce que le compilateur est assez intelligent pour optimiser de tels wrappers et utiliser GLES20.glBindBuffer etc directement dans ma classe 'vtable, ou quel que soit l'équivalent de la JVM? Vraisemblablement, inline ne peut être utile lors de l'appel d'une méthode surchargée via une référence à une interface ou à une classe de base.

Répondre

2

Le compilateur Kotlin n'optimise pas le bytecode à ce point, et il n'a pas besoin de: la JVM elle-même est assez bonne pour optimiser le code.

De plus, les fonctions inline n'ont pas été conçues pour être un outil de performance dans Kotlin, mais elles sont utilisées pour la transformation de flux non-local et la transformation de code qui ne peut pas être réalisée sans inline.

En fait, la JVM effectue beaucoup d'optimisations, évitant ainsi aux compilateurs d'optimiser le bytecode qu'ils génèrent trop de leur côté. Et l'inline est l'une des optimisations que la JVM peut faire. (1)(2)(3)

Bien que ni les compilateurs nor JVM can inline native methods, en raison de la nature complètement différente du code natif.

Le compilateur Kotlin, à son tour, effectue certaines optimisations locales qui n'affectent pas la structure globale du programme. Une raison de plus pour le faire est l'expérience de débogage qui est difficile à préserver avec des optimisations lourdes. Pour vérifier les optimisations exactes de Kotlin, vous pouvez essayer de les désactiver en ajoutant le -Xno-optimize flag aux arguments du compilateur gratuit, puis regardez dans le bytecode généré ou faites un benchmarking.