FireBreath 插件不会在所有插件实例上绘制

FireBreath plugin doesn't draw on all plugin instances

本文关键字:插件 实例 绘制 FireBreath      更新时间:2023-10-16

我正在构建一个浏览器插件,它将在浏览器窗口中以幻灯片的形式绘制图片,但我创建的插件仅使用第一个插件实例。如果我打开插件的多个实例,它会在第一个插件窗口上不断绘制,并与每个图片重叠。

我正在使用opengl从url中绘制图片。

以下是使用线程在循环中绘制虚拟opengl字符串的代码:

FB::PluginWindowWin*PluginWindowWin=dynamic_cast(pluginWindow);

EnableOpenGL(pluginWindowWin->getHWND(), &hDC, &hRC);
SetFocus(pluginWindowWin->getHWND());
//FB::
static int fps = 1;
GLfloat rotate = 0;
static double start = 0, diff, wait;
wait = 1 / fps;
//return 0;
while (true)
{
    //lets check for keyboard input
    try
    {
        FB::Rect pos = pluginWindow->getWindowPosition();
        PAINTSTRUCT ps;
        if (pluginWindowWin){
            hDC = BeginPaint(pluginWindowWin->getHWND(), &ps);
            pos.right -= pos.left;
            pos.left = 0;
            pos.bottom -= pos.top;
            pos.top = 0;
            rotate += 0.1f;
            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT);
            glPushMatrix();
            glRotatef(rotate, 0.0f, 1.0f, 0.0f);
            glBegin(GL_TRIANGLES);
            glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f);
            glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.87f, -0.5f);
            glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.87f, -0.5f);
            glEnd();
            glBegin(GL_QUADS);                                              // Draw A Quad
            glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.0f);                           // Top Left
            glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.0f);                            // Top Right
            glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(0.5f, -0.5f, 0.0f);                           // Bottom Right
            glColor3f(0.0f, 0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.0f);                           // Bottom Left
            glEnd();                                                        // Done Drawing The Quad
            glPopMatrix();
            glRotatef(rotate, 0.0f, 1.0f, 0.0f);

            SwapBuffers(hDC);
        }
        //rtri+=0.1f;
        ::SetTextAlign(hDC, TA_CENTER | TA_BASELINE);
        LPCTSTR pszText = _T("FireBreath Plugin!n:-)");
        ::TextOut(hDC, pos.left + (pos.right - pos.left) / 2, pos.top + (pos.bottom - pos.top) / 2, pszText, lstrlen(pszText));
        if (pluginWindowWin) {
            // Release the device context
            EndPaint(pluginWindowWin->getHWND(), &ps);
        }
    }
    catch (...)
    {
        return 0;
    }

    Sleep(10);

}//end of while run

有什么事我做错了吗?

根据您在评论中告诉我的内容,您的主要问题是从一个有缺陷的示例开始。请记住,插件的每个实例都是在同一个过程中启动的;您使用的示例是一个简化的示例,它没有使用插件的良好实践。最具体地说,它使用了几个全局变量。

除此之外,你正在穿线,但似乎没有做任何锁,以确保你是完全线程安全的。你生活在别人的过程中,你不拥有它——浏览器拥有它。在很多事情上你需要非常小心。

很可能您的崩溃与没有干净地关闭有关,或者可能与线程代码中的竞争条件有关。解决这一问题的最佳方法是连接调试器并找出它崩溃的位置,而不是只是绕圈子问"为什么??为什么??!?"(显然是为了检验效果)。在我告诉他们之前,很少有人会做这个简单的步骤——连接调试器——你会感到震惊,但这应该始终是故障排除的第一步。

最后,值得一问的是:你意识到你是在一项6个月内无法获得的技术上构建这项技术吗?FireFox将在今年年底取消对NPAPI的支持。我希望ActiveX的工作时间比这长一点,但edge不支持它

FireBreath 2(在2.0分支中)是firebreth 1的一个主要变化,但它通过本地消息支持Chrome,并将支持FireFox。有很多人试图说服MS向Edge添加本地消息传递支持,但我们将拭目以待。请随时关注该链接并投票,因为我怀疑这也会对你有所帮助。

问题是,您无法获得带有本地消息的SDL或SDL2;您必须使用WebGL并在javascript端进行开发,然后通过本地消息传递提取数据。或者,你可以考虑使用NaCL,它确实有一些opengl/绘图的东西(甚至SDL也不确定),但它是沙盒的,可能有也可能没有你需要的联网东西。当然,它也只能在Chrome上运行。

值得思考。祝你好运