Opengl es HTC Desire特定OpenGL ES 1帧速率-can';我没弄对

Opengl es HTC Desire特定OpenGL ES 1帧速率-can';我没弄对,opengl-es,android,Opengl Es,Android,我正试图让一个相当简单的openGL ES 1程序在两台设备上以60帧/秒的速度平稳运行,我被HTC desire卡住了。这款手机本身速度快、速度快、功能强大,总体来说使用起来很轻松;然而,我似乎无法用OpenGL以60帧/秒的速度全屏显示任何内容。在我的应用程序被卡住了很长一段时间后,我决定用文档中的示例代码制作一个测试应用程序 这就是我正在做的。带有GLSurfaceView的简单初始化代码。我有三个版本的onDrawFrame,都非常简单。一个是空的。一个只包含glClear。其中一个包含

我正试图让一个相当简单的openGL ES 1程序在两台设备上以60帧/秒的速度平稳运行,我被HTC desire卡住了。这款手机本身速度快、速度快、功能强大,总体来说使用起来很轻松;然而,我似乎无法用OpenGL以60帧/秒的速度全屏显示任何内容。在我的应用程序被卡住了很长一段时间后,我决定用文档中的示例代码制作一个测试应用程序

这就是我正在做的。带有GLSurfaceView的简单初始化代码。我有三个版本的onDrawFrame,都非常简单。一个是空的。一个只包含glClear。其中一个包含的状态刚好足够绘制一个全屏四边形。跟踪之前和之后的时间。在我的程序中除了我的GLSURFACHEVIEW之外没有其他视图。我无法解释我得到的次数

在所有情况下,onDrawFrame函数本身总是在2ms以下完成。但通常情况下,onDrawFrame在30~40ms之前不会再次被调用,帧速率一直下降到30fps或更低。 我在一个空的onDrawFrame上获得大约50帧,在glClear上获得45帧,在quad上获得35帧。 同样的代码在HTC Magic、三星Galaxy S和夏普ISO1上以每秒60帧的速度运行。索尼Experia X10因其屏幕而以每秒30帧的速度稳定播放。我一直在HTC Magic上以每秒60帧的速度拍摄复杂得多的场景,与《欲望》相比,这部电影动力不足。我手头没有Nexus One可供测试。 当然,我需要将缓冲区交换到块上几毫秒。但它总是在画面上跳跃

为了找出手机在onDrawFrame处理程序之外正在做什么,我尝试使用Debug.startMethodTracing。我无法获得跟踪信息来反映手机在环路外的实际时间。 在onDrawFrame的末尾,我使用startMethodTracing,然后将当前时间(SystemClock.uptimeMillis)保存在一个变量中。在下一个函数开始时,我记录自函数上次退出以来的时间差,并停止MethodTracing。这将被一遍又一遍地调用,所以一旦我得到一个40毫秒以上暂停的迭代跟踪,我就安排停止。 结果跟踪上的时间标度小于2ms,就好像系统在我的程序之外花费了38ms

我试了很多东西。枚举EGL配置并逐个尝试。为了看看它是否改变了什么,当脏方案在每一帧请求重画时,我切换到了渲染。无济于事。无论我做什么,交换缓冲区的14~16ms的预期间隔将花费30+ms的时间,大约占一半的时间,而且无论我做什么,设备似乎都在等待两次屏幕刷新。设备上的ps显示我的应用程序大约有10%的cPU,系统服务器大约有35%。当然,我也尝试过显而易见的方法,杀死其他进程,重新启动设备。。。我总是得到同样精确的结果

我在画布绘制方面没有同样的问题

有人知道为什么欲望(仅限于欲望)会这样吗

以下是我的测试代码,仅供参考:

public class GLTest extends Activity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        mGLView = new GLSurfaceView(this);  
        mGLView.setRenderer(new ClearRenderer());  
        setContentView(mGLView);  
    }  

    @Override  
    protected void onPause() {  
        super.onPause();  
        mGLView.onPause();  
    }  

    @Override  
    protected void onResume() {  
        super.onResume();  
        mGLView.onResume();  
    }  

    private GLSurfaceView mGLView;  
}  

class ClearRenderer implements GLSurfaceView.Renderer {  
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {}  
    public void onSurfaceChanged(GL10 gl, int w, int h) { gl.glViewport(0, 0, w, h); }  

    long start;  
    long end;  
    public void onDrawFrame(GL10 gl)  
    {  
    start = System.currentTimeMillis();  
    if (start - end > 20)  
        Log.e("END TO START", Long.toString(start - end));  
    //        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
    end = System.currentTimeMillis();  
    if (end - start > 15)  
        Log.e("START TO END", Long.toString(end - start));  
    }  
}  

也许我已经得到了答案:opengl驱动程序可能会在以后的步骤中决定执行大部分实际渲染。默认情况下,此步骤在绘制帧后立即执行,这似乎是设备离开该方法后处于空闲状态的原因。好消息是,您可以将此步骤直接包含到
onDrawFrame
方法中:只需调用
gl.glFinish()
-这将完成最终渲染,并在完成后返回。之后不应该有空闲时间。然而,坏消息是,实际上没有空闲时间,因此您将无法恢复这段时间(我对渲染速度有一些幻想…现在我不得不面对我的实现的真正缓慢;))。关于
glFinish
,您应该知道的是:似乎有一个操作系统级的错误,它会导致一些htc设备(如desire)出现死锁,据我所知,它仍然存在于2.2中。如果动画运行数小时,似乎会发生这种情况。然而,网络上存在一个修补的opengl表面视图实现,您可以使用它来避免这个问题。不幸的是,我现在没有这个链接,但是你应该可以通过谷歌找到它(很抱歉!)。可能有一些方法可以使用花费在
glFinish()
中的时间:可能是某些(全部?)部分的gpu活动,因此cpu可以自由地进行其他处理

你应该看看这个


他建议您将帧速率保持在30fps而不是60fps。

很抱歉,建议我完全忽略这个问题根本无法回答问题。我不是在写一个游戏,虽然30fps对于大多数实时游戏来说已经足够了,但我对游戏的可玩性没有任何问题,但在流畅性方面:我的动画在30fps时仍然显得起伏不平,而在60帧时则显得流畅。30fps对于我的案例来说显然是不够的。谢谢你的链接-我想这才是真正的答案。第一代手机在低保费场景下使用60FPS,新手机似乎停留在30fps最大,但在更大的屏幕上。另外,今天这是一个有点老的视频(2010),所以它不仅是可取的,而且Android编排者将开始注意到如果UI运行在低于60fps…你可能想考虑使用文本格式化使这个答案更容易阅读。