与win7相比,我们的产品在win8上的表现太奇怪了。所以尝试了PNTriangles11 DX SDK示例并获得了相同的结果。这是在测试BestBuy的行为后,24个系统的行为都相同,所有调用EnumOutputs都失败了。无论是台式机,笔记本电脑,一体机还是平板电脑都没关系。
我们的directx图表产品看起来像......还显示了我们的WPF图表组件,以及由同样的故障问题引起的更多亮度变化。
所以这导致了研究,我发现我可以通过添加以下内容在Win7上重现......
HRESULT CD3D11Enumeration::EnumerateOutputs( CD3D11EnumAdapterInfo* pAdapterInfo )
{
HRESULT hr;
IDXGIOutput* pOutput;
for( int iOutput = 0; ; ++iOutput )
{
pOutput = NULL;
hr = pAdapterInfo->m_pAdapter->EnumOutputs( iOutput, &pOutput );
// FORCE FAILURE ON WIN7 FOR TESTING PURPOSES
hr = DXGI_ERROR_NOT_FOUND;
if( DXGI_ERROR_NOT_FOUND == hr )
{
return S_OK;
}
else if( FAILED( hr ) )
{
return hr; //Something bad happened.
}
else //Success!
{
CD3D11EnumOutputInfo* pOutputInfo = new CD3D11EnumOutputInfo;
if( !pOutputInfo
虽然要在Win8和Win7上运行sdk示例,但您还需要修改(为非零hAdapterMonitor添加测试......
// Check to see if the window needs to be resized.
// Handle cases where the window is minimized and maxmimized as well.
bool bNeedToResize = false;
if(hAdapterMonitor && DXUTGetIsWindowedFromDS( pNewDeviceSettings ) &&
!bKeepCurrentWindowSize )
{
UINT nClientWidth;
UINT nClientHeight;
if( IsIconic( DXUTGetHWNDDeviceWindowed() ) )
{
以上允许您修改win7上的问题,作为开发win8的方法。
所以我的问题是,在Win8上处理EnumOutputs失败的最佳解决方案是什么。或者您认为DXUT的其他变化有用。
微软正在研究这个问题,我希望很快就会发布他们的回复,但是需要讨论这个主题,因为许多dxut启发的软件项目或那些使用EnumOutputs的人在Win8上失败了。
回答1:微软确实回复了我的初步回应,让PNTriangles11在Win8上工作。他们指出我在DXUTApplyDefaultDeviceSettings(DXUTDeviceSettings * modifySettings)中的变化......modifySettings->d3d11.sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
必须改为......
modifySettings->d3d11.sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
但仍需要DXUTChangeDevice的简单解决方法:测试非零hAdapterMonitor ......
bool bNeedToResize = false;
if(hAdapterMonitor && DXUTGetIsWindowedFromDS( pNewDeviceSettings ) && !bKeepCurrentWindowSize )
{
UINT nClientWidth;
UINT nClientHeight;
if( ::IsIconic( DXUTGetHWNDDeviceWindowed() ) )
{
// Window is currently minimized. To tell if it needs to resize,
还在等待微软的解释为什么EnumOutputs在我在BestBuy上测试的所有24个系统上都失败了。