我正在开发一个使用 Qt 5.15.11 和 ANGLE 的应用程序,它需要与我无法控制的另一个应用程序很好地配合。通过使用小型 DirectX 测试应用程序进行大量实验,我确定可以通过使用交换链的翻转模型来解决该问题,例如像这样:
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
使用PIX,我相对确定我的应用程序当前没有使用这个SwapEffect,这就是为什么它不能很好地发挥作用。
我尝试挖掘角度代码,似乎我需要将属性 EGL_DIRECT_COMPOSITION_ANGLE 设置为 EGL_TRUE 才能启用此功能。这就是我陷入困境的地方:我不知道如何实现这一目标。
我可以让 Qt 和 ANGLE 使用此 SwapEffect (或 FLIP_SEQUENTIAL;我认为两者都有效)吗?我需要重新编译 Qt 还是可以通过环境变量或其他配置方法来完成?我目前一直使用 Qt 5.15,但将来升级到 Qt 6 也并非完全不可能。
这花了一些时间,但我们已经开始测试这种方法:我们的问题就这样解决了。
为了回答这个问题,我将提供我在 Qt 中到底更改了什么以启用此交换效果:
在 /src/plugins/platforms/windows/qwindowseglcontext.cpp 行中我进行了以下更改:
void *QWindowsEGLStaticContext::createWindowSurface(void *nativeWindow, void *nativeConfig, int *err)
{
*err = 0;
EGLint attribs[3] = {
EGL_DIRECT_COMPOSITION_ANGLE, EGL_TRUE,
EGL_NONE
};
EGLSurface surface = libEGL.eglCreateWindowSurface(m_display, nativeConfig,
static_cast<EGLNativeWindowType>(nativeWindow), attribs); //attribs was nullptr before