2009-08-21 76 views
1

快速回答:对于那些谁达到通过谷歌这个网页寻找 解决同样的问题,尝试 这种速战速决(由戈兹贝达建议) - 添加D3DCREATE_FPU_PRESERVE到您的CreateDevice() 调用中的 行为标志。这清理了我!DirectX的Firefox插件渲染的人工

我创建了一个基于DirectX 9的NPAPI插件。它似乎在Chrome和Opera中运行良好,但在Firefox中我得到了奇怪的渲染工件。在初始化DirectX时(不需要渲染工件就可以完成渲染),所有或部分Firefox用户界面将变黑。调整窗口大小(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

你想给我们看你的DX初始化代码吗? – Goz 2009-08-24 07:46:35

+0

希望授予。我早就这么做了,但我想清理并仔细检查一些事情。希望这可以帮助! – Toji 2009-08-24 13:31:23

回答

2

我能想到把我的头顶部设置“D3DCREATE_NOWINDOWCHANGES”唯一标志行为在设备上创建。

编辑1: 您可以尝试将backbufferwidth和height设置为0,并让它从窗口继承信息。

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

+0

不错的猜测,但这似乎没有任何区别。耻辱,我希望它会! ( – Toji 2009-08-24 13:21:47

+0

)令人吃惊的是,D3DCREATE_FPU_PRESERVE做到了!哇!这实际上表明Firefox中存在一个问题,但至少这提供了一个解决方法,谢谢谢谢谢谢,谢谢!我从来没有想过要自己尝试! – Toji 2009-08-24 14:57:16

+0

It我突然意识到,Firefox可能期待某个FPU prceision,并且D3D在FPU精度下玩得相当诡异 很高兴你被排序:) – Goz 2009-08-24 15:05:12