Войти
ПрограммированиеФорумОбщее

Сериализация vs. базы данных в юнити

Страницы: 1 2 3 4 5 6 7 Следующая »
#0
23:10, 2 апр. 2018

обсуждать мы начали тут https://gamedev.ru/projects/forum/?id=233738&page=3#m40 (правда ТС все пытался хамить больше чем обсуждать)

и закончили на фразе

When you call Instantiate() on either a prefab, or a gameobject that lives in the scene, or on anything else for that matter (everything that derives
from UnityEngine.Object can be serialized), we serialize the object, then create a new object, and then we “deserialize” the data onto the new object.

https://docs.unity3d.com/Manual/script-Serialization-BuiltInUse.html

мол юнити всегда использует сериализацию, когда делает Instantiate

что, ИМХО, очень странное решение.

Возьмем пример:

GameObject locModel = Resources.Load<GameObject>(locName);
GameObject locObject = Instantiate<GameObject>(locModel);

что серьезно при Instantiate юнити использует сериализацию? зачем?

#1
23:47, 2 апр. 2018

С префабом непонятно, т.к. он уже является потоком сериализованных данных, а с объектом сцены понятно. Это по сути глубокое клонирование объекта.

#2
0:05, 3 апр. 2018

Простота и гибкость, наверно. Раз уже есть готовая система для сохранения данных на диск, почему бы не воспользоваться ей и для копирования объектов? Вместо того, чтобы пилить отдельную систему.
Для сравнения, могу сказать, что Анрил, напротив, вводит специальный метод для клонирования.
Скорее всего, каждый сделал так, как посчитал нужным в один прекрасный день, а с тех пор система не ломалась, вот её и не меняли.

Alprog
> Я не знаю ни одного движка во всей индустрии, кто бы для этих целей использовал БД.
Ради кругозора. :3 (в последний раз проверял - хранил сейвы через SQLite)

#3
0:29, 3 апр. 2018

Delfigamer
> в последний раз проверял - хранил сейвы через SQLite
Перечитай абзац, из которого взял мою цитату. Там речь не про сейвы совсем.

#4
0:42, 3 апр. 2018

ладно, не поленился залезть в выложенные исходники юнити

UnityEngineObject.bindings.cs

    [NativeHeader("Runtime/GameCode/CloneObject.h")]
    public partial class Object
    {

        public static T Instantiate<T>(T original) where T : UnityEngine.Object
        {
            CheckNullArgument(original, "The Object you want to instantiate is null.");
            return (T)Internal_CloneSingle(original);
        }

        [FreeFunction("CloneObject")]
        extern static Object Internal_CloneSingle(Object data);

    }

как мы видим все дороги ведут к клонированию объекта, и нет там ни какой сериализации.

#5
1:35, 3 апр. 2018

Alprog
> Это может происходит во время сейвов; это может происходить во время разработки
> контента; также если мы коннектимся к каким-то локальным тулзам и плюёмся
> сообщения. Это банально происходит в момент нажатия кнопки Play в
> юнити-редакторе, чтобы сохранить состояние до игровой сессии и восстановить её
> по возвращению в edit-mode.
Нуокей, для клонирования объектов для play-in-editor, согласен, БД - это явный оверкилл.

tac
> как мы видим все дороги ведут к клонированию объекта, и нет там ни какой
> сериализации
Тогда, по-видимому, они имели в виду семантику - «Instantiate возвращает такой же результат, как если бы оригинал был сериализован, а затем тут же десериализован». Хотя описание по ссылке в #0 об этом как-то слишком уж тонко намекает, меня смутили только кавычки при "десериализует", и то из-за того, что «странно, я думал, оно как в анриле сделано».

#6
2:37, 3 апр. 2018

Delfigamer
> Нуокей, для клонирования объектов для play-in-editor, согласен, БД - это явный оверкилл.
И ещё для контента типа сцен. В том же абзаце написано.

> Тогда, по-видимому, они имели в виду
Да ты кого слушаешь? Человека, который по названию функции Internal_CloneSingle силой телепатии и 20+ лет опыта определяет, что там внутри нет сериализации? )))) Всё правильно в Unity-документации.
Вот набросал за несколько минут тест:

using System;
using UnityEngine;

public class A : MonoBehaviour, ISerializationCallbackReceiver
{
    public static bool First = true;

    [SerializeField]
    public string Foo;

    [NonSerialized]
    public string Bar;

    void Start()
    {
        if (!First) { return; } else { First = false; }

        this.Foo = "Foo";
        this.Bar = "Bar";

        Debug.Log("StartClone");
        var clone = GameObject.Instantiate(gameObject);
        Debug.Log("EndClone");

        Debug.Log(clone.GetComponent<A>().Foo);
        Debug.Log(clone.GetComponent<A>().Bar);
    }
    
    public void OnBeforeSerialize()
    {
        Debug.Log("OnBeforeSerialize");
    }

    public void OnAfterDeserialize()
    {
        Debug.Log("OnAfterDeserialize");
    }
}

Вывод:

StartClone
OnBeforeSerialize
OnAfterDeserialize
EndClone
Foo
Null
#7
2:57, 3 апр. 2018

Delfigamer
> Для сравнения, могу сказать, что Анрил, напротив, вводит специальный метод для клонирования.
А где, кстати, инфа, что в Unreal клонирование происходит без сериализации? По ссылке что-то не нашёл такого. Минуя диск — это ведь не значит, что минуя сериализацию.

