2011-09-29 230 views
5

当我转动我的设备和我的应用程序临危APP_CMD_CONFIG_CHANGED,我尝试用下面的更新我的OpenGL视:eglQuerySurface给出错误的大小

EGLint width; 
EGLint height; 
eglQuerySurface(display,surface,EGL_WIDTH,&width); 
eglQuerySurface(display,surface,EGL_HEIGHT,&height); 

glViewport(0,0,width,height); 

MY_LOG_MACRO2("New window size: %d x %d",width,height); 

这工作的时间约为20%。其他80%的时间宽度和高度是以前的值。换句话说,当我将设备转到横向模式时,大部分时间都会记录纵向大小。当我回到肖像时,横向尺寸被记录下来。

我从ANativeWindow得到的尺寸也没有太大的好运。

我应该怎么做才能在旋转后获得正确的窗口大小?

更新:

通过APP_CMD_CONFIG_CHANGED后等待几帧,大小总是正确的。在不考虑APP_CMD_CONFIG_CHANGED的情况下查询每一帧的大小,并检查它是否发生了变化似乎也可以工作,但感觉不对。

+0

你在哪里调用该代码? Opengl上下文是线程特定的。如果这段代码是在随机线程中运行的,那么只有在使用设置了上下文的线程时才可以工作 – crazyjul

+0

@crazyjul我的应用程序只有一个线程。当ALooper_pollAll得到一个'APP_CMD_CONFIG_CHANGED'事件,然后我运行'pollSource-> process(appState,pollSource)''时,这个函数被调用。我的事件循环与示例代码几乎相同。 – IronMensan

+0

来自Android论坛的帖子有相同的问题http://groups.google.com/group/android-ndk/browse_thread/thread/8fcfd0177eb78c26/9bfe07b81c36fdea?pli = 1 – crazyjul

回答

0

它可能不起作用,因为例如在创建上下文时可能会设置表面大小,并且您查询“previous”大小(创建上下文时)。 编辑:我已经在SGS2(2.3.5)上测试过了,我立即得到正确的结果,所以它可能是一个设备的'供应商'问题(或Android版本问题)。

编辑2:看起来我在测试时犯了一些错误,我也得到了怪异的结果@IronMensan。有时它可以正常工作,但大多不是。对不起,我错了。 因此,我会留在EGL上下文的休闲,就像我在最初的回答(下面)。

当我得到APP_CMD_CONFIG_CHANGED时,我只是简单地销毁并重新创建EGL上下文(着色器,纹理等),类似于当我得到APP_CMD_TERM_WINDOW - > APP_CMD_INIT_WINDOW时。

+0

再看看我刚刚添加的问题和更新 - 表面被调整大小,通常不会立即。平均需要大约五帧。 – IronMensan

+0

@IronMensan:我刚刚测试过它,它在我得到APP_CMD_CONFIG_CHANGED后正常工作,然后eglQuerySurface(EGL_WIDTH/EGL_HEIGHT)立即给我正确的结果。在SGSII(2.3.5-KI3)上测试。所以这可能是一个供应商实施问题。什么是您的设备和Android版本? – kibab

+0

HTC Evo 4G Android 2.3.3。看起来兼容性测试将比我预期的更加痛苦。 – IronMensan

1

为了检测屏幕方向的变化,我决定不抓住APP_CMD_CONFIG_CHANGED,但每帧调用eglQuerySurface()。如果屏幕尺寸值与保存的值不匹配,则屏幕方向已更改。

两次调用eglQuerySurface()用于获取宽度和高度需要大约10微秒(当被称为10000次时为100毫秒),所以它不会降低性能,并且100%保证屏幕旋转将被处理。

我认为这个解决方案比在APP_CMD_CONFIG_CHANGED之后等待几个帧更好。顺便说一下,将设备旋转180度(颠倒)会导致事件发生,但实际上并未更改屏幕方向,也不应执行任何调整大小的操作。