ゲームのリプレイモード用データ保存について

このQ&Aのポイント
  • C++初心者~中級者がゲームのリプレイモード用データ保存方法に迷っています。方法としては、領域確保、ファイル開いたまま書き込み、毎フレーム追記の3つが考えられますが、定石や注意点はありますか?
  • ゲームのリプレイモードを作るために、C++初心者~中級者がデータ保存方法について悩んでいます。領域確保、ファイル開いたまま書き込み、毎フレーム追記の3つの方法を考えていますが、どの方法が適しているのでしょうか?
  • C++のゲームを作る初心者~中級者が、リプレイモード用のデータ保存方法について困っています。領域確保、ファイル開いたまま書き込み、毎フレーム追記の3つを考えていますが、適切な方法はありますか?
回答を見る
  • ベストアンサー

ゲームのリプレイモード用データ保存について

C++でゲームを作っている初心者~中級者程度の者です。 リプレイモードを作ろうと思って、入力情報をファイルに保存し、それをリプレイモード時に読み出して元のゲームを再現する方法をとろうと思っているのですが、入力情報をどのようにファイルに書き出せばいいか迷っています。 考えた方法としては、 1. 十分と思われる領域(char[60*60*100]など)を確保しておいてそこに入力データを記録し、ゲームが終わった段階でそのデータを一気にファイルに書き込む 2. ファイルを開いたままにして毎フレーム入力を書き込む 3. 毎フレーム、ファイルを追記で開き、書き出し、閉じる ファイルはofstreamを使って書きだそうと思っています。 今のところ仮に2の方法で行っていますが、エラーログとかと違って動作が自由に出来るのにファイルが開きっぱなしというのが何となく気持ち悪い気がしています(一応、そのゲームプログラムからAlt+F4の入力などがあった場合はファイルを閉じるようにはしています)。 かといって、1は万が一長いプレイになったときに領域が足りなくなる可能性がある、3は何となく遅そう…という気がして……。 もしこういう問題に関して定石や、特に気をつけるべきポイントがあったりするのであれば、ご教授いただけませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • tunamelt
  • ベストアンサー率75% (9/12)
回答No.1

ゲーム自体の内容によりますが、一般的なのは1だと思います。 コンシューマのゲームを思い浮かべて貰えれば分かると思いますが、メモリ以外の外部記憶装置を利用することができないゲームが殆どですので、リプレイデータは一旦メモリに保存しておき、その後、ユーザがリプレイデータを保存するように選択したらファイルに書き出すという手法を取っています。 Windowsであるならば一時ファイルを生成しても良いかとは思いますが、格闘ゲームやレースゲームなどレスポンスを重視するゲームではあまり現実的ではないでしょう。 メモリに保存しておく場合は、フレーム毎にメモリに書き込むのではなくキー操作に変化があったフレームだけを保存しておくやり方でないと、あっという間にメモリオーバーしてしまうと思います(必要に応じてCPUが行った動き始めなども記録しておきます)。 また、メモリが溢れてしまう際には古いデータから消していくという処理も追加しないといけません。エースコンバットみたいなジャンルのゲームを見てみると分かりますが、長丁場になればなるほどゲーム開始時のリプレイがなくなって途中から始まっているのが分かると思います。

kmmnmaker
質問者

お礼

回答ありがとうございます。 作っているのがSTGでレスポンスを要求するゲームではあるのですが、 書き込み容量が少ないためか2の方法でもさしあたりは影響はありませんでした。ただ、No.2の方の指摘もありましたが考えているスペックに対しメモリ使用量があまり大きくないように思われたので、とりあえず1に組み直して様子を見ることにしました。 キー操作に変化があった場合のみ記録することでデータ量の節約になることを教えていただき、またリプレイが途中から始まる、という懐かしい現象を思い出させていただいたため、ベストアンサーとさせていただきます。

その他の回答 (1)

  • axsies
  • ベストアンサー率64% (38/59)
回答No.2

