機能を追加したバージョンをアップしましたので、よろしければダウンロードしてください m(_ _)m
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用
http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
処理時間を計測してみたところ GetDrawScreenSoftImage が一番負荷が高かったので、
GetScreenSoftImage を指定の領域だけ行える関数を追加しました
// 描画対象の画面から指定領域をソフトウエアイメージハンドルに転送する( 転送先座標指定版 )
int GetDrawScreenSoftImageDestPos( int x1, int y1, int x2, int y2, int SIHandle, int DestX, int DestY ) ;
ソフトイメージへの取り込み先を DestX, DestY で指定できます
例えばデスクトップの解像度が 1920 x 1080 の場合に画面の右半分のみ更新された場合は
GetDrawScreenSoftImageDestPos( 960, 0, 1920, 1080, SoftImageHandle, 960, 0 ) ;
とすれば、取り込む面積が半分になるので負荷も約半分になります
因みに一部分のみ取り込むということは、それ以外の部分はそのまま以前の状態が残ってしまうので、
一つ前のフレームで取り込んだ領域が次の取り込む領域から外れている場合はその部分を
ClearRectSoftImage でクリアするようにしてください
あと、SetUseBackBufferTransColorFlag( TRUE ) ; で透過ウインドウを有効にした場合は
UpdateLayerdWindowForPremultipliedAlphaSoftImage を使用して透過ウインドウの処理を
行う場合には必要のない処理が行われてしまい僅かに負荷が高くなっていましたので、
SetUseUpdateLayerdWindowFlag という UpdateLayerdWindowForPremultipliedAlphaSoftImage を
使用して透過ウインドウの処理を行う場合専用の関数を追加しました
// UpdateLayerdWindowForBaseImage や UpdateLayerdWindowForSoftImage を使用するかどうかを設定する( TRUE:使用する FALSE:使用しない )
int SetUseUpdateLayerdWindowFlag( int Flag ) ;
SetUseBackBufferTransColorFlag( TRUE ) ; が行われている箇所を
SetUseUpdateLayerdWindowFlag( TRUE ) ; に置き換えてください
No.1 の書き込みで「ウインドウサイズと位置を動的に変化させる」方法について書きましたが、
GetDrawScreenSoftImage が UpdateLayerdWindowForPremultipliedAlphaSoftImage の4倍くらい
負荷が高かったので、とりあえず今回はウインドウサイズはデスクトップと同じサイズのままで、
GetDrawScreenSoftImage で取り込む範囲を狭めることで負荷を下げる方法のみを追加しました
因みに「GetDrawScreenSoftImage で取り込む範囲を指定できる」機能を追加しただけで、
実際に取り込む範囲を自動で絞り込むような機能は追加していませんので、
申し訳ありませんが ConvWorldPosToScreenPos などの関数を使用してPMDの居る位置が
2D座標上の何処かなどを調べて、その周辺を GetDrawScreenSoftImageDestPos で
取り込むといった処理を組んでみてください