トップページ > 記事閲覧
透明ウィンドウを使った処理について
名前:かめ 日時: 2014/02/17 10:16

現在、透明ウィンドウを使ってPMDなどの作画を行っているのですが、ウィンドウサイズをデスクトップと同じサイズにするとFPSが大きく落ちてしまいます。 FPSをあまり落とさずに作画することはできるでしょうか? よろしくお願いします。 PMDの作画は http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=3211 FPSの制御は http://dixq.net/g/03_14.html のソースを使わせていただいています。
メンテ

Page: 1 |

Re: 透明ウィンドウを使った処理について ( No.1 )
名前:管理人 日時:2014/02/17 23:49

常にデスクトップ画面全体に対して何かしらの描画処理を行っているのでしたら 残念ながら負荷を下げる方法はありません もしデスクトップ全体に描画処理を行っていないのでしたら ( 例えば描画する PMDモデルが1体だけで、常にデスクトップ画面全体に対して描画しているわけではない等 ) ウインドウの位置とサイズを描画処理を行っている領域に限定して 「ウインドウサイズをデスクトップより小さいサイズにする」ことで 負荷を下げることができると思います ただ、現在それをするのに適した機能がライブラリに無いので、もしこの方法を使用するとなると機能を 追加する必要があります もしかめさんが上記の方法( ウインドウサイズと位置を動的に変化させる )を使用されるということでしたら 機能を追加しますが、他にもやりたいことがあるので、かめさんが使用されないということでしたら機能の追加はしません どうしますか?
メンテ
Re: 透明ウィンドウを使った処理について ( No.2 )
名前:かめ 日時:2014/02/18 21:55

時間がある時で結構ですので、出来ればお願いしたいのですが、よろしいでしょうか?
メンテ
Re: 透明ウィンドウを使った処理について ( No.3 )
名前:管理人 日時:2014/02/22 22:48

機能を追加したバージョンをアップしましたので、よろしければダウンロードしてください 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 で 取り込むといった処理を組んでみてください
メンテ
Re: 透明ウィンドウを使った処理について ( No.4 )
名前:かめ 日時:2014/02/24 15:27

お忙しい中、ありがとうございます。 ビルド及び実行の確認が出来ました。 私の開発環境上でFPSが31fpsから58fpsまで上がることが出来ました。 ありがとうございます。
メンテ

Page: 1 |

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

   クッキー保存