Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在multihead设置中阻止Direct3D在发布时闪烁?_C++_Direct3d_Direct3d9 - Fatal编程技术网

C++ 如何在multihead设置中阻止Direct3D在发布时闪烁?

C++ 如何在multihead设置中阻止Direct3D在发布时闪烁?,c++,direct3d,direct3d9,C++,Direct3d,Direct3d9,我有一个带有小触摸屏和大屏幕的信息亭系统,我有一个可以在大屏幕上播放视频的应用程序。由于某些原因,当Direct3D停止(应用程序退出)时,两个屏幕都会闪烁(变黑,然后恢复) 我将问题简化为一个程序,该程序只需打开一个焦点窗口,初始化Direct3D设备,然后将其释放。释放时(或在不释放的情况下停止程序),两个屏幕都会闪烁 熟悉Direct3D的人能看看这个并告诉我我做错了什么吗 #包括 #包括 #包括 const char g_szClassName[]=“myWindowClass”; LR

我有一个带有小触摸屏和大屏幕的信息亭系统,我有一个可以在大屏幕上播放视频的应用程序。由于某些原因,当Direct3D停止(应用程序退出)时,两个屏幕都会闪烁(变黑,然后恢复)

我将问题简化为一个程序,该程序只需打开一个焦点窗口,初始化Direct3D设备,然后将其释放。释放时(或在不释放的情况下停止程序),两个屏幕都会闪烁

熟悉Direct3D的人能看看这个并告诉我我做错了什么吗

#包括
#包括
#包括
const char g_szClassName[]=“myWindowClass”;
LRESULT回调WndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM)
{
开关(msg)
{
案例WM_结束:
窗口(hwnd);
打破
案例WM_销毁:
PostQuitMessage(0);
打破
违约:
返回DefWindowProc(hwnd、msg、wParam、lParam);
}
返回0;
}
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE HPPreInstance、LPSTR lpCmdLine、int nCmdShow){
WNDCLASSEX wc;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=0;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(空,IDI_应用程序);
wc.hCursor=LoadCursor(空,IDC_箭头);
wc.hbrBackground=(HBRUSH)(彩色窗口+1);
wc.lpszMenuName=NULL;
wc.lpszClassName=g_szClassName;
wc.hIconSm=LoadIcon(空,IDI_应用程序);
如果(!RegisterClassEx(&wc)){
MessageBox(NULL,“窗口注册失败!”,“错误!”,MB|U图标连接| MB|U OK);
返回0;
}
HWND HWND=CreateWindowEx(
前客户,
g_szClassName,
“焦点窗口”,
WS|U弹出窗口| WS|U可见,
CW_USEDEFAULT,CW_USEDEFAULT,240,120,
NULL,NULL,hInstance,NULL);
if(hwnd==NULL){
MessageBox(NULL,“窗口创建失败!”,“错误!”,MB|U图标连接| MB|U OK);
返回0;
}
显示窗口(hwnd、nCmdShow);
更新窗口(hwnd);
IDirect3D9*m_pD3D=Direct3DCreate9(D3D_SDK_版本);
如果(m_pD3D==NULL){
MessageBox(NULL,“初始化direct3D失败!”,“错误!”,MB|U图标连接| MB|U OK);
返回0;
}
//第二个显示器是1920 x 1080
D3D当前参数m参数;
零内存(&m_参数,sizeof(m_参数));
m_param.BackBufferWidth=1920;
m_param.BackBufferHeight=1080;
m_param.BackBufferFormat=D3DFMT_X8R8G8B8;
m_param.BackBufferCount=1;
m_param.MultiSampleType=D3D multisample_NONE;
m_param.SwapEffect=d3dswapeeffect_副本;
m_param.hDeviceWindow=hwnd;
m_param.Windowed=FALSE;
m_param.Flags=D3DPRESENTFLAG_视频;
m_param.FullScreen_RefreshRateInHz=D3D当前_速率_默认值;
m_param.PresentationInterval=D3DPRESENT_INTERVAL_ONE;
HRESULT-hr;
IDirect3DDevice9*m_pD3DD;
hr=m_pD3D->CreateDevice(
1.
D3DDEVTYPE_HAL,
hwnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_多线程,
&穆帕拉姆,
&m_pD3DD
);
如果(hr!=S_正常){
MessageBox(NULL,“无法创建direct3D设备!”,“错误!”,MB|U图标连接| MB|U OK);
返回0;
}
睡眠(3000);
//闪烁在这里发生
m_pD3DD->Release();
m_pD3D->Release();
返回0;
}

注意:此程序应在同一视频卡上具有两个屏幕的任何设置上运行,但第二个屏幕的宽度/高度可能需要调整(它在
BackBufferWidth
BackBufferHeight
中硬编码)

不确定这是否适用于您,但在尝试互联网上的各种示例时,避免闪烁的唯一方法似乎是在无边界窗口中使用窗口模式:

...

HWND hwnd = CreateWindowEx(
    0,
    g_szClassName,
    "Focus Window",
    WS_POPUP | WS_VISIBLE, // <-- borderless window
    800, 0,                // <-- position on 2nd screen
    1920, 1080,            // <-- fill entire 2nd screen
    NULL, NULL, hInstance, NULL);

...

D3DPRESENT_PARAMETERS m_param;
ZeroMemory(&m_param, sizeof(m_param));
m_param.BackBufferWidth = 1920;
m_param.BackBufferHeight = 1080;
m_param.BackBufferFormat = D3DFMT_X8R8G8B8;
m_param.BackBufferCount = 1;
m_param.MultiSampleType = D3DMULTISAMPLE_NONE;
m_param.SwapEffect = D3DSWAPEFFECT_COPY;
m_param.hDeviceWindow = hwnd;
m_param.Windowed = TRUE;   // <-- use windowed mode
m_param.Flags = D3DPRESENTFLAG_VIDEO;
m_param.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
m_param.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
。。。
HWND HWND=CreateWindowEx(
0,
g_szClassName,
“焦点窗口”,

WS_POPUP | WS_VISIBLE,//您正在使用“全屏”模式,该模式具有一些专门的处理(例如确保用户在Direct3D全屏应用程序退出时确实可以看到某些内容)。您应该尝试使用无边框窗口使用“windowed”模式。有关DirectX 11示例,请参见案例中的
WM_SYSKEYDOWN
。@Chuck,谢谢您提供的线索。但是,当我尝试m_param.windowed=TRUE时,视频播放的质量会降低-撕页或掉帧。我认为这是因为某些优化(如D3DSWAPEFFECT_COPY with the backbuffer)未完成?是否有办法避免退出全屏(独占)移动时出现闪烁/闪烁?非常感谢。使用
Windows=TRUE
时,屏幕闪烁确实消失,但我的质量明显较低(我在Direct3D设备上播放视频)。存在页面撕裂或帧丢失。我认为在全屏上进行的一些优化并不是在窗口模式下进行的。是否有一些方法可以在窗口模式下进行优化,并且仍然获得相同的质量?可能是一些
SwapEffect
BackBufferCount
参数我有错?@AndrasTompa如果不使用XP,请尝试启用Aero主题