Android:在调试模式下为60 fps,但在发布模式下放慢速度

时间:2016-09-09 17:00:30

标签: android opengl-es-2.0 compiler-optimization frame-rate

我为Android编写了一个游戏(使用Android Studio,Gradle,带有OpenGL ES 2.0的Java框架,没有NDK,游戏是3D)我在调试模式下达到了大约60fps的速度。 当我构建Release版本时,帧速率会急剧下降。 我试过了:

- 在没有优化和混淆的版本中构建。 - 我测试了不同的优化(特别是对于内联代码) - 我尝试了很多不同的设备,但是或多或少都感觉到帧速率的下降。

发布版本比仅针对资产加载时间的调试更快。 我认为编译只支持小代码大小,但不支持代码的速度(众所周知,代码消耗更多内存并增加了代码的大小,Gradle似乎没有用Java编译器来处理这个问题)。

有没有人知道这种情况的具体原因。努力达到适当的速度然后因某些工具愚蠢的问题而失去它真的很令人沮丧。

-Update

帧速率几乎不变但低于30 fps(在同一设备上)。 我发现莫名其妙的事情是,在调试模式下,即使使用所有活动日志,游戏也应该是流畅和清晰的。 这是我的第一款Android游戏,但我在图形编程和图形引擎的其他平台上有二十年的经验。 我认为这可能是某些Android服务的干扰限制了游戏的速度以节省能源。 我不使用外部库作为游戏的主循环,循环期间没有内存负载(内存在调试中是常量)。 我没有太多经验来调试Android的发布版本(' ll看起来更仔细,但我怀疑它是我的代码的错误)。 无论如何,谢谢你的答案。

-Update 2

使用Android Studio的CPU跟踪器,看起来发布版本的帧比Debug版本的帧快,应该是这样。 对我来说,放慢速度的原因是我的代码(现在)。 没有人发生这件事吗?

-Update 3

链接到systrace(仅限工作宽度的Chrome浏览器):

Release systrace

Debug systrace

-Update 4

编译时我注意到了这一点:

RELEASE 执行任务:[:app:assembleRelease]

按需配置是一项孵化功能。 增量java编译是一个孵化功能。 :app:preBuild UP-TO-DATE :app:preReleaseBuild UP-TO-DATE :应用:checkReleaseManifest :app:pre 调试构建UP-TO-DATE< =====什么?这是正常的吗? ...

DEBUG 执行任务:[:app:incrementalDebugSupportDex]

按需配置是一项孵化功能。 增量java编译是一个孵化功能。 :应用:buildInfoDebugLoader :app:preBuild UP-TO-DATE :app:preDebugBuild UP-TO-DATE :应用:checkDebugManifest :app:pre 发布构建UP-TO-DATE< =====什么是?

有没有办法编辑Gradle的任务?

1 个答案:

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

}

但是我不明白为什么调试版本中的原始函数运行速度比旧发行版本快得多。 唯一有效的原因是在发布时功能被“优化”错误(最好不要优化)。