当我旋转设备并且我的应用程序收到APP_CMD_CONFIG_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_CMD_CONFIG_CHANGED
之后等待几帧,大小总是正确的。每帧都查询大小,不考虑APP_CMD_CONFIG_CHANGED
,并检查它是否已经改变似乎也有效,但感觉不对。
答案 0 :(得分:1)
为了检测屏幕方向的变化,我决定不抓住APP_CMD_CONFIG_CHANGED
,而是每帧调用eglQuerySurface()
。如果屏幕尺寸值与保存的值不匹配,则屏幕方向已更改。
两次调用eglQuerySurface()
获取宽度和高度需要大约10微秒(调用10000次时为100毫秒),因此不会降低性能,并且100%保证将处理屏幕旋转。
我认为这个解决方案比在APP_CMD_CONFIG_CHANGED
之后等待几个帧要好。顺便说一下,将设备旋转到180度(颠倒)导致获得APP_CMD_CONFIG_CHANGED
事件,但实际上没有更改屏幕方向,并且不应执行调整大小的操作。
答案 1 :(得分:0)
它可能不起作用,因为例如在创建上下文时可能会设置表面大小,并且您查询“先前”大小(创建上下文时)。 编辑:< / strong>我已在SGS2(2.3.5)上测试过,我立即得到了正确的结果,因此它可能是设备“供应商”问题(或Android版本问题)。
Edit2:看起来我在测试时犯了一些错误,我也得到了像@IronMensan那样奇怪的结果。有时候它可以正常工作,但大部分都没有对不起,我错了。 所以我会像我最初的答案(下面)那样继续重新开发EGL语境。
当我得到APP_CMD_CONFIG_CHANGED时,我只是简单地破坏并重新创建EGL上下文(带着色器,纹理等),类似于我得到APP_CMD_TERM_WINDOW - &gt; APP_CMD_INIT_WINDOW。