トップページ > 過去ログ > 記事閲覧
Releaseビルド後のexeファイル実行について
名前:Dec 日時: 2011/04/10 00:59

お世話になります。Decという者です。 現在DxLibを使用してゲームの制作を行っています。 Releaseビルドで作成された実行ファイルが動かずに困っています。 症状としては、リリースビルドで作成したexeファイルを起動すると画面が真っ黒のままフリーズした状態になります。 ゲーム開始時にBGMが鳴るように設定してあるのですが、音楽に関しては正常通り動作しました。 テクスチャを置き忘れたということはなく、描画は今のところDxLibの描画関数のみを用いて行っています。 Debugモードについてはexeファイル上からでも正常通り動作しています。 使用ライブラリは最新版のVer3.05です。 開発環境はVisualStudio上のVisual C++ 2008で行っています。 ゲーム起動時においてDxLibの設定を ・ChangeWindowMode(true); ・SetGraphMode(800,600,32); ・SetMainWindowText("ゲームタイトル"); ・SetMouseDispFlag(true); ・SetAlwaysRunFlag(true); のように設定しています。 標準描画関数を多様しているせいか、 現時点でfps値が低く処理自体は重くなっています。 以下は私の開発マシン上でのシステム情報です。 原因や気付いた点などございましたらアドバイスして頂けると幸いです。宜しくお願い致します。 0:システムの情報を出力します 7: DXライブラリ Ver3.05 10: 論理プロセッサの数 : 4 10: OS Windows7 ( Build 7600 ) 112: CPU動作速度:大体2.26GHz 113: MMX命令を使用します 114: SSE命令が使用可能です 115: SSE2命令が使用可能です 116: CPUベンダ:GenuineIntel 120: CPU名:Intel(R) Core(TM) i5 CPU M 430 @ 2.27GHz 132:COMの初期化... 成功しました 154:メモリ総量:3958.89MB 空きメモリ領域:1522.20MB 155:タイマーの精度を検査します 156:精度結果 更新回数 マルチメディアタイマー:1 パフォーマンスカウンター:60 156: パフォーマンスカウンターを使用します タイマー精度 : 2208.046000 KHz 158: ソフトの二重起動検査... 二重起動はされていませんでした 164:ウインドウクラスを登録します... 登録に成功しました 165:ウインドウモード起動用のウインドウを作成します 302:ウインドウの作成に成功しました 433:IMEを無効にしました 435:ウインドウスタイルをウインドウモード用に変更します... 完了 439:DirectInput関係初期化処理 440: DirectInput7 の取得中... 成功 481: 引き続き初期化処理... 初期化成功 487: ジョイパッドの初期化... 513: ジョイパッドの初期化は正常に終了しました 514: マウスデバイスの初期化... 初期化成功 516: キーボードデバイスの初期化... 初期化成功 519:DirectInput 関連の初期化は正常に終了しました 521:DirectSound の初期化を行います 522:DirectSound インターフェースの取得を行います.... 成功 527:引き続きインターフェースの初期化処理... 成功 667: DirectSound デバイスを列挙します 669: モジュール名: ドライバ記述:プライマリ サウンド ドライバー 670: モジュール名:{0.0.0.00000000}.{b05bac68-527e-470e-b5ba-2d150f1c7038} ドライバ記述:スピーカー / ヘッドフォン (Realtek High Definition Audio) 671: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz 672: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 672: 利用可能サンプリング精度 673: プライマリ 16bit = OK 8bit = OK 674: セカンダリ 16bit = OK 8bit = OK 674: 利用可能チャンネル 675: プライマリ MONO = OK STEREO = OK 676: セカンダリ MONO = OK STEREO = OK 677:DirectSound の初期化は正常に終了しました 682:DirectDraw オブジェクトの取得を行います.... 成功 689:引き続き初期化処理... 初期化に成功しました 829:IDirect3D9Ex オブジェクトを取得します.... 成功 908:IDirect3DDevice9Ex オブジェクトを取得します.... ハードウエア頂点演算を使用します 1402:成功 1403:Driver:nvd3dum.dll Description:NVIDIA GeForce 310M 1404:画面のフォーマットは D3DFMT_X8R8G8B8 です 1405:Zバッファのフォーマットは D3DFMT_D16 です 1405:16bit カラーフォーマットは D_D3DFMT_R5G6B5 です 1406:32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 1406:アルファ付き 16bit カラーフォーマットは D_D3DFMT_A4R4G4B4 です 1407:アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 1407:アルファテスト用 16bit カラーフォーマットは D_D3DFMT_A1R5G5B5 です 1408:アルファテスト用 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 1409:DXT1テクスチャフォーマットは D_D3DFMT_DXT1 です 1409:DXT2テクスチャフォーマットは D_D3DFMT_DXT2 です 1410:DXT3テクスチャフォーマットは D_D3DFMT_DXT3 です 1411:DXT4テクスチャフォーマットは D_D3DFMT_DXT4 です 1412:DXT5テクスチャフォーマットは D_D3DFMT_DXT5 です 1413:描画用 16bit カラーフォーマットは D_D3DFMT_R5G5B5 です 1413:描画用 32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 1414:描画用アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 1415:最大テクスチャサイズ 幅:8192 高さ:8192 1415:テクスチャステージテンポラリレジスタ:使用可 1416:減算合成のハードウェア対応:ネイティブ 1416:頂点シェーダーバージョンコード:300 1417:ピクセルシェーダーバージョンコード:300 1439:バックバッファロック転送の時間:3116nsec 一時的な描画可能バッファを使用した転送の時間:891nsec 1440:バックバッファロックを使用しません 1440:Zバッファを作成します.... 成功 1456:プログラマブルシェーダーを使用します 1577:フォントの初期化を行います 1582:フォントの初期化は正常に終了しました 1583:文字コードバッファの初期化を行います... 完了しました

