EGL_SWAP_BEHAVIOR_PRESERVED这是什么意思
时间: 2023-08-15 17:06:30 浏览: 250
`EGL_SWAP_BEHAVIOR_PRESERVED` 是一个常量,用于配置 EGL(OpenGL ES Graphics Library)表面(Surface)的交换行为。在 EGL 中,交换行为决定了绘图缓冲区(Framebuffer)的内容何时被传输到显示设备上进行显示。
具体而言,`EGL_SWAP_BEHAVIOR_PRESERVED` 表示交换行为被保留,即在交换(Swap)后,绘图缓冲区的内容将保留不变。这意味着绘图缓冲区的内容将一直保持,直到下一次交换发生。
通常情况下,当绘图缓冲区的内容被传输到显示设备上后会被清空或重置。然而,使用 `EGL_SWAP_BEHAVIOR_PRESERVED` 可以保持绘图缓冲区的内容,从而在每次交换后可以保留之前绘制的内容。
这种交换行为对于特定的应用场景可能是有用的,例如需要在多个帧之间进行渲染状态的保持或者需要实现双缓冲(Double Buffering)机制的应用程序。
需要注意的是,`EGL_SWAP_BEHAVIOR_PRESERVED` 的可用性取决于具体的 EGL 实现和硬件平台。不同的设备和驱动程序可能对此支持程度有所不同。因此,在使用时需要查阅相关文档或参考 EGL 规范来确认支持的情况。
相关问题
Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
这个错误提示表明在你的应用程序中使用了一个EGL_SWAP_BEHAVIOR_PRESERVED配置,但是该配置不被支持,所以系统会尝试使用其他配置。这通常是由于硬件或驱动程序的限制导致的。这个错误提示不会影响你的应用程序的正常运行,但是可能会导致一些性能问题。
如果你想解决这个问题,你可以尝试升级你的硬件或者驱动程序,或者使用其他支持的配置。你也可以忽略这个错误提示,因为它不会对你的应用程序的正常运行造成影响。
#define X(VAL) {VAL, #VAL} struct {EGLint attribute; const char* name;} names[] = { X(EGL_BUFFER_SIZE), X(EGL_ALPHA_SIZE), X(EGL_BLUE_SIZE), X(EGL_GREEN_SIZE), X(EGL_RED_SIZE), X(EGL_DEPTH_SIZE), X(EGL_STENCIL_SIZE), X(EGL_CONFIG_CAVEAT), X(EGL_CONFIG_ID), X(EGL_LEVEL), X(EGL_MAX_PBUFFER_HEIGHT), X(EGL_MAX_PBUFFER_PIXELS), X(EGL_MAX_PBUFFER_WIDTH), X(EGL_NATIVE_RENDERABLE), X(EGL_NATIVE_VISUAL_ID), X(EGL_NATIVE_VISUAL_TYPE), X(EGL_SAMPLES), X(EGL_SAMPLE_BUFFERS), X(EGL_SURFACE_TYPE), X(EGL_TRANSPARENT_TYPE), X(EGL_TRANSPARENT_RED_VALUE), X(EGL_TRANSPARENT_GREEN_VALUE), X(EGL_TRANSPARENT_BLUE_VALUE), X(EGL_BIND_TO_TEXTURE_RGB), X(EGL_BIND_TO_TEXTURE_RGBA), X(EGL_MIN_SWAP_INTERVAL), X(EGL_MAX_SWAP_INTERVAL), X(EGL_LUMINANCE_SIZE), X(EGL_ALPHA_MASK_SIZE), X(EGL_COLOR_BUFFER_TYPE), X(EGL_RENDERABLE_TYPE), X(EGL_CONFORMANT),
这段代码使用了宏定义和结构体定义,用于创建一个包含 EGL 属性名和属性值的数组。具体来说,宏定义 `X(VAL)` 定义了一个名为 `X` 的宏,它的参数是 `VAL`,宏的展开结果是一个结构体初始化器,其中包含了一个 `EGLint` 类型的属性值和一个字符串常量,字符串常量的内容是这个属性值对应的 EGL 属性名。
接下来,使用结构体定义创建了一个名为 `names` 的数组,该数组的元素是这个结构体类型,其中,`attribute` 字段表示 EGL 属性值,`name` 字段表示 EGL 属性名。数组的初始化使用了宏定义 `X`,它根据参数展开为一个结构体初始化器,其中第一个参数是 EGL 属性值,第二个参数是 EGL 属性名。
这样,我们就可以通过查询 EGL 配置属性的值,并将其和属性名对应起来。比如,我们可以通过如下代码查询当前 EGL 窗口的颜色缓冲区大小:
```c++
EGLint bufferSize;
eglGetConfigAttrib(display, config, EGL_BUFFER_SIZE, &bufferSize);
for (int i = 0; i < sizeof(names) / sizeof(names[0]); i++) {
if (names[i].attribute == EGL_BUFFER_SIZE) {
printf("%s: %d\n", names[i].name, bufferSize);
break;
}
}
```
这样就可以输出类似于 `EGL_BUFFER_SIZE: 32` 的信息。
阅读全文