セーブデータ

こんにちはプログラマのマツノブです。

 

今回もプログラムの話をしていきましょう。

みなさん、セーブデータ構造体の構成変更によって容量が変わり互換性が失われ残念な気持ちになったことありませんか?

私はあります。

 

セーブデータ構造体1

 

セーブデータ構造体2

 

セーブデータ構造体1で実装していたのに後々flagの数が変更されたりmpのパラメータが追加されたりして構造体のサイズが変わるとセーブデータバイナリから正しくコピーできなくなり互換性が失われます。

 

今回はそんなセーブデータ構造体の構成変更による容量変化を最小限に抑える方法について考えていきましょう。

 

 

今回は実に短いコードですね。

 

 

と定義してやればSaveDataPaddingに最大サイズからCharacter構造体のサイズを引いたバッファーが作られ、Character構造体のサイズが必ず100byteになります。

なのでCharacter構造体の末尾に100byteの範囲でパラメータを追加しても後ろのCharacter構造体に影響を与えることがなくなります。

 

さらにセーブデータとして使う前提の構造体なので幾つかのアサートを仕込んでおきます。

 

バッファーサイズが0未満になるとバッファーが構築できないのでアサート。

そもそも char _buffer[_BUFF_SIZE_] がサイズエラーになるので必要はないかもしれないですね。

 

最大サイズをアライメントサイズで割ってあまりが出るということはコンパイラがこちらが関知しないパディングを入れるのでアサート。

 

セーブデータはmemcpyなどのメモリコピー関数によってコピーすることが多いのでコピー可能であることを確認します。

 

これでセーブデータの互換性が失われロード画面でエラーが発生する頻度が下がるでしょう。

 

それでは皆さん良いプログラミングライフを

(Visited 540 times, 1 visits today)

コメント投稿は締め切りました。