Qt 5.15+ANGLE如何启用Flip Model交换链及配置咨询
解决方案:在Qt 5.15/Qt 6 + ANGLE中启用Flip Model交换链
Qt 5.15.11 实现方式
无需重新编译Qt,可通过代码设置QSurfaceFormat传递ANGLE所需的EGL属性,步骤如下:
定义EGL属性常量:Qt头文件未内置
EGL_DIRECT_COMPOSITION_ANGLE的定义,需自行添加:#define EGL_DIRECT_COMPOSITION_ANGLE 0x3200 #define EGL_TRUE 1设置全局Surface格式:在应用初始化阶段,将该属性注入默认
QSurfaceFormat:#include <QSurfaceFormat> #include <QGuiApplication> int main(int argc, char *argv[]) { QSurfaceFormat format; // 启用ANGLE的Direct Composition,对应Flip Model交换链 format.setOption(QSurfaceFormat::FormatOption(QSurfaceFormat::CustomEGLAttribute, EGL_DIRECT_COMPOSITION_ANGLE, EGL_TRUE)); // 设置为全局默认格式 QSurfaceFormat::setDefaultFormat(format); QGuiApplication app(argc, argv); // 后续应用逻辑... }验证效果:运行应用后,用PIX工具检查交换链的
SwapEffect是否变为DXGI_SWAP_EFFECT_FLIP_DISCARD或DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL。
如果代码设置无效,可尝试添加环境变量ANGLE_ENABLE_DIRECT_COMPOSITION=1(部分ANGLE版本支持该开关),配合代码设置使用。
Qt 6 实现方式
Qt 6对ANGLE和DXGI的支持更完善,提供了更直接的配置方式:
方式1:环境变量配置
无需修改代码,直接设置系统/应用环境变量:
- 启用
FLIP_DISCARD:QT_QPA_WINDOWS_DXGI_SWAP_EFFECT=flip_discard - 启用
FLIP_SEQUENTIAL:QT_QPA_WINDOWS_DXGI_SWAP_EFFECT=flip_sequential
方式2:代码设置
与Qt 5.15类似,通过QSurfaceFormat传递EGL属性:
#include <QSurfaceFormat> #include <QGuiApplication> int main(int argc, char *argv[]) { QSurfaceFormat format; // 注入EGL_DIRECT_COMPOSITION_ANGLE属性 format.setOption(QSurfaceFormat::FormatOption(QSurfaceFormat::CustomEGLAttribute, 0x3200, // EGL_DIRECT_COMPOSITION_ANGLE 1)); QSurfaceFormat::setDefaultFormat(format); QGuiApplication app(argc, argv); // 后续应用逻辑... }
Qt 6部分版本默认已启用Flip Model交换链,若未生效,再通过上述方式强制开启即可。
是否需要重新编译Qt?
- Qt 5.15.11:无需重新编译。Qt 5.15.x捆绑的ANGLE版本均支持
EGL_DIRECT_COMPOSITION_ANGLE扩展,通过代码或环境变量即可生效。 - Qt 6:同样无需编译,环境变量或代码设置即可覆盖默认行为。
内容的提问来源于stack exchange,提问作者JayEff
相关产品推荐
相关产品推荐