この手のどの実装を選ぶかという問題を考えるときに、何となく遅そうとか、何となく気持ち悪い、といった「何となく」で止まっていても結論は絶対に出ません。 ファイルハンドル開きっぱなしだとどういうデメリットがあるのか、毎フレームファイルをオープンして書き出すと全実行時間の何%くらいを占めるのか、ゲーム性にどう影響を与えるのか、といった所まで考えた上で、実験、実測して始めて結論が出せます。 と、まぁ理想は「実証主義」ですが、あらゆる可能性を実験することも難しいですし、理屈よりも経験が物を言うのは否定できません。 現代のコンピュータのアーキテクチャは非常に複雑なので、適切な手法に当たりをつける事すら経験による面が大きいです。 なので、経験の浅いウチは失敗を覚悟の上で適当に作り、問題が起きたら回避策を講じるか作り直すというのが最もベターな方法だと思います。 また、格ゲーだから、STGだから、レスポンスが大事だから、というのも良く見られる意見なんですが、作ってるゲームが本当に数FPSの揺らぎまで気になるようなシビアなゲームバランスなのかどうかもよく考える必要があります。 時代によって、プラットフォームの性能やアーキテクチャが変わればタブーも変わりますし、作ってるゲームにかなり左右されるので、一般論的な話は疑ってかかった方がいいです。 具体的な検討ですが、 1の方式なら、必要に応じて一定サイズごとに拡張すれば、メモリが許す限り記録し続けることは可能です。(1kbを超えるごとに新しく領域を作ってやる等) 2か3かですが、ずっと常駐するアプリって訳ではないですし、他のアプリケーションと共有して使われるファイルというわけでもないですので、記録が終了したらちゃんと閉じていれば、ファイル開きっぱなしが問題になる要素はないと思います。 一般に「ファイルは必要なくなったら閉じろ」と言われますが、その背景をもう少し詰めて考えてみてください。 ただメインループでファイルに描き込んでると、ファイル書き込み時(バッファをフラッシュするとき)に一瞬止まったり、レスポンスが悪くなるといった問題が発生する可能性はあります。 それが問題になったとしても、非同期で描き込むとか、リプレイ記録用スレッドで処理するといった回避策はあります。 1と2の最大の違いはメモリ使用量になるでしょう。 1プレイのリプレイサイズがどれくらいまで膨れあがり、最小スペックはどれくらいを見積もっているかが問題です。 メモリ溢れてスワップが発生しまくってたら、HDDに書き込みが発生するわけで、2以上のパフォーマンスロスも考えられます。 そういう訳で私としては1か2どちらでもいいと思うのですが、既に2で組んでおられるのでそのまま作ってしまい、問題が発生したならスレッド化を検討するか、1に切り替えてみる、という感じでいいと思います。

kmmnmaker
質問者

お礼

回答ありがとうございました。 適当にソースコードを書き換えながら1~3試してみたんですが、現状では書き込み量が少ないためか、いずれの方法でも気になるような処理落ちの発生などはありませんでした。(60FPS固定なので時間の比較は出来ない……とか思ってしまいましたがよく考えたら記録部分前後の時間が出来たかも知れませんでした…)で、結局、リプレイファイルのサイズが最大80kB程度でそこまで大きくないように思われたので今は1で組んでいます。 とは言え、基礎的な部分の知識が足りないのは痛感したところで、メモリ管理やスワッピングになるとほとんど単語でしか知らない状況なので勉強していきたいと思います。

