トップページ > 記事閲覧
デスクトップの指定した範囲を高速描画
名前:S.I 日時: 2016/03/07 19:45

デスクトップの指定した範囲を、DXライブラリのウィンドウ上に高速(60fps)描画したいのですが、このような関数の作成は可能でしょうか? 動画配信ソフトにあるようなリアルタイムプレビューを実装し、そのプレビュー上で何らかの演出(パーティクルなど)を行おうと考えております。 使用言語はC#です。
メンテ

Page: 1 |

Re: デスクトップの指定した範囲を高速描画 ( No.1 )
名前:管理人 日時:2016/03/08 03:50

少し調べたところDesktop Duplication APIというのを使用すると 60fpsでのキャプチャも可能なようですが、このAPIはWindows8以降 でしか使用できないようです。 それ以前になると最大でも「モニタのリフレッシュレート÷2」が最大fpsと なってしまうようです。 お使いの環境は Windows8以降でしょうか?
メンテ
Re: デスクトップの指定した範囲を高速描画 ( No.2 )
名前:S.I 日時:2016/03/08 04:20

開発環境はWindows8.1ですが、実行環境はWindows7となっております。 何故、Windows7以前は「モニタのリフレッシュレート÷2」が最大となるのでしょうか? 参考URI等があればよろしくお願いします。
メンテ
Re: デスクトップの指定した範囲を高速描画 ( No.3 )
名前:管理人 日時:2016/03/09 02:14

> 何故、Windows7以前は「モニタのリフレッシュレート÷2」が最大となるのでしょうか? > 参考URI等があればよろしくお願いします。 こちらの記事を参考にさせていただきました <あまラボ  Aero有効時におけるデスクトップキャプチャについて> http://amalabo.blog35.fc2.com/blog-entry-242.html ただ、考えてみたらこちら Aero有効時の話題なので、Aero を OFF にすれば Windows7 でも 60fps キャプチャが可能かもしれません、週末に検証してみますので少々お待ち下さい m(_ _;m
メンテ
Re: デスクトップの指定した範囲を高速描画 ( No.4 )
名前:S.I 日時:2016/03/09 14:50

> こちらの記事を参考にさせていただきました > > <あまラボ  Aero有効時におけるデスクトップキャプチャについて> > ttp://amalabo.blog35.fc2.com/blog-entry-242.html ありがとうございます。 頂いた記事を読ませていただきました。 記事によると、 Vista〜7のAeroにおいて、デスクトップ画面情報を取得する際に表示データとキャプチャ用データの2つが作成され、 内部でのレンダリング処理が出力に追いつかないことで2フレームの遅延が生じている。 そのため、アマレコを2台起動するとキャプチャ用データを2個作ることになり、速度が著しく低下する ということですか。 当方でもBitBlt用いて画面情報をBitmap型にして取得し、CreateGraphFromMem関数を用いて DXライブラリ用の画像ハンドルに変換することを行いました。 しかし、期待通りに高速キャプチャがされなかったため、Bitmap型への変換はそんなに遅いものなのか と悩んでおりましたが、その原因の一つが理解できました。 ありがとうございます。 > ただ、考えてみたらこちら Aero有効時の話題なので、Aero を OFF にすれば Windows7 でも Aero有効時の話だけかと思われます。 先ほどのサイトでは、Aero有効時はアマレコを2台起動すると著しくFPSが低下するとありますが、 Windows7(Windowsベーシック)において、動画配信ソフト(OBS Classic)とアマレコを起動し、OBSで60fpsプレビューしながら アマレコでも60fps録画する操作を行いましたが、どちらも速度低下なく快適でした。 異なるソフトな上に画像処理の話は詳しくないので、一概に述べることができませんが Aero無効時であれば何らかの方法があるのではないでしょうか? > 60fps キャプチャが可能かもしれません、週末に検証してみますので少々お待ち下さい m(_ _;m お待ちしております。
メンテ
Re: デスクトップの指定した範囲を高速描画 ( No.5 )
名前:管理人 日時:2016/03/13 04:06

Aero を無効にした状態で Desktop Duplication API を使用できない Windows7 での キャプチャ速度を検証してみたところ、普通に 60fpsでキャプチャができました 早速デスクトップ画面の一部をグラフィックハンドルに転送する関数を追加してみましたので、 よろしければこちらをダウンロードして下さい m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 以下の関数を追加しました // デスクトップ画面から指定領域の画像情報をグラフィックハンドルに転送する int GetDesktopScreenGraph( int x1, int y1, int x2, int y2, int GrHandle ) ; GetDrawScreenGraph のデスクトップ画面版のようなものです こちらを使って Aero を無効にした上で FullHD( 1920x1080 )の画面をキャプチャして、 1280x720 に縮小してDXライブラリが生成したウインドウに描画するというプログラムを 組んでみましたので、よろしければご覧ください #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int CaptureGrHandle ; // Aero を無効にする SetAeroDisableFlag( TRUE ) ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // ウインドウのサイズは 1280x720 SetGraphMode( 1280, 720, 32 ) ; if( DxLib_Init() == -1 ) { return -1 ; } SetDrawScreen( DX_SCREEN_BACK ) ; // 縮小描画用にバイリニアフィルタリングモードにしておく SetDrawMode( DX_DRAWMODE_BILINEAR ) ; // キャプチャ用の 1920x1080 のアルファチャンネル無しのグラフィックハンドルを作成 CaptureGrHandle = MakeScreen( 1920, 1080, FALSE ) ; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; // デスクトップの画像を取得 GetDesktopScreenGraph( 0, 0, 1920, 1080, CaptureGrHandle ) ; // 1280x720 のウインドウに縮小して描画 DrawExtendGraph( 0, 0, 1280, 720, CaptureGrHandle, FALSE ) ; ScreenFlip() ; } DxLib_End() ; return 0 ; }
メンテ
Re: デスクトップの指定した範囲を高速描画 ( No.6 )
名前:S.I(解決) 日時:2016/03/14 00:42

丁寧なサンプルプログラムおよび説明ありがとうございます。 使用させていただきましたところ、問題なくキャプチャすることができました。 ありがとうございました!
メンテ
Re: デスクトップの指定した範囲を高速描画 ( No.7 )
名前:yumetodo_(解決) 日時:2016/03/14 02:28

うわーーーー、まさかその機能がDxLibに入るとは。 ・・・あれ、私の糞プログラムいらなくね?(悲鳴) github.com/yumetodo/Scatto_continuo_v3 Win7のAeroでキャプチャ遅い理由は個人的に調べてて、参考サイトとおなじ結論に至ってたけど、そのサイトを、当時調べてた時に見つけられなかったのが悔しい。 ロシア語やらフランス語のサイトまで見に行った私の苦労は一体・・・。
メンテ
Re: デスクトップの指定した範囲を高速描画 ( No.8 )
名前:S.I(解決) 日時:2016/03/14 04:47

> ロシア語やらフランス語のサイトまで見に行った私の苦労は一体・・・。 私も数日くらい海外サイトもまわって調べてたのですけど、極端に低下する理由が見つからなかったのですよね。 やっぱり慣れない言語でのサイト巡りは控えた方が良いということでしょうかf(^^;
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存