トップページ > 記事閲覧
Direct3D11を使わずウィンドウ拡大で画面更新停止
名前:SmokingWOLF 日時: 2017/02/22 19:31

いつもDXライブラリに大変お世話になっております。 環境依存の問題であるような気もしていますが、以下の現象を確認いたしましたのでご報告します。 ・SetUseDirect3D11(FALSE)で「Direct3D 11を使わない」設定で「ウィンドウモード」で実行し、  SetWindowSizeChangeEnableFlag(TRUE)などでウィンドウサイズを変えられるようにすると、  ウィンドウサイズが100%以外になったときに一部の環境で画面更新が停止する。 現象を確認できたDXライブラリのバージョンはVer3.17b、最終更新日時 2/20 0:35です。 検証に使用したソースコードは以下の通りです。 ------- #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode(TRUE) ; // ウィンドウモード SetWindowSizeChangeEnableFlag(TRUE);// サイズ自由変更あり SetAlwaysRunFlag(TRUE); SetUseDirect3D11(FALSE); // Direct3D 11を使わない if( DxLib_Init() == -1 ){ return -1;} // DXライブラリ初期化処理 SetDrawScreen( DX_SCREEN_BACK ); // ESCを押すまでループ、Enterでウィンドウサイズを100%に戻す printfDx( "Enter = Window Size x1.00 ESC = Exit" ) ; int count = 0; while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0){ // アニメーションする四角形を描画 int y_size = count * 4 + 100; count = (count + 1) % 95; DrawBox( 0, 0, 320, y_size, GetColor(255,100,100) ,TRUE); //ピンク DrawBox( 320, 0, 640, y_size, GetColor(100,100,255) ,TRUE); //青色 // Enterでウィンドウサイズを戻す if(CheckHitKey( KEY_INPUT_RETURN ) != 0){ SetWindowSizeExtendRate(1.0); } ScreenFlip(); ClearDrawScreen(); WaitTimer(16); } DxLib_End() ; // DXライブラリ使用の終了 return 0 ; // ソフトの終了 } ------ このソースを動かして現象が確認できた映像を撮影してありますので、よければご覧ください。 www.youtube.com/watch?v=byi2j_VKcQ8 【映像の状況】 ・2つのディスプレイを「拡張」で繋いでいる状態で撮影しています。 ・片方のディスプレイでは「ウィンドウの拡大縮小」を行っても画面更新が行われ続けますが、  もう片方のディスプレイ上では拡大率が100%以外になると画面更新が停止してしまうようです。  (映像では後者の状況でEnterで100%に戻して画面更新を再開させていますが、   マウスで画面サイズをちょうど100%に戻しても画面更新が再開されます) ・ソースのSetUseDirect3D11(FALSE);をコメントアウトする、つまりDirect3D 11を使用する場合は、  どのディスプレイでウィンドウの拡大縮小を行っても期待通りに画面更新が行われ続けるようです。 ------ 参考になるかは分かりませんが、自分の環境と、同様の報告をいただいた他の方の環境の2つのLog.txtをアップしておきます。 ・自分のLog.txt silversecond.com/mytmp/20170222_DxLib_Log1.txt  ※状況:ディスプレイ2つを「拡張」ディスプレイにすると、片方のディスプレイ上で   ウィンドウ拡大した場合に画面更新が停止する。Direct3Dの11使用時は   どちらのディスプレイ上でも拡大縮小して問題なし。上のサンプルで得たものです。 ・他の方からいただいたLog.txt silversecond.com/mytmp/20170222_DxLib_Log2.txt  ※状況:拡張も何もしていない1ディスプレイ上で拡大縮小後、画面更新が停止するそうです。   Direct3Dの11使用時は拡大縮小しても問題ないらしいとのこと。  (これは検証用のソースとは異なる別ソフトで得たLog.txtで、DXライブラリは3.17bの1/27版です) ---- これらが環境依存でどうにも対応できないような問題でしたら、 ウィンドウの拡大縮小機能を使わないようにすることも検討しております。 もし何かお分かりになられましたら、よければ情報をいただけますと幸いです。
メンテ

Page: 1 |

Re: Direct3D11を使わずウィンドウ拡大で画面更新停止 ( No.1 )
名前:管理人 日時:2017/02/23 03:12

全く同じ処理を行っているのに「拡張」側のディスプレイでは画面更新が停止するとなりますと、 ほぼ間違いなくグラフィックスデバイスのドライバが原因だと思います もう10年くらい前に『マルチモニタ環境ではドライバの関係で Direct3D の動作が不安定』と 言われていましたが、未だにマルチモニタ環境は動作が不安定なんですね… 回避策ですが…もし SetWindowSizeChangeEnableFlag( TRUE, FALSE ) ; を実行した状態での ウインドウサイズの変更では画面更新が止まることはありませんでしたら、デスクトップ画面と 同サイズを SetGraphMode で指定して、SetWindowSizeChangeEnableFlag( TRUE, FALSE ) ;を 実行して『ウインドウサイズは変えられるけどウインドウサイズに合わせて拡大・縮小は行わない』の設定にして、 SetWindowSize と SetWindowPosition で本来のゲーム画面のサイズにウインドウサイズと位置を設定、 裏画面の代わりに MakeScreen で作成した仮画面へ裏画面の代わりに描画を行い、裏画面には ウインドウのサイズに合わせて MakeScreen で作成した仮画面を DrawExtendGraph で拡大描画 + ScreenFlip を 行うことで『ウインドウの拡大に伴うウインドウ表示の拡大は起こらないようにする』ようにすることができ、 本件の画面更新停止現象を回避できるかもしれません 裏画面、表画面のサイズがデスクトップ画面全体と同じサイズになるので使用 VRAM が増えてしまいますが…
メンテ
Re: Direct3D11を使わずウィンドウ拡大で画面更新停止 ( No.2 )
名前:SmokingWOLF(解決) 日時:2017/02/23 13:34

非常に具体的なアドバイス、誠にありがとうございます! 画面更新がいま停止しているか否かが分かればいいかなという期待もありましたが、 グラフィックデバイスのドライバが問題でしたらさすがにどうしようもなさそうですね。 SetGraphModeをしてSetWindowSizeChangeEnableFlag(TRUE,FALSE)を使用してみたところ、 問題なく画面更新が行われ続けることを確認しましたので、教えてくださった方法で対応するか、 あるいは警告などを出す形で対処させていただこうと思います。 余談ですが、Direct3D 11を使用すればマルチモニタ環境でも 正常に画面更新が行われ続けるようですので、 新しいDirect3Dではこの問題は起きにくくなっていると感じます。 ただ、Direct3Dを11にするとゲームがすごく重くなったという方がたまにいらっしゃって、 それで9をベースにしようとしたところ、この現象を確認したという次第でした。 この度は親切に対応していただき、誠にありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存