【问题标题】:eglQuerySurface gives wrong sizeeglQuerySurface 给出错误的大小
【发布时间】:2011-11-28 01:42:07
【问题描述】:

当我旋转我的设备并且我的应用收到 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,并检查它是否发生了变化,似乎也可以,但感觉不对。

【问题讨论】:

  • 您在哪里调用该代码? Opengl 上下文是特定于线程的。如果这段代码在随机线程中运行,它可能只在使用带有上下文集的线程时才有效
  • @crazyjul 我的应用程序只有一个线程。当 ALooper_pollAll 获得 APP_CMD_CONFIG_CHANGED 事件然后我运行 pollSource->process(appState,pollSource) 时,将调用此函数。我的事件循环与示例代码几乎相同。
  • 来自 Android 论坛的帖子有同样的问题 groups.google.com/group/android-ndk/browse_thread/thread/…

标签: opengl-es android-ndk


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 再看一下我刚刚添加的问题和更新 - 表面已调整大小,但通常不会立即调整。平均大约需要五帧。
    • @IronMensan:我刚刚测试过它并且它工作正常,在我得到 APP_CMD_CONFIG_CHANGED 然后 eglQuerySurface(EGL_WIDTH/EGL_HEIGHT) 立即给我正确的结果。在 SGSII(2.3.5-KI3) 上测试。所以这可能是一些供应商实施问题。你的设备和安卓版本是什么?
    • HTC Evo 4G Android 2.3.3。看起来兼容性测试会比我预期的更痛苦。
    • 作为参考,我有一个运行 Gingerbread 2.3.4 的英雄(通过修改后的 ROM,我正在使用 Elelinux),我也看到了这个。
    • @IronMensan:我已经编辑了我的答案,我看到了同样奇怪的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2021-08-04
    • 1970-01-01
    • 2013-11-10
    • 2017-10-11
    • 1970-01-01
    相关资源
    最近更新 更多