Вопрос

БЫСТРЫЙ ОТВЕТ:Для тех из вас, кто попадает на эту страницу через Google, ищущий Чтобы решить ту же проблему, попробуйте это быстрое исправление (предложено Goz) - Добавлять D3DCREATE_FPU_PRESERVE в флаги поведения в CreateDevice() звать.Это прояснило для меня ситуацию!

Я создаю плагин NPAPI на основе DirectX 9.Кажется, в Chrome и Opera все работает хорошо, но в Firefox возникают странные артефакты рендеринга.После инициализации DirectX (для появления артефакта не требуется рендеринг) весь или часть пользовательского интерфейса Firefox станет черной.Изменение размера окна (IE:Запуск перерисовки) устраняет артефакты, и плагин, кажется, работает правильно на этом этапе, но это явно нежелательная «функция».Я обнаружил, что несколько других пользователей в Интернете упомянули эту проблему, большинство из которых утверждают, что она началась с Firefox 3.Только один пост упоминает какое-либо найденное решение, но автор, похоже, не хочет раскрывать, каким образом.

Кто-нибудь знаком с этой проблемой и возможным решением?Судя по связанному сообщению, это может быть связано со способом инициализации DX, но мне еще предстоит найти комбинацию, которая предотвратила бы эту проблему.

Это код инициализации DX, который я использую (обработка ошибок удалена для ясности):

RECT rc;
GetClientRect(pluginHwnd, &rc);

D3DPRESENT_PARAMETERS d3d9PresentParams;
ZeroMemory(&d3d9PresentParams, sizeof(D3DPRESENT_PARAMETERS));    

d3d9PresentParams.hDeviceWindow = pluginHwnd;
d3d9PresentParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3d9PresentParams.Flags = D3DPRESENTFLAG_DEVICECLIP; // Failed attempt to solve FF issue
d3d9PresentParams.EnableAutoDepthStencil = FALSE; // No depth testing
d3d9PresentParams.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // Use Vsync

d3d9PresentParams.MultiSampleType = D3DMULTISAMPLE_NONE; // Don't care about Multisampling
d3d9PresentParams.MultiSampleQuality = 0;

d3d9PresentParams.BackBufferCount = 1; 
d3d9PresentParams.BackBufferWidth = rc.right - rc.left; 
d3d9PresentParams.BackBufferHeight = rc.bottom - rc.top;  
d3d9PresentParams.BackBufferFormat = D3DFMT_UNKNOWN; // Use the same color format as windows 

d3d9PresentParams.Windowed = TRUE; // Explicitly windowed
d3d9PresentParams.FullScreen_RefreshRateInHz = 0;

d3d9->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, pluginHwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3d9PresentParams, &d3d9Device );
Это было полезно?

Решение

Единственное, о чем я могу сразу подумать, — это установить флаг поведения «D3DCREATE_NOWINDOWCHANGES» при создании устройства.

Редактировать1:Вы можете попробовать установить ширину и высоту обратного буфера на 0 и позволить ему наследовать информацию из окна.

Возможно, также стоит попробовать установить флаг D3DCREATE_FPU_PRESERVE и D3DCREATE_MULTITHREADED.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top