1

快速解答:对于那些通过 Google 访问此页面并寻找相同问题解决方案的人,请尝试此快速修复(由 Goz 建议) - 将D3DCREATE_FPU_PRESERVE添加到 CreateDevice() 调用的行为标志中。这为我清除了它!

我正在创建一个基于 DirectX 9 的 NPAPI 插件。它似乎在 Chrome 和 Opera 中运行良好,但在 Firefox 中我得到了奇怪的渲染工件。初始化 DirectX 后(不需要为工件进行渲染),Firefox UI 的全部或部分将变黑。调整窗口大小(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 );
4

1 回答 1

2

我唯一能想到的就是在设备创建时设置“D3DCREATE_NOWINDOWCHANGES”行为标志。

Edit1: 您可以尝试将 backbufferwidth 和 height 设置为 0 并让它继承窗口中的信息。

可能也值得尝试设置 D3DCREATE_FPU_PRESERVE 标志和 D3DCREATE_MULTITHREADED。

于 2009-08-24T08:11:11.103 回答