#8
8:46, 3 апр. 2018

Alprog
> А где, кстати, инфа, что в Unreal клонирование происходит без сериализации? По
> ссылке что-то не нашёл такого. Минуя диск — это ведь не значит, что минуя
> сериализацию.

// Engine/Source/Runtime/CoreUObject/Private/UObject/UObjectGlobals.cpp
UObject* StaticDuplicateObjectEx( FObjectDuplicationParameters& Parameters )
{
  // <...>
  InstanceGraph.SetDestinationRoot( DupRootObject );
  while(Writer.UnserializedObjects.Num())
  {
    UObject*  Object = Writer.UnserializedObjects.Pop();
    Object->Serialize(Writer);
    SerializedObjects.Add(Object);
  }
  // <...>
}
+ Показать
#9
14:48, 3 апр. 2018

Alprog
> по названию функции Internal_CloneSingle силой телепатии и 20+ лет опыта
> определяет, что там внутри нет сериализации?
Alprog
> ISerializationCallbackReceiver

ну, скажем, так .. в юнити почему то все смешали в кучу и клонирование реализовали через сериализацию (хотя это тоже исключительно названия функций) ... но это совсем не та сериализация, которая у них пишется на диск

вида

+ Показать

поэтому в вопросе клонирование vs. сериализация - действительно получился спор о терминах, точнее конкретно юнити реализовала клонирование через сериализацию, что несколько странно но ладно. Видимо, для юнити важно поддерживать GUI сцены во время выполнения (что согласен удобно для дебага), и именно поэтому добавление любого объекта в сцену происходит, якобы через сериализацию, хотя это клонирование (попробуйте найти отличие), но я искренне надеялся что такого бреда в рантайме там не происходит, но увы.

Но изначально я, по крайне мере, говорил о сериализации которая пишется на диск ... а именно, когда поток байтов сериализуется в текстовый формат, пример которого выше

и сравнивал, я именно использование файлов с записью вот такого текста с базами данных


и если почитать начальный пост
Alprog
> Следующим логичным шагом было прикрутить какую-нибудь известную сериализацию.
> Бесчисленные json-решения (и уж тем более xml) я не очень люблю.
то очевидно и Alprog говорил об этом же, только почему то когда его прижали увел разговор в клонирование

#10
17:05, 3 апр. 2018

tac
> совсем не та сериализация, которая у них пишется на диск
С чего ты взял, что на диск пишется именная так? Как выберешь, так и пишется:
Изображение
А сериализация повсеместная у них в большинстве случаев из за взаимодействия с C++ кодом.

#11
17:15, 3 апр. 2018

tac
> ну, скажем, так .. в юнити почему то все смешали в кучу и клонирование реализовали через сериализацию (хотя это тоже исключительно названия функций)
И в Unreal тоже. И в подавляющем количестве других движков.

> но это совсем не та сериализация, которая у них пишется на диск вида
У Unity одна сериализация, но два формата записи: текстовая и бинарная. Формат файлов можно выбрать. При клонировании, полагаю, всегда бинарный формат.

> Но изначально я, по крайне мере, говорил о сериализации которая пишется на диск ... а именно, когда поток байтов сериализуется в текстовый формат
> Alprog говорил об этом же
Ничего подобного. Там же, в первом посте, написано, что отсутствие бинарного формата для меня являлось фатальным недостатком, чтобы отказаться от сериализатора.
Я несколько раз говорил, что сериализация применяется мной более широко, чем просто для сохранений: и для клонирования, и, что более важно, для формата файлов контента.
Первый аргумент, ты, наконец-то, понял. Но второй, на самом деле, ещё более весомый. Будем ещё 10 страниц спорить, прежде чем ты заявишь, что ты говорил не о такой сериализации, а о другой сериализации?
Ты сам выдумал своё собственное понятие сериализация, сузив его до невозможности; сам придумал для чего я его использую в своём проекте; сам принялся советовать базы данных.
Да ещё с таким апломбом: дескать, расскажи для чего тебе сериализация и почему тут не база данных, и сам всё поймёшь. Ну дурачок же и есть. Почему я вообще на тебя время до сих пор трачу?

> и сравнивал, я именно использование файлов с записью вот такого текста с базами данных
Да всё равно базы данных проигрывают и в этом случае. В одном из постов я пытался объяснять про то, какие процессы надо оптимизировать, повторять уже не буду.

#12
17:21, 3 апр. 2018

С вашего позволения, этот тред я тоже покидаю. Если кто-нибудь захочет защитить позицию tac (найдутся такие вообще?), то можно ещё подискутировать.
С ним же общаться надоело: он скорее будет бесконечно кукарекать, чем признает, что был изначально неправ.

#13
19:01, 3 апр. 2018

seaman
> С чего ты взял, что на диск пишется именная так? Как выберешь, так и пишется
я в курсе, без разницы какой формат, он отличается от клонирования в памяти

#14
19:08, 3 апр. 2018

Alprog
> и для клонирования, и, что более важно, для формата файлов контента.
> Первый аргумент, ты, наконец-то, понял. Но второй, на самом деле, ещё более
> весомый.
не знаю зачем ты завел разговор про клонирование, я показал свою статью как можно было сделать ... ну хочешь через сереализацию зад, ок

Я же повторюсь говорил только про то, что ты назвал вторым .... а ты с опломбом ушел от сути разговора, и только ля ля .. так и не поняв, что это и есть по сути работа с объектной базой

Страницы: 1 2 3 4 5 6 7 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.