Re: ループ時の処理負荷軽減方法 ( No.20 ) |
- 名前:管理人 日時:2015/02/16 00:06
もうお話が終了していますが一応
私の場合は ScreenFlip や WaitVSync を使ってモニタのリフレッシュレートをチェックして、
ゲームのフレームレートとリフレッシュレートが一致している場合はタイマーによる待ちは行わずに
ScreenFlip の待ちに任せ、ゲームのフレームレートとリフレッシュレートが異なる場合は
VSync待ちをOFFにしてタイマーによる待ちを行うようにしています
|
Re: ループ時の処理負荷軽減方法 ( No.21 ) |
- 名前:チップ 日時:2015/02/16 19:43
すみません。せっかくなので管理人様の方法で試してみたのですが、
下記のルーチンでリフレッシュレートを計算して結果により SetWaitVSyncFlag( FALSE ) をコールするようにしたのですが、
これを DxLib_Init() の後に入れると正常に動作するのですが
DxLib_Init() の前に入れると立ち上げで失敗してしまします(ウィンドウも開きません)。
WaitVSync()(もしくはScreenFlip() )を DxLib_Init() の前に呼ぶことで不具合が起きるようです。
しかしながら SetWaitVSyncFlag( FALSE ) はDxLib_Init() の前によばなければ効力が出ないので
いかんともしがたい状況です。
ScreenFlipCount = 0 ;
tmp_time = GetNowCount() ; // 計測開始時刻を保存
while(1) // 1秒間に実行できる ScreenFlip の回数を計測
{
WaitVSync(1); // もしくは ScreenFlip()
if( GetNowCount() - tmp_time >= 1000 ) break ; // 計測開始から1秒経過していたらループから抜ける
ScreenFlipCount ++ ; // ScreenFlip を実行した回数をインクリメント
}
if(ScreenFlipCount!=60){
SetWaitVSyncFlag( FALSE ) ; // ScreenFlip関数 実行時にCRTの垂直同期信号待ちをしない
}
何か対処方法はありますでしょうか?
|
Re: ループ時の処理負荷軽減方法 ( No.22 ) |
- 名前:Nameless 日時:2015/02/17 18:06
GetNowCountはDxLib_Init前に呼ぶと-1を返すので、
> if( GetNowCount() - tmp_time >= 1000 ) break ;
が成立することはなく、無限ループになってしまいます。
おそらくこれが原因です。
また、リフレッシュレートを取得するだけならGetRefreshRateという関数があります。
こちらなら誤差も出ることもないのでこちらを使ってはどうでしょう。
こちらもDxLib_Init前に呼ぶと-1を返すようなのでDxLib_Init後に呼ぶ必要がありますが。
|
Re: ループ時の処理負荷軽減方法 ( No.23 ) |
- 名前:チップ 日時:2015/02/17 18:08
Nameless さん
情報ありがとうございます。大変助かりました。
|
Re: ループ時の処理負荷軽減方法 ( No.24 ) |
- 名前:チップ 日時:2015/02/18 00:36
最終的な結論として DxLib_Init 前にリフレッシュレートをプログラム内で確認する方法ってないんでしょうか・・・。
SetWaitVSyncFlag() が DxLib_Init の前にコールしなければならないのに
DxLib_Init の前にリフレッシュレートの確認方方がないのは厳しいですね。
|
Re: ループ時の処理負荷軽減方法 ( No.25 ) |
- 名前:管理人 日時:2015/02/18 01:58
|
Re: ループ時の処理負荷軽減方法 ( No.26 ) |
- 名前:チップ(解決) 日時:2015/02/18 07:08
お忙しい中ご対応ありがとうございます!
助かりました!
|
Re: ループ時の処理負荷軽減方法 ( No.27 ) |
- 名前:チップ 日時:2015/02/18 08:02
たびたびすみません。
DxCompileConfig.hを触りたかったのでソースからコンパイルして組み込んだところ
以下のエラーが出てしましました。
エラー 1 error LNK2001: 外部シンボル ""unsigned long __cdecl DxLib::GetColor(int,int,int)" (?GetColor@DxLib@@YAKHHH@Z)" は未解決です。
エラー 2 error LNK2001: 外部シンボル ""int __cdecl DxLib::DrawBox(int,int,int,int,int,int)" (?DrawBox@DxLib@@YAHHHHHHH@Z)" は未解決です。
再コンパイルしたDxLib.libの差し替えだけでは問題ありますでしょうか?
|
Re: ループ時の処理負荷軽減方法 ( No.28 ) |
- 名前:管理人 日時:2015/02/19 01:20
はい、問題あります
No.25 のバージョンは DxLib.h なども変更されていますので、DxLib.lib のみ独自にコンパイル
したものに差し替えても正常にビルドできません
既にお使いのDXライブラリのファイル群に No.25 バ−ジョンのファイルを上書きした後、
独自にコンパイルした DxLib.lib と、内容を変更した DxCompileConfig.h を上書きすれば
正常にビルドできますので、よろしければお試しください
|
Re: ループ時の処理負荷軽減方法 ( No.29 ) |
- 名前:チップ(解決) 日時:2015/02/19 06:49
無事コンパイル通りました。
動作も問題なく DxLib_Init 呼び出し前にGetRefreshRate を使用できることをこちらの環境でも確認しました。
ご丁寧な対応本当にありがとうございました!
|
Re: ループ時の処理負荷軽減方法 ( No.30 ) |
- 名前:チップ 日時:2015/02/19 19:44
何度もすみません。
修正して頂いたバージョンのライブラリだと一旦ウィンドウズモードで立ち上げた後に
ChangeWindowMode( FALSE );
でフルスクリーンモードに切り替えようとするとハングして終了してしまうようです。
|
Re: ループ時の処理負荷軽減方法 ( No.31 ) |
- 名前:管理人 日時:2015/02/21 02:04
|
Re: ループ時の処理負荷軽減方法 ( No.32 ) |
- 名前:チップ 日時:2015/02/21 06:26
すみません。
新しいバージョンをソースからコンパイル直して実行したのですがやはりフルスクリーンに切り替えるところでハング>終了するようです。
最初からフルスクリーンで立ち上げれば問題なく、
フルスクリーンで立ち上げた後にウィンドウズモードに切り替えるのも問題ありません。
ウィンドウズモードで立ち上げてからフルスクリーンモードに切り替える際のみ不具合が出るようです。
|
Re: ループ時の処理負荷軽減方法 ( No.33 ) |
- 名前:管理人 日時:2015/02/21 20:49
お試しいただきありがとうございます、駄目でしたか・・・
何処でハングしてしまっているのかを確認したいと思いますので、申し訳ありませんが
よろしければこちらの出力するログを増やしたバージョンで実行して、実行時に作成される
Log.txt の内容を掲示板に貼り付けて頂けないでしょうか? 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)」をして下さい)
あと、こちらに私の環境でハングしないことが確認できている
「ウインドウモードで起動→起動4秒後にフルスクリーンに変更」
という以下のプログラムをコンパイルした実行ファイルをアップしましたので、
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
DrawBox( 0, 0, 256, 256, GetColor( 255,255,0 ), TRUE ) ;
WaitTimer( 4000 ) ;
ChangeWindowMode( FALSE ) ;
DrawBox( 0, 0, 256, 256, GetColor( 0,255,0 ), TRUE ) ;
WaitTimer( 4000 ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
こちらもチップさんの環境ではハングしてしまうか、よろしければお試しください m(_ _;m
https://dxlib.xsrv.jp/temp/ChangeWindowModeTest.zip
|
Re: ループ時の処理負荷軽減方法 ( No.34 ) |
- 名前:チップ 日時:2015/02/22 07:41
お手数おかけします。
管理人さんにご提示頂いたソースをこちらび環境で
コンパイルしたところ問題なく動作しました。
私のプログラムとの差異を調べて以下のソースにしたところ
フルスクリーンに切り替え時にやはりハングしました。
こちらで出力したログファイルも添付致します。
よろしくお願い致します。
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// ウインドウモードで起動
SetMainWindowText( "test" ) ; // ウィンドウバーのタイトル
SetWindowStyleMode(7); // ウィンドウズ最大化ボタンON
SetWindowIconID( IDI_ICON2 ); // ウィンドウバーのアイコン
SetFullScreenResolutionMode(DX_FSRESOLUTIONMODE_DESKTOP); // フルスクリーンモードを画面に合わせて拡大モードにする
ChangeWindowMode( TRUE ) ; // ウィンドウモードで起動
SetGraphMode( 640 , 480 , 32 ) ; // 画面モードの変更(32ビットモードで起動)
SetWindowSizeChangeEnableFlag( TRUE ) ; // 画面サイズを任意に変更可能
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
DrawBox( 0, 0, 256, 256, GetColor( 255,255,0 ), TRUE ) ;
WaitTimer( 4000 ) ;
ChangeWindowMode( FALSE ) ;
DrawBox( 0, 0, 256, 256, GetColor( 0,255,0 ), TRUE ) ;
WaitTimer( 4000 ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
1:システムの情報を出力します
1: DXライブラリ Ver3.13e
2: 論理プロセッサの数 : 8
2: OS Windows7 ( Build 7601 Service Pack 1 )
103: 現時点のCPU動作速度:大体2.18GHz
104: MMX命令を使用します
104: SSE命令が使用可能です
105: SSE2命令が使用可能です
105: CPUベンダ:GenuineIntel
106: CPU名: Intel(R) Core(TM) i7-2670QM CPU @ 2.20GHz
107:COMの初期化... 成功しました
110:メモリ総量:8098.07MB 空きメモリ領域:5726.90MB
110:タイマーの精度を検査します
111:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60
111: パフォーマンスカウンターを使用します タイマー精度 : 2143.583000 KHz
111: ソフトの二重起動検査... 二重起動はされていませんでした
113:ウインドウクラスを登録します... 登録に成功しました
113:ウインドウモード起動用のウインドウを作成します
143:ウインドウの作成に成功しました
144:ウインドウを表示します
182:IMEを無効にしました
183:ウインドウスタイルをウインドウモード用に変更します... 完了
205:DirectInput関係初期化処理
206: XInput DLL の読み込み中... 成功
211: DirectInput7 の取得中... 成功
222: 引き続き初期化処理... 初期化成功
225: ジョイパッドの初期化...
228: ジョイパッドの初期化は正常に終了しました
228: マウスデバイスの初期化... 初期化成功
229: キーボードデバイスの初期化... 初期化成功
230:DirectInput 関連の初期化は正常に終了しました
231:DirectSound の初期化を行います
232:DirectSound インターフェースの取得を行います.... 成功
235:引き続きインターフェースの初期化処理... 成功
308: DirectSound デバイスを列挙します
309: モジュール名: ドライバ記述:プライマリ サウンド ドライバー
309: モジュール名:{0.0.0.00000000}.{279bee1e-f6b0-4e57-9f90-5347334a32ac} ドライバ記述:スピーカー (VIA High Definition Audio)
310: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz
310: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB
311: 利用可能サンプリング精度
311: プライマリ 16bit = OK 8bit = OK
312: セカンダリ 16bit = OK 8bit = OK
312: 利用可能チャンネル
312: プライマリ MONO = OK STEREO = OK
313: セカンダリ MONO = OK STEREO = OK
314:DirectSound の初期化は正常に終了しました
314:d3d11.dll の読み込み.... 成功
318:dxgi.dll の読み込み.... 成功
319:API CreateDXGIFactory のアドレスを取得します.... 成功
319:IDXGIFactory を作成します.... 成功
324:API D3D11CreateDevice のアドレスを取得します.... 成功
325:IDXGIAdapter を取得します.... 成功
325:Direct3D 11 FeatureLevel 11_0 以上を対象とします
326:ID3D11Device オブジェクトを取得します.... 失敗
348:DirectDraw オブジェクトの取得を行います.... 成功
352:引き続き初期化処理... 初期化に成功しました
404:IDirect3D9Ex オブジェクトを取得します.... 成功
407:IDirect3DDevice9Ex オブジェクトを取得します.... ハードウエア頂点演算を使用します
667:成功
668:Driver:igdumdx32.dll Description:Intel(R) HD Graphics Family
669:画面のフォーマットは D3DFMT_X8R8G8B8 です
669:16bit Zバッファフォーマットは D3DFMT_D16 です
670:24bit Zバッファフォーマットは D3DFMT_D24X8 です
670:32bit Zバッファフォーマットは D3DFMT_D24X8 です
670:16bit カラーフォーマットは D3DFMT_R5G6B5 です
671:32bit カラーフォーマットは D3DFMT_X8R8G8B8 です
671:アルファ付き 16bit カラーフォーマットは D3DFMT_A4R4G4B4 です
672:アルファ付き 32bit カラーフォーマットは D3DFMT_A8R8G8B8 です
672:アルファテスト用 16bit カラーフォーマットは D3DFMT_A1R5G5B5 です
672:アルファテスト用 32bit カラーフォーマットは D3DFMT_A8R8G8B8 です
673:DXT1テクスチャフォーマットはD3DFMT_DXT1 です
673:DXT2テクスチャフォーマットはD3DFMT_DXT2 です
673:DXT3テクスチャフォーマットはD3DFMT_DXT3 です
674:DXT4テクスチャフォーマットはD3DFMT_DXT4 です
674:DXT5テクスチャフォーマットはD3DFMT_DXT5 です
675:描画用 16bit カラーフォーマットは D3DFMT_R5G6B5 です
675:描画用 32bit カラーフォーマットは D3DFMT_X8R8G8B8 です
675:描画用アルファ付き 32bit カラーフォーマットは D3DFMT_A8R8G8B8 です
676:描画用ABGR整数16ビット型カラーフォーマットは D3DFMT_A16B16G16R16 です
676:描画用ABGR浮動小数点16ビット型カラーフォーマットは D3DFMT_A16B16G16R16F です
676:描画用ABGR浮動小数点32ビット型カラーフォーマットは D3DFMT_A32B32G32R32F です
677:描画用1チャンネル整数8ビット型カラーフォーマットは D3DFMT_A8R8G8B8 です
677:描画用1チャンネル整数16ビット型カラーフォーマットは D3DFMT_G16R16 です
677:描画用1チャンネル浮動小数点16ビット型カラーフォーマットは D3DFMT_R16F です
678:描画用1チャンネル浮動小数点32ビット型カラーフォーマットは D3DFMT_R32F です
678:描画用2チャンネル整数8ビット型カラーフォーマットは D3DFMT_A8B8G8R8 です
679:描画用2チャンネル整数16ビット型カラーフォーマットは D3DFMT_G16R16 です
679:描画用2チャンネル浮動小数点16ビット型カラーフォーマットは D3DFMT_G16R16F です
679:描画用2チャンネル浮動小数点32ビット型カラーフォーマットは D3DFMT_G32R32F です
680:一度に描画できるプリミティブの最大数:1048575
680:対応している最大頂点インデックス:16777215
680:同時にレンダリングできるバッファの数:4
681:最大テクスチャサイズ 幅:8192 高さ:8192
681:テクスチャステージテンポラリレジスタ:使用可
681:減算合成のハードウェア対応:ネイティブ
682:ハードウェア頂点シェーダーバージョンコード:300
682:エミュレーション頂点シェーダーバージョンコード:エミュレーション無し
683:ピクセルシェーダーバージョンコード:300
711:バックバッファロック転送の時間:3781nsec 一時的な描画可能バッファを使用した転送の時間:954nsec
712:バックバッファロックを使用しません
712:Zバッファを作成します.... 成功
773:プログラマブルシェーダーを使用します
855:フォントの初期化を行います
856:フォントの初期化は正常に終了しました
857:文字コードバッファの初期化を行います... 完了しました
4870:ChangeWindowMode実行
4872:ウインドウモードフラグが倒されました
4874:ウインドウスタイルをフルスクリーンモード用に変更します... 完了
4882:画面モード変更処理を開始します
4884: フォントの初期化を行います
4887: フォントの初期化は正常に終了しました
4966: Direct3DDevice9 の解放 2
4996: d3d9.dll の解放 1
4999: d3d11.dll の読み込み.... 成功
5000: dxgi.dll の読み込み.... 成功
5002: API CreateDXGIFactory のアドレスを取得します.... 成功
5002: IDXGIFactory を作成します.... 成功
5005: API D3D11CreateDevice のアドレスを取得します.... 成功
5006: IDXGIAdapter を取得します.... 成功
5007: Direct3D 11 FeatureLevel 11_0 以上を対象とします
5007: ID3D11Device オブジェクトを取得します.... 失敗
5029: DirectDraw オブジェクトの取得を行います.... 成功
5030: 引き続き初期化処理... 初期化に成功しました
5060: IDirect3D9Ex オブジェクトを取得します.... 成功
|
Re: ループ時の処理負荷軽減方法 ( No.35 ) |
- 名前:管理人 日時:2015/02/22 22:06
|
Re: ループ時の処理負荷軽減方法 ( No.36 ) |
- 名前:チップ(解決済) 日時:2015/02/23 07:57
こちらの環境でも問題なく動作することを確認いたしました。
細やかなご対応ありがとうございます!
|
Re: ループ時の処理負荷軽減方法 ( No.37 ) |
- 名前:チップ 日時:2015/02/23 18:57
スレの本筋とは少し離れますが
管理人様に用意して頂いた修正版で問題なく動作は確認致しましたが、
ソースの方から再構築しようと
ttp://dxlib.o.oo7.jp/temp/DxLibMakeTest.exe
上記から変更ソースをダウンロードしてコンパイルしたところ
そのままだと通るのですが DxUseCLib.lib のスタティックライブラリを再構築すると(外せるものは全部外してDxUseCLib.libを再コンパイル)、
実行ファイルのリンク時に
int CreateFontToHandle_PF( FONTMANAGE * ManageData, int DefaultCharSet ) ;
int CreateFontToHandle_Error_PF( FONTMANAGE * ManageData ) ;
int TerminateFontHandle_PF( FONTMANAGE *ManageData ) ;
int FontCacheCharAddToHandle_Timing0_PF( FONTMANAGE *ManageData ) ;
int FontCacheCharAddToHandle_Timing1_PF( FONTMANAGE *ManageData, FONTCHARDATA *CharData, const TCHAR *AddStr, int TextureCacheUpdate ) ;
int FontCacheCharAddToHandle_Timing2_PF( FONTMANAGE *ManageData ) ;
int EnumFontName_PF( ENUMFONTDATA *EnumFontData, int IsEx = FALSE, int CharSet = -1 ) ;
上の7つの関数が外部シンボル未定義エラーになるようです。
DxCompileConfig.h内の設定は
//#define DX_NON_FONT
はコメントアウトしたままです。
おそらくfont.cpp内を修正中で次回バージョンアップ時に対応されるおつもりだったのではないかなと思ったのですが
念のためご報告致します。
|
Re: ループ時の処理負荷軽減方法 ( No.38 ) |
- 名前:管理人 日時:2015/02/24 03:42
すみません、最近 DxFontWin.cpp と DxFontWin.h というソースを追加しましたので、
DxLib.lib をビルドするプロジェクトに DxLibMakeTest.exe の中にある
DxFontWin.cpp と DxFontWin.h を追加してビルドしてください
|
Re: ループ時の処理負荷軽減方法 ( No.39 ) |
- 名前:チップ(解決) 日時:2015/02/24 05:05
ありがとうございます!
何度も細かい注文して申し訳ありません。
迅速なご対応に感謝しております。
|