階層化ラベル保存プラグイン highSpeedLabeler.ks 1. はじめに highSpeedLabeler.tjs は、既読ラベルデータの読み込み・書き込みを 高速化するプラグインである。 このプラグイン、KAGWindow クラスの setRecordLabel()、incRecordLabel()、 getCurrentRead() を都合のいいように書換えて、今まで sf[trail_シナリオファイル名_ラベル名] = 読んだ回数 だった既読ラベルのセーブ方式を、 savedata/record_シナリオファイル名(のUUID).ksd ファイルの labels[ラベル名] = true(or void) に書き込むように変更する。つまり、既読ラベルの保存ファイルを savedata/以下にシナリオごとに分割して保存する。 2. 使い方 first.ks の先頭で、以下のようにして読み込む。 [call storage="highSpeedLabeler.ks"] これだけ。あとはなんもせんでも既読ラベルの読み書きが高速になる。 3. 原理 デフォルトでは既読情報は savedata/savesu.ksd にドカっと保存される。 後述のようにこれだと遅いので、上記のようにシナリオファイルごとに 分割して既読情報を専用ファイルに保存するようにし、加えて、 「必要になるまで既読情報を読み込まない」「一度読み込んだ既読情報は 覚える」「更新されていない既読情報は書き出さない」「既読回数では なく読んだかどうかのフラグを保存する」ようにすることで、読み込み・ 書き込みを高速化している。 4. なんで作ったのん? 吉里吉里/KAGは、特に長いゲームを遊ぶ場合、起動するときに やたらめったら時間がかかることがある。詳細はこちら。 http://www.geocities.co.jp/keep_creating/DojinDOC/kirikiriSmallTips.html#slowboot 2chの「■吉里吉里/KAG/TJS雑談質問スレ■その23」の 963 以降の検証によると、既読ラベルを階層化して保存すると モノスゴ起動が早くなるとのこと。ということで実装してみたのが hierarchicalLabeler(絶版)。確かに、同じデータ量なら劇的(30倍!)に 起動が早くなった。このhighSpeedLabelerはこれをもう少し賢くしたもの。 5. 注意事項 ・既読ラベルの形式をガラリと変えてしまうので、本プラグインを組み込む  時はセーブデータの互換性が完全に損なわれる。必ず全てセーブ  データを削除してから本プラグインを組み込むこと。ゲーム作り始めから  導入しといた方がいい。 ・途中で元に戻したくなった時も、セーブデータを削除することを  強く推奨する(必須ではない…無駄なセーブデータが残るだけ)。 ・KAGWindowクラスをムリヤリ書き換えるので、他プラグインとの  相性は悪いことが容易に想像できる。上記三つのメンバ関数に手を  入れているプラグインを使っている場合は要注意。 ・なお、拙作「どこでもセーブプラグイン(SaveAnywhere.ks)」とは  共存が可能であることを確認済み。 ・Ver0.21→0.5で、ファイル名のエンコード方法をadler-32からUUIDに  変更したので、セーブデータの互換性が無くなっている。updateを  考えている人は注意。そのまま上書きしても既読情報がなくなるだけで  エラーにはならないけどね。 6. 互換性に関する言い訳 本当は、以前のデータ(trail_シナリオファイル名_ラベル名)が存在 したら旧方式で動作、あるいは旧データを新データに変換しようと 思ってた。のだけど、断念した。理由は以下の通り。 ・旧データはデリミタに'_'を使っているが、これはファイル名や  ラベルとしても使用できるため、既存の既読ラベルをファイル名と  ラベルに分割することが不可能  <例> このデータは a.ks の b_c ラベルの既読データか? それとも、a_b.ks の c ラベルの既読データか? sf[trail_a_b_c] = 1 もっと言えば、a.ksのb_cラベルとa_b.ksのcラベルが 両方存在したら、「違うラベルなのに重複して既読と マーク」されてしまう…。こんなんアリなの? ・旧データ形式を認識しても、変換するのに何分もかかる場合があり、  ゲームをユーザに強制終了させられちゃう可能性がある。 とかまぁそんなんで諦めた、ということで許して欲しい。 7. 謝辞 吉里吉里/KAG雑談スレ 23 の住民の皆様。特に963〜971の方々。 感覚じゃなくて数値ベースの検証をしてくれて、とっても助かり ました。みんなも技術者を自認するなら、ああいう定量的・定性的な 評価をしようぜ! 8.追記 開発版吉里吉里や吉里吉里Zでは、system/config.tjs の saveDataMode に 'b' が使えるようになった。これにより、読み込みは 高速化されたため、使えるなら使用を検討してもいいかも。 詳細はこちら。 http://www.geocities.jp/keep_creating/DojinDOC/kirikiriSmallTips.html#slowboot