0

gitlab-ci-runnerを使用して、コミットごとにデスクトップ Qt/OpenGL アプリケーションを自動的にテストしています。Windows 8 では、アプリケーションは gitlab-ci-runner でインストールされたシステム サービスによって実行されるため、「非表示」で実行されます。つまり、デスクトップが表示されません。「公開」イベントを取得しない OpenGL モジュールを除いて、すべての UI モジュールはとにかく初期化して実行します。ウィンドウを公開せずに OpenGL コンテキストに描画しようとすると、エラーが発生します。

QOpenGLContext::swapBuffers() called with non-exposed window, behavior is undefined

実行中のデスクトップ セッションでサービスから Windows GUI アプリケーションを実行することはかなり難しく、推奨されないことがわかりました (「Windows サービスで GUI アプリケーションを実行するにはどうすればよいですか?」 を参照してください)。

ここで、ユーザーがアプリケーションを表示する必要はありません。OpenGL 部分が正しく機能する必要があるだけです。どういうわけかウィンドウを公開するように「ふりをする」ことができる方法はありますか、またはこれをシステムサービスから正しく実行する他の方法はありますか?

4

1 に答える 1

0

どういうわけかウィンドウを公開するように「ふりをする」ことができる方法はありますか、またはこれをシステムサービスから正しく実行する他の方法はありますか?

あなたが直面している 2 つの問題:

  1. ウィンドウが公開されていない場合、レンダリングされるすべてのピクセルはピクセル所有権テストに失敗し、レンダリングはすべてのピクセルに対して NoOp になります。これを回避するには、PBuffer または (推奨) フレームバッファ オブジェクトを使用します。どちらもオンスクリーン ウィンドウではすぐには機能しないため、コードを変更する必要があります。

  2. 通常、サービスとして開始された Windows プロセスはグラフィックス ハードウェアにアクセスできないため、ソフトウェア GDI OpenGL フォールバックの機能に制限されます (OpenGL-1.1 に制限されるため、FBO または PBuffers はサポートされません)。

GPU アクセラレーションが必要な場合は、グリッド コンピューティング GPU ハードウェアに投資して (実際にはすべての GPU で実行できますが、コンシューマ グレードのものではドライバーが許可していません)、OpenGL アクセラレーション コンテキストを動作させることができます。または、Linux に移行し、KMS/DRI/DRM でサポートされている GPU を使用して、グラフィック システムを完全に回避することもできます。それを行う方法に関する公式のガイドはありませんが、そのようなチュートリアルを書いている私の (長い) ToDo リストにあります。

GPU アクセラレーションなしで生活できる場合は、プログラムの横にソフトパイプ レンダラーを備えた Mesa の Windows ビルドをドロップします.exe。Windows Mesa ソフトパイプ ビルドはopengl32.dll、標準と完全に互換性のある API および ABIとして提供されますopengl32.dllが、どのグラフィックス ドライバーにも依存しません。FBO と PBuffer を含む OpenGL-3.3 サポートを提供します。

于 2015-08-21T13:17:38.750 に答える