Opengl es eglQuerySurface给出了错误的大小

Opengl es eglQuerySurface给出了错误的大小,opengl-es,android-ndk,Opengl Es,Android Ndk,当我旋转设备并且我的应用程序收到app\u CMD\u CONFIG\u CHANGED时,我尝试用以下内容更新我的OpenGL视口: EGLint width; EGLint height; eglQuerySurface(display,surface,EGL_WIDTH,&width); eglQuerySurface(display,surface,EGL_HEIGHT,&height); glViewport(0,0,width,height); MY_LOG_MA

当我旋转设备并且我的应用程序收到
app\u CMD\u CONFIG\u CHANGED
时,我尝试用以下内容更新我的OpenGL视口:

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\u CMD\u CONFIG\u更改后等待几帧,大小总是正确的。查询每一帧的大小,不考虑APP_CMD_CONFIG_CHANGED
,并检查它是否已更改似乎也能正常工作,但感觉有误。

这可能不起作用,因为例如,创建上下文时可能会设置曲面大小,而您查询“先前”大小(创建上下文时)编辑:我已经在SGS2(2.3.5)上测试了它,我立即得到了正确的结果,因此可能是设备“供应商”问题(或Android版本问题)

Edit2:看起来我在测试时犯了一些错误,我在@IronMensan中也得到了奇怪的结果。有时它能正常工作,但大多数情况下不能。对不起,我弄错了。 因此,我将继续在我最初的答案(如下)中重新创建EGL上下文


当我改变APP_CMD_CONFIG_时,我只是简单地破坏并重新创建EGL上下文(使用着色器、纹理等),类似于我得到APP_CMD_TERM_WINDOW->APP_CMD_INIT_WINDOW时的情况。

为了检测屏幕方向的变化,我决定不捕捉
APP_CMD_CONFIG_CHANGED
,而是在每一帧调用
eglQuerySurface()
。如果屏幕大小值与保存的值不匹配,则屏幕方向已更改

两次调用
eglQuerySurface()
获取宽度和高度大约需要10微秒(调用10000次时为100毫秒),因此不会降低性能,并能100%保证屏幕旋转得到处理


我认为这个解决方案比在
APP\u CMD\u CONFIG\u更改后等待几帧要好。顺便说一下,将设备旋转180度(倒置)会导致获得
APP\u CMD\u CONFIG\u CHANGED
事件,但实际上没有更改屏幕方向,也不应执行任何与调整大小相关的操作

再看一看这个问题和我刚才添加的更新-曲面的大小调整了,只是通常不会立即调整。IronMensan:我刚刚测试过它,它工作正常,在我更改了APP_CMD_CONFIG_之后,eglQuerySurface(EGL_宽度/EGL_高度)立即给了我正确的结果。在SGSII(2.3.5-KI3)上测试。因此,这可能是某个供应商的实现问题。您的设备和安卓版本是什么?HTC Evo 4G安卓2.3.3。看起来兼容性测试将比我预期的更痛苦。作为参考,我有一位英雄运行Gingerbread 2.3.4(通过一个修改过的ROM,我正在使用Elelinux),我也看到了这一点。@IronMensan:我编辑了我的答案,我看到了同样奇怪的行为。你把这些代码称为哪里?Opengl上下文是线程特定的。若这段代码是在随机线程中运行的,那个么它可能只在设置了上下文的线程时才起作用used@crazyjul我的应用程序只有一个线程。当ALOPER_pollAll获取一个
APP\u CMD\u CONFIG\u CHANGED
事件,然后我运行
pollSource->process(appState,pollSource)
时,将调用此函数。我的事件循环与示例代码几乎相同