2016-09-09 25 views
0

Android用のゲームを作成しました(Androidスタジオ、Gradle、NDKなしのOpenGL ES 2.0を搭載したJava Framework、ゲームは3Dです)デバッグモードでは約60fpsです。 リリースバージョンをビルドすると、フレームレートが大幅に低下します。 私は試しました:Android:60fpsのデバッグモードでリリースモードが遅くなる

-Buildは、最適化と難読化なしでリリースしました。 - さまざまな最適化(特にインラインコード用)を試しました - 多種多様なデバイスを試しましたが、多分、フレームレートの低下を感じます。

リリースバージョンは、アセットのロード時にのみデバッグするよりも高速です。 コンパイルは小さなコードサイズにしか向いていませんが、コードのスピード(コードのサイズを増やすことで悪名高い、GradleはJavaコンパイラで問題を処理していないようです)とは思えません。

誰もがこのような状況の具体的な理由を知っていますか?適切なスピードを達成するためには本当にイライラしていて、いくつかのツールでは愚かな問題のためにそれを失います。

-update

フレームレートはほぼ一定であるが、(同じデバイス上に)毎秒30フレーム未満です。 私が見つけにくいのは、デバッグモードでは、すべてのアクティブなログがあっても、ゲームは本当に流動的で、明確であるということです。 これは私の最初のAndroidゲームですが、グラフィカルプログラミングやグラフィックスエンジンの他のプラットフォームでは20年の経験があります。 私はそれが、エネルギーを節約するためにゲームの速度を制限するAndroidサービスの一部の干渉かもしれないと思います。 ゲームのメインループに外部ライブラリを使用していないため、ループ中にメモリの負荷がありません(メモリはデバッグ時に一定です)。 Androidのリリースバージョンをデバッグする経験はあまりありません(もっと注意深く見ていきますが、私のコードの誤りだとは思わない)。とにかくお返事ありがとうございます。 AndroidのメーカーのCPUのためのトレーサーを使用して

-update 2

、あるべきとしてリリースバージョンのフレームは、デバッグバージョンのものより速くであることを表示されます。 私のために、減速の原因は私のコード外です(今のところ)。 これは誰も起こっていませんか?

-update 3

SYSTRACEへのリンク(作業のみ幅Chromeブラウザ):

Release systrace

Debug systrace

-update 4

コンパイルするとき、私はこれに気づいた:

RELEASE 実行タスク:[:アプリ:assembleRelease]オンデマンド

設定がインキュベート機能です。 インクリメンタルなJavaコンパイルはインキュベーション機能です。 :アプリ:事前に作成UP-TO-DATE :アプリ:preReleaseBuild UP-TO-DATE :アプリ:checkReleaseManifest :アプリ:事前デバッグビルドUP-TO-DATE < =====何?それは普通ですか? ...


DEBUG 実行タスク:[:アプリ:incrementalDebugSupportDex]オンデマンド

設定がインキュベート機能です。 インクリメンタルなJavaコンパイルはインキュベーション機能です。 :アプリ:buildInfoDebugLoader :アプリ:事前に作成UP-TO-DATE :アプリ:preDebugBuild UP-TO-DATE :アプリ:checkDebugManifest :アプリ:事前リリースUP-TO-DATE <ビルド=====何ですか?

Gradleのタスクを編集する方法はありますか?

+0

本当にツールに問題がありますか?いずれにせよ、私はちょうど1つのアドバイスを持っています:あなたのアプリからちょっと離れたものをプロファイリングし、問題点を見つけ出してください。あなたの質問のちょうど情報から、私は誰もあなたを助けることができないと思う。 –

+1

多分あなたはいくつかの並行性の問題を抱えているかもしれません(例えば、いくつかのコードはリリースモードで速くなり、いくつかの他のコードをブロックし、何がfpsに影響するかをより頻繁に実行します)。最小限のサンプルを作成するか、コードのパフォーマンスのボトルネックを見つけて投稿してください。 –

+0

一般的には、デバッグ関連のコードはすべて含まれていないため、リリースは常に高速になります。 –

答えて

0

これは部分的な解決策です。

私はちょうどインライン関数で別の関数を呼び出した関数に置き換え:なぜ私は理解していなかったしかし

オリジナル

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; 
    } 

} 

代替手順

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; 
    } 

} 

をデバッグバージョンの元の関数ははるかに速く実行されていた古いリリースのバージョンよりも。 有効な唯一の理由は、リリース時に機能が「最適化」されていることです(最適化されていない方が良い)。

関連する問題