Я создал 16 устройств Direct3D размером примерно 320x200 пикселей. Я вызываю IDirect3DDevice9 :: Present для каждого устройства в отдельном потоке каждые 40 мс. На ноутбуках с Windows XP и встроенным графическим адаптером Intel GMA945 часть устройств не обновляется, если отображается системная подсказка или меню «Пуск». IDirect3DDevice9 :: Present не возвращает никаких кодов ошибок в данный момент, в программе все выглядит хорошо, но пользователь может видеть, что перемещение на нескольких устройствах зависает. Что может быть причиной для этого?
Это прекрасно работает в Windows 7 с тем же оборудованием и в Windows XP с другим оборудованием, поэтому проблема только в этой комбинации. Я должен поддержать это, так как мои клиенты используют эту комбинацию оборудования и ОС. MSDN ничего не говорит о том, что я должен создать только одно устройство D3D (по крайней мере, я не могу его найти), поэтому проблема должна быть в другом месте.
Что я пытаюсь найти, так это то, что, возможно, есть какая-то комбинация флагов, которая могла бы решить мою проблему. На данный момент я использую следующее:
D3DPRESENT_PARAMETERS param = {};
param.Windowed = TRUE;
param.SwapEffect = D3DSWAPEFFECT_DISCARD;
param.hDeviceWindow = GetSafeHwnd();
param.BackBufferCount = 1;
param.BackBufferFormat = D3DFMT_UNKNOWN;
param.BackBufferWidth = m_szDevice.Width;
param.BackBufferHeight = m_szDevice.Height;
param.MultiSampleType = D3DMULTISAMPLE_NONMASKABLE;
param.Flags = D3DPRESENTFLAG_VIDEO;
param.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
param.MultiSampleType = D3DMULTISAMPLE_NONE;
param.MultiSampleQuality = 0;