快速回答:对于那些通过Google寻找此页面的人 尝试解决同样的问题 这个快速解决方案(由Goz建议) - 将 D3DCREATE_FPU_PRESERVE 添加到 CreateDevice()上的行为标志 呼叫。那为我清理了!
我正在创建一个基于DirectX 9的NPAPI插件。它似乎在Chrome和Opera中运行良好,但在Firefox中我得到了奇怪的渲染工件。在初始化DirectX时(不需要进行渲染以显示工件)Firefox UI的全部或部分将变为黑色。调整窗口大小(IE:启动重绘)会清除工件,插件似乎在此时正常工作,但这显然不是理想的“功能”。我发现网上其他几个人都提到了这个问题,大多数人声称它始于Firefox 3.只有one post提到找到任何解决方案,但作者似乎并不热衷于泄露这些问题。
是否有人熟悉此问题并提供可能的解决方案?从链接的帖子看,它似乎与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 );
答案 0 :(得分:2)
我能想到的唯一一件事就是在设备创建时设置“D3DCREATE_NOWINDOWCHANGES”行为标志。
<强> EDIT1:强> 您可以尝试将backbufferwidth和height设置为0,并让它从窗口继承信息。
也可能值得尝试设置D3DCREATE_FPU_PRESERVE标志和D3DCREATE_MULTITHREADED。