Re: フルスクリーンでのScreenCopy ( No.1 ) |
- 名前:管理人 日時:2007/06/02 18:09
lunarさんどうも、DXライブラリの管理人です。
ScreenCopy が動作しない、というのは、つまり裏画面の内容が表画面に
反映されないということでしょうか?
ちなみに ScreenCopy は ScreenFlip と同じようにVSYNC待ちを
行いますので、VSYNC待ちをしないようにするには
SetWaitVSyncFlag( FALSE ); を実行してから ScreenCopy をするように
してください。
|
Re: フルスクリーンでのScreenCopy ( No.2 ) |
- 名前:lunar 日時:2007/06/02 23:36
>ScreenCopy が動作しない、というのは、つまり裏画面の内容が表画面に
>反映されないということでしょうか?
はい。
プログラム内部で、ScreenFlipとScreenCopyを切り替えられるようにしたところ、
ScreenCopyを使用している間は表画面が更新されないように見えます。
もしかしたら、こちらのプログラムにミスがあるのかもしれません。
SetDrawScreen(DX_SCREEN_BACK);
ClearDrawScreen();
としたのち、
ループ内で
if(f_UseFlip){
ScreenFlip();
}else{
ScreenCopy();
}
ClearDrawScreen();
if(ProcessMessage() != 0){
break;
}
(以下他の処理)
としているのですが……。
>VSYNC待ち
描画部分で、状況によっては、1frameごとに20ms以上ずつかかってしまうような処理をしているのですが、
(状況によっては、数msずつしかかからないので、そのような場合にはVSYNC待ちしたいのです。)
フルスクリーンだと、40数fpsになるのに対し、
ウィンドウだと、VSYNCを一つ置きに待つという感じになり、30fpsになってしまいます。
起動時に設定ファイルを読み込みVSYNC待ちをするかどうか設定できるようにして対策をしているのですが、
できればウィンドウのときもフルスクリーンのときと同様に画面を更新したいと思っています。
|
Re: フルスクリーンでのScreenCopy ( No.3 ) |
- 名前:管理人 日時:2007/06/07 13:18
lunarさんどうも、DXライブラリの管理人です。
うーん、掲載して頂いた部分のみを見る限りでは問題は無さそうです。
ウインドウモードでは ScreenFlip を実行しても内部では ScreenCopy が
使用されているので、謎です・・・
以下のプログラムは白い矩形が画面上部を左右に移動するだけのプログラム
なのですが、このようなシンプルなプログラムでも ScreenCopy では表画面に
反映されないか、宜しければ試してみて頂けないでしょうか?
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int x, add;
ChangeWindowMode( TRUE );
if( DxLib_Init() < 0 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );
x = 0; add = 8;
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
x += add;
if( x < 0 || x > 640 ) add = -add;
ClearDrawScreen();
DrawBox( x, 0, x + 100, 100, GetColor( 255,255,255 ), TRUE );
ScreenCopy();
}
DxLib_End();
return 0;
}
あと、以下のプログラムは ScreenFlip の実行に掛かった時間を画面左上に表示する
プログラムです。正常であれば大体14〜17付近の数字が表示されると思いますので、
ウインドウモードで起動した場合にVSYNC待ちが正常に行われていないのかどうか
宜しければお試しになってみて下さい。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int time;
ChangeWindowMode( TRUE );
if( DxLib_Init() < 0 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
time = GetNowCount();
ScreenFlip();
time = GetNowCount() - time;
DrawBox( 0, 0, 64, 32, GetColor(0,0,0), TRUE );
DrawFormatString( 0, 0, GetColor(255,255,255), "%d", time );
}
DxLib_End();
return 0;
}
あと、もしお使いのDXライブラリが最新版ではありませんでしたら、
こちらの最新版に更新して試してみて下さい。m(_ _)m
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
|
Re: フルスクリーンでのScreenCopy ( No.4 ) |
- 名前:lunar 日時:2007/06/08 18:02
お教えいただいたプログラムを動かしてみたところ、
2つとも正常に動作しました。
ライブラリは最新版です。(Ver 2.23)
ただ、2つ目については、
パソコンで他に何も重い処理をしていないはずなのに(タスクマネージャで確認)、
よく30付近が出るので、パソコンのほうに何か問題があるのかもしれません。
(直前20回分を表示するように改良した下記プログラムで検証しました)
ここからが本題なのですが、
1つ目のプログラムについて、
ChangeWindowMode( FALSE );
と変更し、フルスクリーンで実行すると画面が(黒いまま)更新されないようです。
全く更新されないかと思っていると、
キーを押して終了しようとした瞬間に、
一瞬だけ正方形が現れることに気付きました。
これを何回か試したところ、正方形の位置が場合(起動してからの時間)によって変わっているので、
DrawBoxなどは正しく実行されているようですし、
最後に表示されるのは、DxLib_End中に思えます。
----
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int time[20], cnt=0;
ChangeWindowMode( TRUE );
if( DxLib_Init() < 0 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );
while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
{
time[cnt] = GetNowCount();
ScreenFlip();
ClearDrawScreen();
time[cnt] = GetNowCount() - time[cnt];
cnt=(cnt+1)%20;
DrawBox( 0, 0, 64, 32, GetColor(0,0,0), TRUE );
for(int i=0; i<20; i++){
DrawFormatString( 0, 20*i, GetColor(255,255,255), "%4d", time[i] );
}
}
DxLib_End();
return 0;
}
|
Re: フルスクリーンでのScreenCopy ( No.5 ) |
- 名前:管理人 日時:2007/06/09 11:43
lunarさんどうも、DXライブラリの管理人です。
私の環境で掲載して頂いたプログラムを実行してみたところ、
ごく偶に20以上が表示されることがありました。
あと、ChengeWindowMode( FALSE ); ですが、これは DxLib_Init の
前に書かれている ChangeWindowMode( TRUE ); を ChangeWimdowMode( FALSE );
に書き換えたということでしょうか?
もしそうだとしますと、ハードウエア側の問題かもしれません。
宜しければlunarさんがお使いのPCのスペックを教えて頂けないでしょうか?
|
Re: フルスクリーンでのScreenCopy ( No.6 ) |
- 名前:lunar 日時:2007/06/09 23:43
>あと、ChengeWindowMode( FALSE ); ですが、これは DxLib_Init の
>前に書かれている ChangeWindowMode( TRUE ); を >ChangeWimdowMode( FALSE );
に書き換えたということでしょうか?
はい。それ以外の部分はそのままです。
>ハードウエア側の問題かもしれません。
ということで、
Windows XPが入っている別のパソコンで同じ実行ファイルを動かしてみたところ(ウィンドウでもフルスクリーンでも)正常に動作しました。
ということで、少なくともコンパイラに依存するような問題でもないようです。
(正常に動作しない)このパソコンの
スペックは
Windows Vista™ Home Premium
インテル® Celeron® M プロセッサー 430(1.73GHz)
1GB(512MB×2)
モバイル インテル® 945GM Express チップセット
です。
どれぐらい詳しく書けばよいのか分からないのですが、
必要であれば、
ttp://www.fmworld.net/product/hard/pcpm0701/biblo_loox/nb/method/index.html
のFMV-BIBLO NB55U/Dの欄を参照お願いします。
|
Re: フルスクリーンでのScreenCopy ( No.7 ) |
- 名前:管理人 日時:2007/06/13 10:31
lunarさんどうも、DXライブラリの管理人です。
うーん、スペックは問題無さそうですね・・・・
ただ、OSが Vista なのでもしかしたらグラフィクスデバイスの
ドライバに何か原因があるのかもしれません・・・
ドライバが原因かどうかを調べる方法としてソフトウエアレンダリング
モードで実行してみるという方法があります。ドライバやハードウエア
の影響を極力抑えた状態で実行しても同様の不具合が発生するかどうか
を調べることでドライバやハードウエアが原因なのか、ソフトウエア側の
問題なのかを判断するというわけです。
DxLib_Init を呼ぶ前に DirectX の描画機能を使うかどうかを設定する
SetUseDirectDrawFlag という関数に FALSE を渡して呼ぶと
SetUseDirectDrawFlag( FALSE );
描画関係の処理に DirectX の機能を使わないようにした状態で
実行することが出来ますので、もし宜しければその状態でも同様の
現象が発生するかどうかを試してみて頂けないでしょうか?
|
Re: フルスクリーンでのScreenCopy ( No.8 ) |
- 名前:管理人 日時:2007/06/17 06:54
lunarさんどうも、DXライブラリの管理人です。
手元の Windows Vista 上で ScreenCopy を使用したプログラムを実行して
みたところ、ご報告して頂いた現象(ScreenCopy をしても表画面に
反映されない)が発生しました。OS自体が原因だとは思わず、確認が
遅くなり申し訳ありません。
Vista の仕様なのか、ドライバが原因なのかは分かりませんが、この現象は
なんとなく Vista の仕様のような気がするので、とりあえずOSが
Vista だった場合は ScreenCopy の内部処理を変更することに
しました。
恐らく正常に機能するようになったと思われるバージョンをアップしましたので、
宜しければお試しになってみて下さい。m(_ _)m
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe
|
Re: フルスクリーンでのScreenCopy ( No.9 ) |
- 名前:lunar 日時:2007/06/17 17:47
ありがとうございます。
正常に動くようになりました。
|