2016-07-17 12 views
-1

私はブラウザウィンドウ内でスライドショーとして画像を描画するブラウザプラグインを構築していますが、作成したプラグインは最初のプラグインインスタンスでしか描画しません。プラグインの複数のインスタンスを開くと、最初のプラグインウィンドウで各ピクチャと重複して描画されます。FireBreathプラグインがすべてのプラグインインスタンスで描画されない

私はURLから画像を描画するためにOpenGLを使用しています。続い

は、スレッドを使用して、ループ内でダミーのOpenGL tringlesを描画するコードである:

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

このブラウザではどのような現象が発生していますか?ウィンドウモードまたはウィンドウレスモードですか? (私は窓が付いていると思いますが、そうでない場合は大きな問題です)。プラグインのインスタンスごとにスレッドの新しいインスタンスを開始していますか?各スレッドは独自のプラグインhwndのインスタンスを含む独自のデータを持っていますか? SetFocusの呼び出しが何かをしても最初から一度だけ呼び出され、各ウィンドウでは一度も呼び出されないことに気づいていますか? – taxilian

+0

これはFirefoxとIEの両方で発生し、私はウィンドウモードのみを使用しています。また、各プラグインインスタンスには独自のスレッドとデータがあります。 SetFocusについて私は、元の実装で直面していた問題を複製するためにOpenGLサンプルプラグインからそのコードを使用しましたが、SetFocusを削除すると出力に何の違いもありませんでした。 –

+0

hDCとhRCの定義を追加できますか?私はそれらが共有されていないと思いますか? – taxilian

答えて

1

あなたがコメントで教えてくれたことから、あなたの主な問題は、あなたが欠陥のある例から始まっていることです。プラグインのすべてのインスタンスが同じプロセスで起動することを忘れないでください。あなたが使っている例は、プラグインの良い習慣を使わない単純なものです。最も具体的には、いくつかのグローバル変数を使用します。

スレッドに加えて、スレッドセーフであることを確認するためにロックを行っているようではありません。あなたは他人のプロセスに住んでいますが、あなたはそれを所有していません - ブラウザはそうです。あなたは多くのことに非常に注意する必要があります。

あなたのクラッシュは、きれいにシャットダウンしていないか、スレッドコード内の競合状態にある可能性があります。トラブルシューティングの最善の方法は、デバッガを接続し、 "Why ?? why ???!?"という質問をサークル内を周回するのではなく、クラッシュする場所を見つけることです。 (エフェクトを強調している、明らかに)。デバッグをするまで、簡単なステップを実行する人はほとんどいませんが、クラッシュのトラブルシューティングの最初のステップになるはずです。

最後に、次のように質問しています。これは、6ヶ月で利用できない技術でこれを構築していることを認識していますか? FireFoxは年末にNPAPIのサポートを削除しています。私は、ActiveXがそれよりも少し長く働くことを期待していますが、エッジはそれをサポートしていません。

FireBreath 2(2.0ブランチ内)はFirebreath 1からの大きな変更ですが、ネイティブメッセージングによるChromeをサポートしており、FireFoxもサポートします。 trying to convince MS to add native messaging support to Edgeがたくさんありますが、それがどのように進むかを見ていきます。そのリンクをたどって投票しても大丈夫だと思っています。

SDLまたはSDL2ネイティブメッセージは表示されません。 WebGLを使用して、javascript側でdevを実行してから、ネイティブメッセージングでデータを取得する必要があります。代わりにあなたはいくつかのOpenGL/Drawing(おそらくSDL?確かではありません)を持っていますが、sandboxedであり、あなたが必要とするネットワーキングを持っているかもしれないかもしれないNaCLを使用して調べることができます。もちろん、Chrome上でのみ動作します。

思考のための食べ物。がんばろう。

+0

あなたのコメントをありがとう、私は物事が間違っている場所を見つけるしようとします。しかし、デバッグのために、私はこれまでに持っていたいくつかの問題を解決するためにデバッガを使用しましたが、Firefoxでプラグインをクラッシュさせるとデバッガが終了し、クラッシュレポートに役立つ情報は得られません。 –

+0

その場合、デバッガが正しく接続されていない - FYI – taxilian

関連する問題