2015-10-02 3 views
3

Я делаю 3D-симулятор в Unity.
Для этого симулятора мне нужны некоторые данные, которые хранятся в объекте Serializable.
Этот объект определен в файле DLL, который я создал.
Я десериализации его с этим кодом:Deserialization slow performance в Unity

public class myObject 
{ 
    static public myObject LoadFromFile(String Path) 
    { 
     System.Runtime.Serialization.Formatters.Binary.BinaryFormatter BF = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
     System.IO.FileStream FS = new System.IO.FileStream(Path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read); 
     myObject Result = BF.Deserialize(FS) as myObject; 
     FS.Close(); 
     return Result; 
    } 
} 

Моя программа единства имеет ссылку на библиотеку классов, содержащую определение «MyObject».
Если я запускаю функцию десериализации из Unity, этот процесс занимает 35.080 секунд.

Если я запустил это в приложении Windows, которое я создал для целей тестирования, и относится к той же библиотеке классов и открывает тот же файл, этот процесс занимает всего 0.260 секунд.

Это займет много времени в Unity, даже если я запускаю этот процесс асинхронно.

Интересно, почему это занимает намного больше времени, когда я запускаю этот код из Unity? , и если есть что-нибудь, что я могу сделать по этому поводу?

Спасибо заранее,
Маартен

+0

Добро пожаловать в StackOverflow, используете ли вы один и тот же объект в своем приложении Test and Unity? –

+0

Да все одинаково – Maarten

ответ

1

Я не знаю, почему это происходит, но одно можно попробовать - это реализовать интерфейс ISerializable, сериализовать ваши члены самостоятельно и посмотреть, не осталось ли все еще медленнее.

Вам нужно будет реализовать GetObjectData и защищенный конструктор с использованием SerializationInfo и StreamingContext. GetObjectData для размещения объекта в потоке сериализации и конструктора для построения ... uhm .....

public class MyObject : ISerializable 
{ 
    private bool somemember; 

    protected Complaint(SerializationInfo info, StreamingContext context) 
    { 
    somemember = info.GetBoolean("b"); 
    } 

    [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] 
    public virtual void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
    info.AddValue("b", somemember); 
    } 
} 

Надеюсь, это поможет!

+1

Спасибо за вашу помощь, Я переписал код и использовал двоичный писатель для записи в memystream и двоичный код, чтобы прочитать его снова, и теперь он занимает всего 0.20 секунд в Unity. Еще раз спасибо, Maarten – Maarten

0

Я не полностью понимаю ваш вопрос. Класс, который вы хотите получить, находится внутри вашего DLL-файла? Если это так - неважно, где находится определение класса. Где и как хранятся ваши данные? Если вы хотите постоянно хранить данные на своем жестком диске, вы можете легко использовать Json.NET и хранить свои данные в файле .json. Из какого метода и когда вы пытаетесь загрузить свои данные в единстве?

Кроме того, если вы открываете поток файлов, вы также должны закрыть его, когда вы закончите чтение с него. Вы также можете взглянуть на некоторые соглашения о кодировании, такие как here