Android-NDK-OpenGL;轻微的减速

Android-NDK-OpenGL;轻微的减速,android,opengl-es,android-ndk,unity3d,Android,Opengl Es,Android Ndk,Unity3d,我在基于Tegra2的Android 2.2设备上编写了一个简单的OGL ES 2.0程序。它只是在屏幕上渲染一个带有漫反射和镜面反射照明的大四边形(没有法线贴图)。显然,我对表演很好奇。我通过计算一秒钟的增量时间的总和来测量它,然后将该总和除以计算的FPS总数。代码如下: long currentTime = System.currentTimeMillis(); long deltaTime = currentTime - lastTime; lastTime = currentTime;

我在基于Tegra2的Android 2.2设备上编写了一个简单的OGL ES 2.0程序。它只是在屏幕上渲染一个带有漫反射和镜面反射照明的大四边形(没有法线贴图)。显然,我对表演很好奇。我通过计算一秒钟的增量时间的总和来测量它,然后将该总和除以计算的FPS总数。代码如下:

long currentTime = System.currentTimeMillis();
long deltaTime = currentTime - lastTime;
lastTime = currentTime;

timeCounter += deltaTime;
FPS++;

if (timeCounter >= 1000)
{
    System.out.println(FPS + "    " + (float)timeCounter/(float)FPS);

    timeCounter = 0;
    FPS = 0;
}
在我运行程序后,前2-3次测量(秒)给了我大约31-33 FPS的速度,但在那之后,一次测量下降到28-29,最后下降到26并保持在这个数字。这里有趣的是,26=52/2,无论我做什么,我都不能让我的程序运行得比52 FPS快,即使是最简单的纯色片段着色器。此外,稍微更改着色器(例如,通过从镜面反射计算中删除pow函数)不会影响性能-仍然为26 FPS。必须进行更高性能的重(或轻)更改才能看到FPS的更改。所以我想知道这里是否有任何同步?有人经历过这样的事吗


我还用Unity 3D制作了一个简单的程序,它和我原来的程序完全一样。我甚至复制了GLSL片段着色器,并对其进行了一些调整,以符合Unity 3D,而不是使用首选的Cg/HLSL语言。Unity中程序的计时清楚地显示了在31-33左右的稳定FPS,这是我在程序的前2-3秒得到的。我知道Unity是一款很好的软件,但我希望我的程序在相同的条件下执行,几乎完全相同:)。

System.out.println本身呢?呃,你的等式正确吗?您正在计算每帧的毫秒数。这是一件小事,但在你的代码中,如果你在1秒内得到26帧,它会说“fps38.46”。如果它说的是“fps26”,那么你是在以每秒38帧(1/26)的速度空转@Kay:我想过,但我认为这不是问题所在。正如我所说的,如果我将片段着色器更改为更简单的东西,FPS将提高,高达52。所以println不是拖延的罪魁祸首。此外,它每秒只被调用一次,甚至没有包含在实际计时中。@Jerdak:我不确定我是否理解。。。我为每帧的FPS变量添加1。1000毫秒过后,我显示这个数字,这将是在最后一秒钟内生成的实际帧数。@maxest jerdak关于第二部分计时器/FPS是正确的。那么...怎么样