gpt4 book ai didi

opengl-es - HTC Desire 特定的 OpenGL ES 1 帧速率 - 无法正确处理

转载 作者:行者123 更新时间:2023-11-29 02:16:09 25 4
gpt4 key购买 nike

我正在尝试让一个非常简单的 openGL ES 1 程序在几台设备上以 60fps 的稳定速度运行,但我被 HTC desire 困住了。手机本身快速、活泼、功能强大,总体上使用起来轻而易举;但是,我似乎无法使用 OpenGL 以 60fps 全屏显示任何内容。在使用我的应用程序很长时间后,我决定使用文档中的示例代码制作一个测试应用程序。

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

在所有情况下,onDrawFrame 函数本身总是在 2 毫秒内完成。但通常情况下,onDrawFrame 在 30~40 毫秒之前不会再次调用,从而将我的帧速率一路降至 30fps 或更低。我用空的 onDrawFrame 得到大约 50fps,用 glClear 得到 45fps,用 quad 得到 35fps。同样的代码在 HTC Magic、三星 Galaxy S 和夏普 ISO1 上以 60 fps 的速度运行。由于其屏幕,Sony Experia X10 的帧率稳定在 30fps。我一直在 HTC Magic 上以稳定的 60fps 处理更复杂的场景,与 Desire 相比,它非常动力不足。我手头没有 Nexus One 可以测试。当然,我除了缓冲区交换以阻塞几毫秒。但它总是跳过帧。

为了找出手机在 onDrawFrame 处理程序之外 做什么,我尝试使用 Debug.startMethodTracing。我无法获得跟踪以反射(reflect)电话在循环之外花费的实际时间。在 onDrawFrame 结束时,我使用 startMethodTracing 然后将当前时间 (SystemClock.uptimeMillis) 保存在一个变量中。在下一个开始时,我 Log.e 自函数上次退出以来的时间差,以及 stopMethodTracing。这将被一遍又一遍地调用,所以我安排在我得到一个有 40 毫秒以上暂停的迭代跟踪后停止。结果跟踪的时间尺度小于 2 毫秒,就好像系统在我的程序之外花费了 38 毫秒。

我尝试了很多东西。枚举 EGL 配置并一个接一个地尝试它们。只是为了看看它是否改变了什么,我在脏方案要求在每一帧重绘时切换到渲染。无济于事。无论我做什么,交换缓冲区的预期间隔 14~16 毫秒将花费大约一半时间 30+ 毫秒,而且无论我做什么,设备似乎都在等待两次屏幕刷新。设备上的 ps 显示我的应用程序的 CPU 占用率约为 10%,而 System_server 为 35%。当然,我也尝试了显而易见的方法,杀死其他进程,重启设备……我总是得到完全相同的结果。

我在 canvas 绘图上没有同样的问题。

有谁知道为什么 Desire(并且只有 Desire)会这样?

作为引用,这是我的测试代码:

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

最佳答案

你应该看看这个http://www.google.com/events/io/2010/sessions/writing-real-time-games-android.html

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

关于opengl-es - HTC Desire 特定的 OpenGL ES 1 帧速率 - 无法正确处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3706786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com