0

ここで奇妙な動作が発生します。クラスの配列を保持する単純な C# スクリプトを作成すると、スクリプト クラスと配列クラスの両方がシリアライズ可能としてマークされます。マウスの移動にシーンビューが遅れ始めます (スクリプト コンポーネントを含むゲーム オブジェクトが選択されている)。また、配列クラスに SerializeField としてマークされているメンバーが増えると、遅延が増加します。

配列に属性 [field: NonSerialized] を追加すると、ラグがなくなります。また、[HideInInspector] は何も変更しません。フレームごとにスクリプト コンテンツをシリアル化するために何かがユニティを引き起こしているように見えます。

誰かがこれに対する解決策を知っていますか?

[編集: コード スニペット]

using System;
using UnityEngine;

[Serializable]
public class TestObject{
    public int              IndexX;
    public int              IndexY;
    public int              LengthX;
    public int              LengthY;
    public float            AnimationLength;
    public bool             Animate;
    public float            AnimationSpeed;



    [SerializeField]
    private GameObject      mGameObject;

}


[Serializable]
public class TestScript{

  [HideInInspector]
  public TestObject[] Objects       = new TestObject[256*64];

  void Start(){

  }

  void Update(){

  }

}

この非常に短く基本的なスクリプトは遅延の問題を引き起こします...しかし、256x64 の配列はシリアル化するのがそれほど難しくありません。私は Jump'n'Run ゲームを構築しています - 「OnSerialize」や「OnDeserialize」などのメッセージを受け取ることができれば非常にうれしいので、タイルをより単純な形式で保存および再ロードできます。unity はタイル gameobjecs を保存します。ものをメッシュします-しかし、それは重いオーバーロードです..2つのリストを使用して、「起動」メッセージをリッスンするこのようなものを作成しようとしました-しかし、エディターでメッセージを取得した場合、既存のゲームオブジェクトを削除できません-それはエディターがデータをリロードするときに、それらを削除して再作成できればいいのですが。

4

1 に答える 1

1

256*64 = 16384 個のオブジェクト。フレームをドロップしないようにするには、それぞれを 0.002 ミリ秒 (1/30/16384) 未満でシリアル化する必要がありますが、これは難しい注文です...

ゲーム スレッドでシリアル化する必要を回避できますか? シリアル化を非同期で行うスレッドを生成できますか? そうすれば、引き続きユーザーに応答できます...

于 2013-02-12T11:40:57.900 に答える