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(^^;
|