我正在构建一个浏览器插件,它将在浏览器窗口中以幻灯片形式绘制图片,但是我创建的插件仅在第一个插件实例上绘制。如果我打开插件的多个实例,它会继续在第一个插件窗口上绘制,重叠每张图片。
我正在使用opengl从网址中绘制图片。
以下是使用线程在循环中绘制虚拟opengl tringle的代码:
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
我在这里做错了什么?
答案 0 :(得分:1)
根据你在评论中告诉我的内容,你的主要问题是你从一个有缺陷的例子开始。请记住,插件的每个实例都在同一个进程中启动;您正在使用的示例是一个简化的示例,它不使用插件的良好实践。更具体地说,它使用了几个全局变量。
除了你是线程之外,似乎没有做任何锁定以确保你完全线程安全。你生活在别人的过程中,你不拥有它 - 浏览器就是这样。你需要非常小心很多事情。
你的崩溃很可能与你的线程代码中没有干净关闭或者竞争条件有关。排除故障的最佳方法是附加一个调试器,找出它崩溃的地方,而不是只是在圈子里跑来跑去询问“为什么???为什么???!” (显然是为了效果)。你会感到震惊的是,很少有人做这么简单的步骤 - 连接一个调试器 - 直到我告诉他们,但它应该是你解决崩溃的第一步。
最后,值得一提的是:您是否意识到您正在使用6个月内无法使用的技术来构建它? FireFox将在今年年底取消对NPAPI的支持。我希望ActiveX的工作时间比这要长一些,但是edge不支持它。
FireBreath 2(在2.0分支中)是firebreath 1的一个重大变化,但它通过本机消息支持Chrome,并且也支持FireFox。有很多trying to convince MS to add native messaging support to Edge,但我们会看到这是怎么回事。请随意关注该链接并进行投票,因为它对我有所帮助,我怀疑。
事实是,你没有得到SDL或SDL2 w / native messaging;你必须使用WebGL并在javascript端执行dev,然后通过本机消息传递数据。或者你可以考虑使用NaCL,它有一些opengl /绘图的东西(甚至可能是SDL?不确定)但是是沙箱,可能有也可能没有你需要的网络东西。当然,它也适用于Chrome。
深思熟虑。祝你好运。