0

我有一个在几个 Android 设备上运行的 OpenGL 程序,没有任何问题。但是,当我在 Kindle Fire 上运行我的应用程序时,我的调用eglSwapInterval()返回EGL_BAD_PARAMETER.

我的电话看起来像:

eglSwapInterval( eglGetDisplay( EGL_DEFAULT_DISPLAY ), 1 );

我知道 1 是默认值,并且接受的最小值和最大值之外的值将被静默钳制。这就是为什么我对为什么“1”是一个不好的参数感到困惑的原因。我的代码允许基于 init 结构传入其他值,但我现在正在调试的错误是传入 1 导致的。

有任何想法吗?

谢谢。

4

3 回答 3

1

也许这会有所帮助:

目前你永远不能直接在屏幕上绘制,所以这没有意义。您总是在绘制到表面抛掷表面,完成后将其合成到屏幕上,并且屏幕合成是​​垂直同步的。 https://groups.google.com/forum/#!topic/android-developers/HvMZRcp3pt0

(这意味着它作为一个可能的参考,它什么都不做。但我还不能评论答案。)

于 2013-07-02T04:19:50.440 回答
0

看起来 Kindle 的 EGL 实现有一个错误。我将描述原因,然后提出解决方法。

默认的交换间隔确实是 1。来自 EGL 1.4 规范,第 3.9.3 节 Posting Semantics:

EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint
interval);

[...]

The default swap interval is 1.

该部分还指出

interval is silently clamped to minimum and
maximum implementation dependent values before being stored; these values are
defined by EGLConfig attributes EGL_MIN_SWAP_INTERVAL and EGL_MAX_-
SWAP_INTERVAL respectively.

因此,eglSwapInterval需要接受interval=1,即使实现不支持它。该实现需要静默钳制它而不会出错。

我怀疑 Kindle在超出范围EGL_BAD_PARAMETER时会发出声音。您可以使用 发现查询范围。interval[EGL_MIN_SWAP_INTERVAL, EGL_MAX_INTERVAL]eglGetConfigAttrib

作为一种解决方法,我建议您的应用程序查询交换间隔界限,并在调用eglSwapInterval.

作为对 Clyde 的回复:即使在 Android 等复合环境中,交换间隔也确实有意义并且符合您的预期。如果 vsync 间隔为 60Hz,上下文的交换间隔为 2,则 eglSwapBuffers 将限制为 30Hz。

于 2013-08-14T19:05:37.490 回答
0

据我所知, eglSwapInterval 在 Android 上什么也没做。所以调用它可能没有什么意义,如果 Kindle 实现没有实现任何调用它可能会简单地抛出一个错误。

于 2013-03-01T10:22:19.727 回答