2016-09-09 5 views
0

J'ai écrit un jeu pour Android (en utilisant Android Studio, Gradle, le Framework Java avec OpenGL ES 2.0 sans NDK, le jeu est 3D) J'ai atteint une vitesse de environ 60fps en mode débogage. Lorsque je compile la version Release, la fréquence d'images diminue considérablement. J'ai essayé:Android: 60 fps en mode débogage, mais ralentir en mode de sortie

-Build en version sans optimisation et obfuscation. -J'ai testé avec différentes optimisations (en particulier pour le code en ligne) -J'ai essayé de nombreux périphériques différents, mais tous ressentent plus ou moins la baisse du nombre d'images.

La version finale est plus rapide que le débogage uniquement pour le temps de chargement des ressources. Je crois que la compilation ne favorise que la petite taille de code, mais pas la vitesse du code (qui consomme notoirement plus de mémoire et augmente la taille du code, Gradle ne semble pas traiter le problème avec le compilateur Java).

Est-ce que quelqu'un connaît une raison spécifique de cette circonstance. C'est vraiment frustrant de travailler pour atteindre une vitesse appropriée et ensuite de la perdre pour certains problèmes stupides d'outils.

-Update

Frame rate est presque constante, mais est inférieure à 30 images par seconde (sur le même appareil). La chose que je trouve inexplicable est qu'en mode débogage le jeu est vraiment fluide et clair comme il se doit, même avec tous les journaux actifs. Ceci est mon premier jeu Android, mais j'ai vingt ans d'expérience sur d'autres plateformes dans la programmation graphique et les moteurs graphiques. Je pense que c'est peut-être l'interférence de certains services Android qui limite la vitesse du jeu pour économiser de l'énergie. Je n'utilise pas de librairie externe pour la boucle principale du jeu, il n'y a pas de charges de mémoire pendant la boucle (la mémoire est constante dans le débogage). Je n'ai pas beaucoup d'expérience dans le débogage des versions de versions d'Android (regarder plus attentivement, mais je doute que c'est la faute de mon code). Merci pour les réponses de toute façon.

2 -Update

Utilisation du traceur pour la CPU d'Android studio, il semble que les cadres de version de version sont plus rapides que ceux de la version de débogage, comme il devrait être. Pour moi la cause du ralentissement est hors de mon code (pour l'instant). Personne n'est-il arrivé?

3 -Update

Lien vers systrace (Largeur de travail que le navigateur Chrome):

Release systrace

Debug systrace

4 -Update

Je l'ai remarqué lors de la compilation:

DE PRESSE tâches d'exécution: [: application: assembleRelease]

configuration à la demande est une caractéristique incubation. La compilation java incrémentale est une fonction d'incubation. : app: Prebuild UP-TO-DATE : app: preReleaseBuild UP-TO-DATE : app: checkReleaseManifest : app: pré Debug BUILD UP-TO-DATE < ===== Quoi? Est-ce normal? ...


DEBUG tâches d'exécution: [: application: incrementalDebugSupportDex]

configuration à la demande est une caractéristique incubation. La compilation java incrémentale est une fonction d'incubation. : app: buildInfoDebugLoader : app: Prebuild UP-TO-DATE : app: preDebugBuild UP-TO-DATE : app: checkDebugManifest : app: pré presse BUILD UP-TO-DATE < ===== Quel est?

Existe-t-il un moyen d'éditer les tâches de Gradle?

+0

Etes-vous vraiment sûr que c'est un problème avec l'outil? Dans tous les cas, je n'ai qu'un seul objectif: montez votre appli et découvrez quel est le problème. À partir de l'information contenue dans votre question, je doute que quelqu'un puisse vous aider. –

+1