Page: 1 |

Re: Releaseビルド後のexeファイル実行について ( No.1 )
名前:管理人 日時:2011/04/11 01:11

Releaseビルド と Debugビルドでは主にスタックメモリ( 関数が終わったときに戻るべきメモリアドレスや 引数やローカル変数を記憶する領域 )周りの扱いが違う( Debugビルドではローカル変数は一律で特定の値に 初期化されたり、エラーチェックのために余分にローカル変数用のメモリを確保するので 若干のメモリの不正なアクセス( 配列の宣言用素数以上の値にアクセスする等 )が発生しても 一見何事も無く動作してしまうなど )ので、Debug ビルドでは動作したのにRelease ビルドでは動作しない、 ということはそれなりの確率で発生します Release ビルドでは実行時のデバッグ機能が結構適当になってしまいますが、一応使うことができますので 「ここまで実行できているかな?」と思える部分にブレイクポイントを置いた上で Release ビルドのプログラムを VisualC++ 2008 上からデバッグ実行して、プログラムがどこまで動作しているかを調べてみてください あと、前述の通りスタックメモリ周りの動作が変化しますので、 初期化していないローカル変数を使っている箇所が無いかや、ローカル配列の要素数以上の要素に アクセスしてしまっていないかなども確認してみてください
Re: Releaseビルド後のexeファイル実行について ( No.2 )
名前:Dec 日時:2011/04/13 01:07

>管理人様 アドバイスありがとうございます. Debug,Releaseでのスタックメモリの振る舞いが違うことが大きく影響しているかもしれないですね. その後,未初期化変数の使用や配列外にアクセスしているかどうか調べたのですが,どうやらそれらの問題については大丈夫のようでした. VisualC++2008のプロジェクト上からのデバッグ(F5)ではプログラムはDebug,Releaseともに正常に動いています. ブレイクポイント置いて確かめるということで,VisualC++2008上からのデバッグは可能ですが Releaseビルド後にReleaseフォルダ上に作成されるexeファイルからの実行に対しては, プログラムがどこまで動いているかについて把握することはできるのでしょうか? いっそのこと現在作成中のプロジェクトを一度解体して, ファイルを少しずつを追加しながらバグが発生する原因を確かめようかとも検討しています.
Re: Releaseビルド後のexeファイル実行について ( No.3 )
名前:管理人 日時:2011/05/03 19:49

ご返信が遅くなり申し訳ありません > VisualC++2008のプロジェクト上からのデバッグ(F5)ではプログラムはDebug,Releaseともに正常に動いています. もしかして、Releaseフォルダ上に作成される exe ファイルを Releaseフォルダ上で実行してしまって VisualC++2008上で F5 実行した場合とは起動時のカレントフォルダが違ってしまうのでデータファイルに アクセスできていない、ということでしょうか? もしその場合でしたら、Release フォルダ上にある exe ファイルを一つ上のフォルダに移動して 実行してみてください > Releaseビルド後にReleaseフォルダ上に作成されるexeファイルからの実行に対しては, > プログラムがどこまで動いているかについて把握することはできるのでしょうか? ErrorLogAdd と ErrorLogFmtAdd という関数があり、この関数で Log.txt に文字列を出力することができます 使用例: ErrorLogAdd( "テスト出力1" ) ; // ErrorLogAdd は文字列だけ ErrorLogFmtAdd( "数値出力 %d ", 5000 ) ; // ErrorLogFmtAdd は printf と同じ書式出力が可能 随所にこの関数で文字列出力をして、その地点をプログラムが実行されたかどうかを確認したり その時点での変数の値などを出力することができます

Page: 1 |