関連するQ&A

  • リプレイ機能の実現について

    市販ゲームなどにリプレイ機能が付いているのをよく見るのですが、 あれの実現方法について考えてみました。 リッジレーサーやグランツーリスモ、東方などのリプレイ機能のアルゴリズムは 敵や車の動きからランダム性を完全に排除することでユーザーのキーの入力のみ をリアルタイムにセーブしてリプレイ時に同じ動きを同じ条件で毎回再現 しているのではと思ったのですが、仮にランダム性のあるゲームだと リプレイ機能は動画のキャプチャでもしない限り実現は難しいのでしょうか? ふと市販のゲームのリプレイを観ていて考えたのですが 何を言っているのか良く分からなかったらすみません。。

  • アクセス データは保存される?排他モード???

    レコードのデータを変更したり、新規にデータを入力した後に、 CTRL+Sを押すと、 『ほかのユーザーによってファイルが開かれているため、 変更したデザインを 保存したり、新しいデータベースオブジェクトに保存したりできません。 デザインの変更を保存したり、新しいオブジェクトに保存したりするには、ファイルを排他モードにする必要があります』 と表示されますが、 これはデータは保存されてるのでしょうか? デザインが保存されないだけでしょうか? でもデザインビューなどでいじってません。 また上記のメッセージから、今は排他モードでは開いてないことがわかりますが、 であれば何モードで開いてるのでしょうか? 共有モードでしょうか? それを開いてる状態で確認することは可能ですか?

  • *SharedObjectで保存したデータは…*

    いつもお世話になっております。 早速質問させていただきます(><; いまFlashでアドベンチャーゲームを作って居りまして、その内容がとても長くなってしまい、 シンボル数やフレーム数がとんでもないことになってしまいました。 MacromediaさんのHPの方でも「あまりに長すぎるswfファイルは誤作動を起こしかねない」と云うようなことが書かれており、少し怖くなったので、ゲームのswfファイルを[前編・後編]2つに分けました。 そこで質問なのですが、例えば前編のswfファイルでセーブデータ(プレイヤーに入力させた数値など)をSharedObjectで保存し、そのデータを後編のswfファイルで読み込むこと、というのは可能なのでしょうか? 解りにくい質問文で恐縮ですが、何卒ご教授お願いします;;;

    • ベストアンサー
    • Flash
  • 共有モードと排他モードとどちらで開けばいい?

    共有フォルダに入ってるアクセスファイルを複数人で開きたい時は 共有モードと排他モードとどちらで開けばいいのでしょうか? 複数人で共有するから、共有モードですか? そのファイルは3人で同時に開き、 そのうちの1だけがデータの入力をし、 他の2人は閲覧のみです。

  • ゲームデータ保存ファイルの検策

    ゲームデータの保存ファイルを検策したいのです Xpリカバリーの為 ゲームデータの保存ファイルを検策しFDにバックアップしたいのですが 検索ソフト 「りすてぃんぐ」 を使って 更新日時で検索してもうまくいきません OSは XpPRO ゲームは EVE burst error です 方法がありましたら教えてください

  • 膨大なゲームデータの保存法(15GB)

    oblivionやってましたMODをいれまくって データが15GBを超えてしまい (DETA)フォルダだけで13GB 新しいゲームを入れるともう容量がパンパンです 様々な他データをDVDRW(4GB)に移したのですが やはり限界があります 以前まとめて貴重なデータを圧縮したのですが 解凍するとファイルのほとんどがなくなっていました ブルーレイを買う予定はないので これらのデータを より効率よくまとめる方法を教えてください

  • プレステ等のデータの保存方式

    ゲーム機器のデータの保存方法って、公開されている のでしょうか? 有料なんでしょうか?無料で申告方式なんでしょうか? たとえば、ゲームを作成して、データをセーブします よね?その時開発メーカーは、どうやってセーブする 方式を決めるのでしょうか? 私は、PerlとPHPしか分かりませんが、ファイルの 書き込み方法は統一されてますよね。 ゲーム機器では、その統一された情報はどこから、 入手するのでしょうか? その方法さえ分かれば、自作のDVDでも書き込める物 なんでしょうか?

  • PS3 ゲームデータのインストール

    あるソフトをプレイ中突如ゲームデータが破損しています ゲームを続けるにはゲームデータを削除して下さい と表示されました。 ゲームデータを削除し再インストールしてみたのですが、80%から全く動きません。 エラーなどの表示は出ず、数10分待っても何も起こらない状態です。 セーフモードからのファイルシステム修復は試しました。 何か解決策がある方知恵を貸して下さい<(_ _)> ちなみにそのソフトはBORDERLANDS GOTY です。

  • データの保存

    はじめまして、私のPCはWinXP、CerelonM1.2GHZ、512MB、HDD60Gです。 最近PCの調子も悪く、データも保存しすぎてHDDの空き領域が不足しているので、一度データをDVR-RかCD-Rに保存して、リカバリ使用と思っています。 そこで質問なのですが、データを保存して、リカバリ後のPCに必要なデータだけ取り込みたいのですが、最適で効率的な方法は無いでしょうか? 保存対象は、エクセルファイル、ワードファイル、メール、IEお気に入り、音楽、映画などの動画ファイル、画像です。 私のイメージではマイドキュメントを全部一発で保存みたいな感じがよいのですが、無理ですか? よろしくお願い致します。

  •  セーフモードで入力したデータの救出(windows Me)

     セーフモードで入力したデータの救出(windows Me)  Windows Meのパソコンで、いまはセーフモードでしか起動できない状態です。 セーフモードで入力したエクセルのデータを取り出したいのですが、USBフ ラッシュメモリやCFカードを差し込んでみても認識せず、データが取り出せ ない状態です。  インターネットにはつないでおらず、添付ファイルを送ることもできません。  パソコンは VAIOノート PCG-532B です。  よろしくおねがいします。

専門家に質問してみよう