Peut-être avez-vous des problèmes de concurrence (disons, du code devient plus rapide en mode release et exécute plus souvent le blocage d'un autre code, ce qui affecte fps) .. Veuillez définir "frame rate drops dramatic". S'il vous plaît essayer de faire un échantillon minimal ou trouver le goulot d'étranglement de la performance dans votre code et l'afficher. –

+0

En général la sortie certaine sera toujours beaucoup plus rapide car tout le code lié au débogage n'est pas inclus. –

Répondre

0

Ceci est une solution partielle.

Je viens de remplacer une fonction qui appelle une autre fonction avec une fonction en ligne:

originale

public void ParentChildrenMatrix(final D3GMATRIX ResultMatrix, final D3GModel3D Model) 
{ 

    D3GModel3D P = Model; 


    ResultMatrix.copy(Model.WorldMatrix); 

    while(P.Parent != null) 
    { 

     D3GMATRIX.multiplyMM(Hierarchy, P.Parent.WorldMatrix, ResultMatrix); 

     ResultMatrix.copy(Hierarchy); 

     P = P.Parent; 
    } 

} 

Procédure alternative

public void ParentChildrenMatrix(final D3GMATRIX ResultMatrix, final D3GModel3D Model) 
{ 

    D3GModel3D P = Model; 


    ResultMatrix.copy(Model.WorldMatrix); 

    while(P.Parent != null) 
    { 

     Hierarchy.M[_11] = (ResultMatrix.M[_11] * P.Parent.WorldMatrix.M[_11]) + (ResultMatrix.M[_12] * P.Parent.WorldMatrix.M[_21]) + (ResultMatrix.M[_13] * P.Parent.WorldMatrix.M[_31]) + (ResultMatrix.M[_14] * P.Parent.WorldMatrix.M[_41]); 
     Hierarchy.M[_12] = (ResultMatrix.M[_11] * P.Parent.WorldMatrix.M[_12]) + (ResultMatrix.M[_12] * P.Parent.WorldMatrix.M[_22]) + (ResultMatrix.M[_13] * P.Parent.WorldMatrix.M[_32]) + (ResultMatrix.M[_14] * P.Parent.WorldMatrix.M[_42]); 
     Hierarchy.M[_13] = (ResultMatrix.M[_11] * P.Parent.WorldMatrix.M[_13]) + (ResultMatrix.M[_12] * P.Parent.WorldMatrix.M[_23]) + (ResultMatrix.M[_13] * P.Parent.WorldMatrix.M[_33]) + (ResultMatrix.M[_14] * P.Parent.WorldMatrix.M[_43]); 
     Hierarchy.M[_14] = (ResultMatrix.M[_11] * P.Parent.WorldMatrix.M[_14]) + (ResultMatrix.M[_12] * P.Parent.WorldMatrix.M[_24]) + (ResultMatrix.M[_13] * P.Parent.WorldMatrix.M[_34]) + (ResultMatrix.M[_14] * P.Parent.WorldMatrix.M[_44]); 

     Hierarchy.M[_21] = (ResultMatrix.M[_21] * P.Parent.WorldMatrix.M[_11]) + (ResultMatrix.M[_22] * P.Parent.WorldMatrix.M[_21]) + (ResultMatrix.M[_23] * P.Parent.WorldMatrix.M[_31]) + (ResultMatrix.M[_24] * P.Parent.WorldMatrix.M[_41]); 
     Hierarchy.M[_22] = (ResultMatrix.M[_21] * P.Parent.WorldMatrix.M[_12]) + (ResultMatrix.M[_22] * P.Parent.WorldMatrix.M[_22]) + (ResultMatrix.M[_23] * P.Parent.WorldMatrix.M[_32]) + (ResultMatrix.M[_24] * P.Parent.WorldMatrix.M[_42]); 
     Hierarchy.M[_23] = (ResultMatrix.M[_21] * P.Parent.WorldMatrix.M[_13]) + (ResultMatrix.M[_22] * P.Parent.WorldMatrix.M[_23]) + (ResultMatrix.M[_23] * P.Parent.WorldMatrix.M[_33]) + (ResultMatrix.M[_24] * P.Parent.WorldMatrix.M[_43]); 
     Hierarchy.M[_24] = (ResultMatrix.M[_21] * P.Parent.WorldMatrix.M[_14]) + (ResultMatrix.M[_22] * P.Parent.WorldMatrix.M[_24]) + (ResultMatrix.M[_23] * P.Parent.WorldMatrix.M[_34]) + (ResultMatrix.M[_24] * P.Parent.WorldMatrix.M[_44]); 

     Hierarchy.M[_31] = (ResultMatrix.M[_31] * P.Parent.WorldMatrix.M[_11]) + (ResultMatrix.M[_32] * P.Parent.WorldMatrix.M[_21]) + (ResultMatrix.M[_33] * P.Parent.WorldMatrix.M[_31]) + (ResultMatrix.M[_34] * P.Parent.WorldMatrix.M[_41]); 
     Hierarchy.M[_32] = (ResultMatrix.M[_31] * P.Parent.WorldMatrix.M[_12]) + (ResultMatrix.M[_32] * P.Parent.WorldMatrix.M[_22]) + (ResultMatrix.M[_33] * P.Parent.WorldMatrix.M[_32]) + (ResultMatrix.M[_34] * P.Parent.WorldMatrix.M[_42]); 
     Hierarchy.M[_33] = (ResultMatrix.M[_31] * P.Parent.WorldMatrix.M[_13]) + (ResultMatrix.M[_32] * P.Parent.WorldMatrix.M[_23]) + (ResultMatrix.M[_33] * P.Parent.WorldMatrix.M[_33]) + (ResultMatrix.M[_34] * P.Parent.WorldMatrix.M[_43]); 
     Hierarchy.M[_34] = (ResultMatrix.M[_31] * P.Parent.WorldMatrix.M[_14]) + (ResultMatrix.M[_32] * P.Parent.WorldMatrix.M[_24]) + (ResultMatrix.M[_33] * P.Parent.WorldMatrix.M[_34]) + (ResultMatrix.M[_34] * P.Parent.WorldMatrix.M[_44]); 

     Hierarchy.M[_41] = (ResultMatrix.M[_41] * P.Parent.WorldMatrix.M[_11]) + (ResultMatrix.M[_42] * P.Parent.WorldMatrix.M[_21]) + (ResultMatrix.M[_43] * P.Parent.WorldMatrix.M[_31]) + (ResultMatrix.M[_44] * P.Parent.WorldMatrix.M[_41]); 
     Hierarchy.M[_42] = (ResultMatrix.M[_41] * P.Parent.WorldMatrix.M[_12]) + (ResultMatrix.M[_42] * P.Parent.WorldMatrix.M[_22]) + (ResultMatrix.M[_43] * P.Parent.WorldMatrix.M[_32]) + (ResultMatrix.M[_44] * P.Parent.WorldMatrix.M[_42]); 
     Hierarchy.M[_43] = (ResultMatrix.M[_41] * P.Parent.WorldMatrix.M[_13]) + (ResultMatrix.M[_42] * P.Parent.WorldMatrix.M[_23]) + (ResultMatrix.M[_43] * P.Parent.WorldMatrix.M[_33]) + (ResultMatrix.M[_44] * P.Parent.WorldMatrix.M[_43]); 
     Hierarchy.M[_44] = (ResultMatrix.M[_41] * P.Parent.WorldMatrix.M[_14]) + (ResultMatrix.M[_42] * P.Parent.WorldMatrix.M[_24]) + (ResultMatrix.M[_43] * P.Parent.WorldMatrix.M[_34]) + (ResultMatrix.M[_44] * P.Parent.WorldMatrix.M[_44]); 

     System.arraycopy(Hierarchy.M, 0, ResultMatrix.M, 0, 16); 



     P = P.Parent; 
    } 

} 

Cependant, je ne comprenais pas pourquoi la fonction d'origine dans la version de débogage fonctionnait beaucoup plus vite que dans l'ancienne version. La seule raison valable est que dans la version, la fonction est "optimisée" de manière incorrecte (mieux vaut ne pas l'optimiser).