読者です 読者をやめる 読者になる 読者になる

unity セーブデータの読み込み、書き込みを高速化する。 PreviewLabs.PlayerPrefs

UnityのPlayerPrefs

読み込み書き込みするたびに端末内のストレージ、またはSSD、SDカードに
アクセスしている。そのため、処理が遅くなる。

f:id:yasuaki-ohama:20150530163835p:plain

それを改善するためには、PlayerPrefsのセーブデータを一度読み込み、メモリに格納する。
そして、二回目以降からはメモリからデータを利用するようにする。
最後に、保存する時にだけストレージにアクセスする。

PreviewLabs.PlayerPrefs.cs

ストレージへの読み込み書き込み回数減らすのを簡単に実装してくれるのがこれ
http://www.previewlabs.com/wp-content/uploads/2014/04/PlayerPrefs.cs

ゲーム実行中に一度PlayerPrefsのデータを読み込みメモリに格納し、以後メモリから読み込み処理をしている。
そして、書き込みするときだけストレージにアクセスしている

使い方は簡単
PlayerPrefsを使っているスクリプトにこれを入れるだけ

using PlayerPrefs = PreviewLabs.PlayerPrefs;

書き込み処理はこれ

PlayerPrefs.Flush();

簡単な負荷速度テスト

  1. PreviewLabs.PlayerPrefsを利用したスクリプトと利用しないスクリプトを用意
  2. ボタンを押すと処理を実行するように設定
  3. UnityでbuildしてXcodeに吐き出し
  4. ios4でテスト

f:id:yasuaki-ohama:20150529165527p:plain

テストサンプルコード(ボタンを押すと1000回読み込み書き込みする)

using UnityEngine;
using System.Collections;
using PlayerPrefs = PreviewLabs.PlayerPrefs;

public class PreviewLabsSaveData : MonoBehaviour 
{
    public void OnButtonClock()
    {
        for (int i = 0; i < 1000; i++) {
            PlayerPrefs.SetString (i.ToString (), PlayerPrefs.GetString (i.ToString (), i.ToString ()));
        }
    }
}
using UnityEngine;
using System.Collections;

public class SaveData : MonoBehaviour 
{
    public void OnButtonClock()
    {
        for (int i = 0; i < 10000; i++) {
            PlayerPrefs.SetString (i.ToString (), PlayerPrefs.GetString (i.ToString (), i.ToString ()));
        }
    }
}

結果

PreviewLabs.PlayerPrefs.csがアタッチされているボタンを連打
f:id:yasuaki-ohama:20150529151652p:plain

PlayerPrefsがアタッチされているボタンを連打
f:id:yasuaki-ohama:20150529151655p:plain


http://previewlabs.com/writing-playerprefs-fast/
http://previewlabs.com/2011/03/writing-playerprefs-fast/
基本的な処理の流れ | パソコン(PC)の森