2013-02-11 1 views
0

이상한 동작이 발생합니다. 클래스의 배열을 포함하는 간단한 C# 스크립트를 만들면 스크립트 클래스와 배열 클래스가 모두 Serializable로 표시되고 내 장면 뷰가 시작됩니다. (스크립트 구성 요소를 포함하는 게임 객체가 선택 될 때) 마우스를 움직일 때 지체됩니다. 또한 배열 클래스에 SerializeField로 표시된 멤버가 더 많은 경우 지연이 늘어납니다.배열을 사용할 때 Sceneview Lag가 발생합니다.

[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"와 같은 메시지를 얻게되어 매우 기쁩니다. 따라서 타일을 저장하고 간단한 형식으로 다시로드 할 수 있으며, 화합으로 타일 gameobjecs를 저장하고, 그 메쉬 물건 -하지만 그 무거운 과부하가 .. 두 목록과 "깨어있는"메시지를 듣고, 이런 식으로 뭔가를 만들려고 -하지만 내가 편집기에서 메시지를 얻으면, 나는 기존의 gameobjects을 삭제할 수 없습니다 - 그것 에디터가 데이터를 다시로드 할 때 삭제하고 다시 만들 수 있다면 좋을 것입니다.

+1

스크립트의 해당 부분을 게시 할 수 있습니까? 어쩌면 거기에 뭔가가있을 수 있습니다. 또한 (직렬화 된) 객체가'Update' 함수에서 건드리지 않았는지 확실합니까? – Joetjah

+0

완료. 그리고, 그래, 나는 내 물건을 더럽다고 표시하지 않는다. =/ – lunatix

답변

1

256 * 64 = 16384 개 개체입니다. 프레임을 떨어 뜨리는 것을 피하기 위해 각각의 프레임을 순서대로 0.002ms (1/30/16384) 미만으로 직렬화해야합니다.

게임 스레드에서 직렬화 할 필요가 없습니까? 비동기 적으로 직렬화 작업을 수행 할 스레드를 생성 할 수 있습니까? 그런 식으로 사용자에게 계속 응답 할 수 있습니다 ...

+0

아니, 화합이 언제 그리고 무엇을 직렬화할지 결정할 때, 나는 그것에 대해 통제 할 수 없다. 그리고 그 유일한 가정은, 연재가 이러한 행동을 일으킨다는 것입니다. 나는 더 큰 배열을 직렬화하는 데 1, 2, 심지어 5 초가 걸릴 수도 있음을 알고있다.하지만 직렬화가 원할 때만 발생하거나 에디터가 게임 뷰로 전환하면 그다지 나쁘지 않을 것이다. 다시 켜십시오. 화합은 각 배열/에디터 업데이트를 검사하기 때문에 배열에있는 것이 변경된 것입니까? 아마도 null 값이 아닌 다른 데이터 구조를 사용해야 할 것입니다. 그런데 사전을 사용해야하거나 타일을 검색해야합니다. – lunatix

+0

다른 해결책은 모든 것을 로컬 배열로 직렬화 한 다음 재생하면서 로컬 배열에서 읽고 빌드하는 것일까 요? – Joetjah

+0

"배열에 [field : NonSerialized] 속성을 추가하면 지연이 사라집니다."직렬화 프로세스와 관련이 있습니다. ..... Onserialise 메서드를 재정의하고 타이머를 사용하여 로그하는 이유는 무엇입니까? 프로세스가 수행됩니다 - 그럼 당신은 얼마나 자주 화합이 일어나게되는지를 알 수 있습니다. – GreyCloud

관련 문제