トップページ > 記事閲覧
セーブ方法
名前:にこよん 日時: 2018/03/26 20:11

こんばんわ 今作っているゲームでデータを保存するタイミングの話なのですが、 今回はウィンドウが破棄されて、ゲームループを抜けた時にDxLib_End();を呼ぶ直前にゲームを保存しています しかし、デバッグを何度もしているとデータが消えた(0初期化された?)事が2度ありました 原因として、終了間際でデータを保存してるせい、という可能性は高いでしょうか? このような保存方法はしないほうがいいでしょうか? それともデバッグ中にビジュアルスタジオからデバッグの停止を行ったせいで処理が半端に終わった?とか? int main(){ //メイン抜けたら SavePlayTime(USER_FILE_NAME); //プレイ時間を保存する InitSoundMem(); //メモリ解放 InitGraph(); //メモリ解放 GameLibEnd(); //gameライブラリの終了処理←ココもデータ保存処理あり return 0; //プログラムを終了する }
メンテ

Page: 1 |

Re: セーブ方法 ( No.1 )
名前:Raster 日時:2018/03/26 22:11

DxLib_End() を呼ぶとそれ以降DxLibの関数が使えなくなるだけで、C関数群は使えるのでデータ保存には影響ないでしょう。 デバッグの停止をした場合、「セーブする前にデバッグを停止」したなら、当然データは保存されませんが、ファイルの中身が 消えることは無いでしょう。 ただし以下のように、ファイルに保存しようとしてモード write/text で開いて、書き込む前にデバッグを停止した場合は、 ファイルの中身はまっさらになります。  _tfopen_s(&file, TEXT("data.txt"), TEXT("wt")) // ---> この時点でまっさらになる  // ここでデバッグを停止したら、データは保存されない  _ftprintf_s(file, buf);
メンテ
Re: セーブ方法 ( No.2 )
名前:にこよん (解決) 日時:2018/03/26 23:32

ご回答ありがとうございます ウインドウを消した後プログラムが終了するまでの一瞬に停止ボタンを押すことはかなり難しいので、 保存するプログラムに何らかの問題があったのですか また、対策を考えるなり作り直したりしようと思います ありがとうございました
メンテ
Re: セーブ方法 ( No.3 )
名前:管理人 日時:2018/03/26 23:37

Rasterさんも仰られていますが、デバッグ中に VisualStudio のデバッグ停止の機能を使用してプログラムを 終了した場合は DxLib_End もその手前の処理も実行されることなくプログラムの実行が強制終了されてしまいますので、 当然 DxLib_End の手前で行われるはずの保存処理も実行されません なので必ず保存処理を行いたい場合は VisualStudio のデバッグ停止機能を使用しないでプログラムを終了する必要があります
メンテ
Re: セーブ方法 ( No.4 )
名前:にこよん 日時:2018/03/26 23:48

ご回答ありがとうございます たとえデータが保存されないにしても、全て0になるはずがないのでやはりプログラムの問題ですか....😢 スレッドに関係がないのですが、 > 終了した場合は DxLib_End もその手前の処理も実行されることなくプログラムの実行が強制終了されてしまいますので、 メモリ解放などの関数が呼ばれないのであればソフトによっては問題が起こったりしないのでしょうか? デバッグではメモリはビジュアルスタジオが管理していて強制解放される...?
メンテ
Re: セーブ方法 ( No.5 )
名前:管理人 日時:2018/03/27 00:49

> たとえデータが保存されないにしても、全て0になるはずがないのでやはりプログラムの問題ですか.... プログラムの問題かどうかは分かりませんが、Rasterさんが仰られているケース以外でも fopen で開いたファイルを fclose をせずにプログラムを終了した場合もファイルサイズが 0 になります FILE *fp = fopen( 〜〜〜 ); fwrite( 〜〜〜, fp ); 〜〜〜例えば10MBくらい書き込む処理 fwrite( 〜〜〜, fp ); // A fclose( fp ); 例えば上記のようなプログラムの場合、『// A』と書かれた箇所まで処理を実行していれば ファイルには既に 10MB ほど書き込んでいるはずですが、fclose でファイルを閉じずにプログラムを 終了するとファイルには何も書き込まれず、ファイルサイズは 0 となります なので、可能性は低いかもしれませんが『fclose でファイルを閉じずにプログラムを終了している場合がある』のかもしれません > メモリ解放などの関数が呼ばれないのであればソフトによっては問題が起こったりしないのでしょうか? > デバッグではメモリはビジュアルスタジオが管理していて強制解放される...? 一般的に使われている Windows としては WindowsXP から OS の根っこの部分が『NTカーネル』系になったお陰か、 デバッグ停止を使った強制終了をしても問題が起きなくなりました それ以前の Windows95, Windows98, Windows98SE, WindowsMe などの『95カーネル』系の時代はデバッグ停止の 強制終了をするとソフトで確保したメモリなどが確保されっぱなしになるので、間違って何回かデバッグ停止してしまうと PCを再起動しないと DxLib_Init が成功しなくなる、という状態でした Windows7 や Windows10 も『NTカーネル』系の OS なので、デバッグ停止で強制終了しても大丈夫なようです
メンテ
Re: セーブ方法 ( No.6 )
名前:にこよん (解決) 日時:2018/03/27 03:24

> 例えば上記のようなプログラムの場合、『// A』と書かれた箇所まで処理を実行していれば > ファイルには既に 10MB ほど書き込んでいるはずですが、fclose でファイルを閉じずにプログラムを > 終了するとファイルには何も書き込まれず、ファイルサイズは 0 となります そうなんですね 今回に限らず気を付けます > Windows7 や Windows10 も『NTカーネル』系の OS なので、デバッグ停止で強制終了しても大丈夫なようです 何も考えずにデバッグ停止のボタンを押してました.... 問題がなくてよかったです 他に詳しいお話ありがとうございましたm(__)m勉強になります しばらく悩んでいた事がすっきりしました ご回答ありがとうございましたm(__)m
メンテ
Re: セーブ方法 ( No.7 )
名前:Raster 日時:2018/03/27 06:32

「解決」が付いていましたが、気になったので書きました。(特に不要でしたらスルー願います) 「データを保存するファイルが0バイトになる」という前提で考えていましたが、 「データは保存されているが、全項目が0になっている」ということでしょうか?(No.4より) SavePlayTime(USER_FILE_NAME); ・USER_FILE_NAME が想定外の値の時に、データ保存に影響するプログラムになっていないか ・データを書き込む直前の行で、書き込むデータが0になっていないかをチェックするプログラムを追加してみる GameLibEnd(); ・データを書き込む直前の行で、書き込むデータが0になっていないかをチェックするプログラムを追加してみる プログラムの最初のへん ・保存する、ということは、読み込む処理もあるのかと思います。そこでなにか問題が起きていないか SavePlayTimeやGameLibEnd内の保存部分をコメントアウトする ・これでしばらくプレイしてデータが失われないなら、どちらか(or 両方)の関数に問題がある ・これでもデータが失われるなら、ここ以外に問題がある
メンテ
Re: セーブ方法 ( No.8 )
名前:にこよん 日時:2018/03/28 00:08

アドバイスありがとうございます とてもありがたいですm(__)m >「データを保存するファイルが0バイトになる」という前提で考えていましたが、 >「データは保存されているが、全項目が0になっている」ということでしょうか?(No.4より) 考えていなかったので分からないです(次バグが起これば確認しようと思います 読み込んだ時に本来読み込んだ数が入る変数がすべて0になっていたという意味でした なお、ゲームデータとは別に設定内容の保存はiniファイルに書き出しており、その内容は test=0 のように値が0になっているようでした(間違ってはないと思いますがうろ覚えです) >・USER_FILE_NAME が想定外の値の時に、データ保存に影響するプログラムになっていないか これはデータを保存するフォルダの名前(なんでFILEにしてるんだろう名前)を定義したdefineだったので 値が変わることはないと思われます あと、試しに適当な文字列を入れてみたのですが、適当な文字列のフォルダの中に保存されました.... >・データを書き込む直前の行で、書き込むデータが0になっていないかをチェックするプログラムを追加してみる これは、前のセーブファイルの大きさが0の場合はメッセージを出して終了するということでしょうか? ゲームを起動したときにファイルを読み込むのでその時に異変があった場合は気づくことができます (ゲーム起動時にはセーブデータに書き込む作業はないのでセーブファイルに変化が起こることはない...はず) >プログラムの最初のへん >・保存する、ということは、読み込む処理もあるのかと思います。そこでなにか問題が起きていないか 読み込み関数で失敗が起きたら終了してしまうので、(失敗した行を表示してから) 関数内部で失敗しているということはないはずです 前述しましたが、ini形式で保存しているものに関してはセーブファイルの値も0になっていたのでこちらの可能性は低いと思われます >SavePlayTimeやGameLibEnd内の保存部分をコメントアウトする >・これでしばらくプレイしてデータが失われないなら、どちらか(or 両方)の関数に問題がある >・これでもデータが失われるなら、ここ以外に問題がある 簡単に確認してみたのですが、データが消えることはなかったです (コメントアウトしたのち普通に終了x10とデバッグ停止x10)
メンテ
Re: セーブ方法 ( No.9 )
名前:にこよん 日時:2018/03/28 00:01

ただ、これが起こる確率が酷く低く、今まで1000回程度起動と終了(たまにデバッグ停止)を行っているうち データが消えたのは2回しかないので今後同じことが起こるかどうかわからないです....
メンテ

Page: 1 |

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

   クッキー保存