Войти
Инди-ЮнитиФорум

Мастер класс по хорошему коду в юнити (23 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 122 23 24 2528 Следующая »
#330
(Правка: 14:47) 14:05, 31 янв. 2021

Alprog
Пока не проверял, может есть где и баг

    public override string ToString()
    {
        StringBuilder s = new StringBuilder();
        s.Append<string>(Tag).Append("\n");
        s.Append<Vector3>(MainPosition).Append("\n");
        for (int i = 0; i < Angles.Count; i++)
        {
            s.Append<Vector3>(Angles[i].Value);
        }
        s.Append("\n");
        foreach (KeyValuePair<string, List<int>> item in History)
        {
            s.Append<string>(item.Key);
            for (int i = 0; i < item.Value.Count; i++)
            {
                s.Append<int>(item.Value[i]);
            }
            s.Append("\n");
        }
        return s.ToString();
    }
    public void Parse(string argValue)
    {
        string[] locLine = argValue.Split('\n');
        for (int i = 0; i < locLine.Length; i++)
        {
            string[] locValue = locLine[i].Split(';');

            if (i == 0)
            {
                Tag = locValue[0];
            }
            else if (i == 1)
            {
                MainPosition = Vector3Ext.Parse(locValue[0], locValue[1], locValue[2]);
            }
            else if (i == 2)
            {
                for (int j = 0; j < locValue.Length; j += 3)
                {
                    Angles.Add(new Angle(Vector3Ext.Parse(locValue[i], locValue[i + 1], locValue[i + 2])));
                }
            }
            else if (i >= 3)
            {
                History.Add(locValue[0], new List<int>());
                for (int j = 1; j < locValue.Length; j++)
                {
                    History[locValue[0]].Add(int.Parse(locValue[j]));
                }
            }
        }

    
    }

static class Vector3Ext
{
    public static Vector3 Parse(string x, string y, string z)
    {
        return new Vector3(float.Parse(x), float.Parse(y), float.Parse(z));
    }

    public static StringBuilder Append<T>(this StringBuilder s, T argValue)
    {
        if (typeof(T) == typeof(Vector3))
        {
            Vector3 locVector3 = (argValue as Vector3?).Value;
            return s.Append(locVector3.x.ToString("F4")).Append(";").
                Append(locVector3.y.ToString("F4")).Append(";").
                Append(locVector3.z.ToString("F4")).Append(";");
        }
        else
        {
            return s.Append(argValue).Append(";");
        }
    }
}

#331
(Правка: 14:09) 14:08, 31 янв. 2021
+ Показать

жара... такой дичи я даже от tac не ожидал...
#332
(Правка: 14:27) 14:13, 31 янв. 2021

kkolyan
> такой дичи я даже от tac не ожидал...
а что именно тебе не нравится? Да решение в лоб, но оно же самое оптимальное тут ... а умнику давно надо было сравнить с ним, прежде, чем чего то заявлять о своем решении ...

#333
(Правка: 16:15) 16:12, 31 янв. 2021

forwhile
> так и запишем - остальные 29 челевек пинали куи и ни за что получали деньги.
> Хотя ваш проект вытянул только концепт худождник.
Очевидно, что я это не имел в виду. Во-первых, я сказал "написал", что уже семантически означает, что речь только о коде. Ну и во-вторых, любой нормальный человек понимает, что я написал не в одиночку. Да, не в одиночку написал, в соавторстве и с помощниками, чей вклад огромен, но написал же. Чтобы додумать мою фразу таким образом, будто я считаю, что остальные нихрена не делали, это явно надо специально искать в словах, к чему бы придраться.

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

> могу предположить что ты даже рендер своей игры не нюхал
Опять необоснованные набросы. Конечно, я занимался нашим рендером. Почти все основные системы и решения либо сделаны мной, либо были со мной согласованы. Из всего, что касается рендера, совсем без меня сделаны, разве что декали, decorated shader и печка света.

В общем, ты мне надоел. За всё время нашего общения ты только набрасываешь какую-то мерзкую предъяву и враньё. Я каждый раз трачу время на то, чтобы написать опровержение, а ты ни разу после опровержения не то, что не извинился, ты даже не ответил. Зато через пару дней говоришь следующую гадость. И тоже за слова не отвечаешь. Всё, отдыхай (ушёл в бан).

#334
(Правка: 16:19) 16:19, 31 янв. 2021

tac
> Пока не проверял, может есть где и баг
Если баг уровня опечатки или не того индекса, то такие мелочи мы поправим. Я не буду придираться.
Я только не понял, что такое Tag. Это типа tag самого MonoBehaviour? Он просто с маленькой буквы пишется. Или какой-то другой Tag?

> StringBuilder s = new StringBuilder();
А вот StringBuilder ты научился уже использовать. Смотрите, растёт на глазах специалист ))

#335
(Правка: 16:29) 16:27, 31 янв. 2021

Alprog
> Или какой-то другой Tag?

это свойство
public string Tag

Alprog
> Смотрите, растёт на глазах специалист ))
вы такие смешные, это же все от лени ) я всего лишь согласился что место критическое, а проверять ты собрался на скорость, в другом случае я бы оставил как есть ..

#336
16:28, 31 янв. 2021

tac
И ещё вопрос: не совсем понятно, как создавать объекты MonoBehaviour. У него же недостаточно просто вызвать конструктор, там надо создать префаб, на который его крепить. Это уничтожит остатки производительности твоей версии. Твоя версия и так проиграет по скорости, а с этим так и подавно. Можно я оптимизирую твой вариант и буду создавать не монобехи, а просто классы без привязки к префабам? Ну, либо покажи, как создавать монобехи правильно, чтобы честно было.

#337
(Правка: 16:31) 16:30, 31 янв. 2021

tac
> это свойство
> public string Tag
А, ок. Просто в изначальном посте ты его, видимо, случайно стёр. Добавлю.

#338
16:30, 31 янв. 2021

Alprog
> как создавать объекты MonoBehaviour
не парься, не наследуй от него ...

#339
(Правка: 16:32) 16:31, 31 янв. 2021

tac
> не парься, не наследуй от него ...
О, пасиб.

А делать в Unity или можно просто C# проект в Visual Studio?
Ща поем чего-нибудь и буду делать.

#340
(Правка: 16:33) 16:32, 31 янв. 2021

я уже предлагал (для более чистого теста), только прейдется Vector3 объявить, достаточно просто структуру с x,y, z
tac
> лучше VS консольный проект

#341
(Правка: 18:18) 17:56, 31 янв. 2021

И да, я надеюсь ты будешь правильно сравнивать, эту мою версию со своим BSON, а бинарную версию я тебе напишу в начале недели, и вот ее сравнишь со своей бинарной ... сегодня занят ...

впрочем

    public void ToBin()
    {
        BinaryWriter bw = new BinaryWriter(File.Open("test.bin", FileMode.Create));

        bw.Write<string>(Tag); bw.Write("\n");
        bw.Write<Vector3>(MainPosition); bw.Write("\n"); ;
        for (int i = 0; i < Angles.Count; i++)
        {
            bw.Write<Vector3>(Angles[i].Value);
        }
        bw.Write("\n");
        foreach (KeyValuePair<string, List<int>> item in History)
        {
            bw.Write<string>(item.Key);
            for (int i = 0; i < item.Value.Count; i++)
            {
                bw.Write<int>(item.Value[i]);
            }
            bw.Write("\n");
        }
    }


static class Vector3Ext
{
    public static void Write<T>(this BinaryWriter bw, T argValue)
    {
        if (typeof(T) == typeof(Vector3))
        {
            Vector3 locVector3 = (argValue as Vector3?).Value;
            bw.Write(locVector3.x); bw.Write(";");
            bw.Write(locVector3.y); bw.Write(";");
            bw.Write(locVector3.z); bw.Write(";");
        }
        else
        {
            bw.Write(argValue); bw.Write(";");
        }
    }

}

чуешь пахнет жареным? :)

#342
20:49, 31 янв. 2021

tac
> И да, я надеюсь ты будешь правильно сравнивать, эту мою версию со своим BSON
BSON это и есть бинарный формат. Я уже устал повторять. До тебя до сих пор не доходит? Мой сериализатор ВСЕГДА работает в бинарном формате. Объекты переводятся сразу в бинарный формат и только так. А уже потом, если мы захотим, то бинарный формат можно опционально превратить в текстовый. Текстовый нужен во время разработки, чтобы файлы мёржились и их можно было просматривать. При чтении, соответсвенно, идёт в обратном порядке: сначала текст переводится в бинарный BSON, а затем он читается бинарно.

> а бинарную версию я тебе напишу в начале недели, и вот ее сравнишь со своей бинарной
Ой, ясно всё. Ты не мужик. Страницу назад я тебе сказал, что "у нас для сейвов используется кастомный бинарный формат MessagePack" и также сказал, что надо быть дибилом, чтобы использовать текстовый формат для сейвов, потому что "текстовые медленные форматы не подходят для сейвов".

Что ты мне тогда ответил? Ты сказал, что это значения не имеет:

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

И стал показывать мне пример с текстом конкатенацией и говорить, что:

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

Напоминаю, что мы говорили про сейвы. И я несколько раз указал тебе на то, что мои сейвы сохраняются бинарно и работают очень быстро. Ты какого-то фига упирался и сочинял басни, про то, что твой гавнокод со строками быстрее. Видимо, не думал, что я могу тест написать, да? Как только до дела дошло, и я уже начал тест набрасывать, то ты сразу внезапно прозрел. Теперь ты согласен, что только дибил будет сохранять данные в текстовый формат, если у тебя тысячи объектов, да? А что ж ты мне 3 часа назад показывал пример с текстовой сериализацией? Ты же говорил, что это хорошее оптимальное решение.

И что же это получается, если тебе надо какие-то ресурсы сохранять быстро, например, сотни диалогов, то ты для них напишешь бинарную функцию загрузки и сохранения, так? Но ведь во время разработки хочется иметь текстовый формат, чтобы можно было мержить изменения. Что же делать? Напишешь ещё две фунции SaveAsText и LoadAsText, да? И так для каждого класса, господи, помилуй.

А хочешь — больше? Окончательно взорву тебе мозг. Мне пользователи могут прислать сейв (естественно, бинарный), а я могу его сконвертировать в текст и посмотреть содержимое. Мы этим даже пользуемся периодически. Более того, я могу в тексте поменять имя профиля игрока, сконвертировать обратно в бинарный формат, и он корректно запустится у пользователя. Причём неважно, от какой версии сейв. Даже если там устаревшая несовместимая версия, я всё равно могу его сконвертировать в текст и успешно посмотреть/отредактировать значения полей, которые были удалены из проекта год назад. Потому что мне не нужно для этого вообще открывать Unity и превращать сейв в реальные объекты и префабы. Я сразу напрямую конвертирую текст в бинарное представление и обратно.
Чтобы тебе реализовать хоть что-то похожее, тебе придётся заводить ещё по паре функций TextToBinary и BinaryToText для каждого класса в проекте, господи, помилуй.

А мне в моём решение вообще не надо писать функций сохранения и загрузки. Даже не по 2, а вообще ни одной не надо.

> чуешь пахнет жареным? :)
О да, так у тебя будет действительно сопоставимая производительность с моей сериализацией. Но знаешь, в чём будет разница? В том, что мой "уродливый велосипед выглядит" так:

+ Показать

И всё. Этого достаточно, чтобы можно было сериализовать объект бинарно для релиза и в текст во время разработки.

А твой код выглядит так:

+ Показать

И он может сохранять только в текст (ну или только в бинарный вариант, если ты закончишь свой пример). А сможешь переписать класс так, чтобы он и так и так мог? Это, что же, 120 строк получится против моих 4? И так с каждым классом?

А теперь ещё смотри. Я беру и меняю тип History с int на float:

+ Показать

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

А теперь поменяй List<int> на List<float> у себя. И не потеряй при этом возможность загрузки старых сейвов. Чуешь в какую кашу у тебя всё превращаешься? Напиши, не стесняйся.

Дальше — больше. В твоём примере гавнокод со switch'ем (i == 0, i == 1 и так далее). В таком духе и будешь писать, если у тебя 30 полей, например? Сколько у тебя уйдёт времени, чтобы это написать и отладить, пока я просто добавил несколько атрибутов?
Если твой проект будет больше, чем сурвайвл с тремя деревьями и двумя бомжами, то рано или поздно ты захочешь автоматизировать хотя бы часть работы, и чтобы можно было удалять/добавлять/переставлять местами поля без необходимости менять кучу мест в коде. И в этот момент твой интеллектуальный уровень дорастёт хотя бы до функционала Unity-сериализации и ты станешь, как и они, привязываться к именам полей. Ты будешь писать в сейв имена полей, чтобы потом читать и принимать решение, какие поля заполнять. И вот как только ты это сделаешь, ты увидишь, что вся твоя производительность исчезла, как не было. Ты снова всрёшь моей сериализации. Которая по скорости сопоставима с ручной записью в стрим, но по гибкости, удобности и автоматизации опережает тебя на две головы.

#343
20:49, 31 янв. 2021

В общем, ты не мужик.

Начали с того, что ты меня учил базам данным, мол всякий, кто БД не использует, её просто не осилил.
Когда я тебя просвятил насчёт системы контроля версий и того, как работают в настоящих студиях; ты наврал с три короба, будто эти проблемы легко решаются SQL-скриптами, хотя их даже в Naugty Dog не смогли решить. Как я ни пытался добиться, чтобы ты слова свои подтвердил, что конфликты в БД легко мержатся, ты упорно игнорил и переводил тему. Потому что не мужик.

Разбирая примеры моей сериализации (которая не нужна с твоих слов, потому что есть БД), ты почему-то со своей стороны не стал приводить пример с БД, сославшись, что для простых сейвов БД это дорого, а стал показывать пример с ручными сохранениями. Ручные сохранения — это хоть и примитивная, но сериализация. Которую ещё 5 минут назад до этого ты критиковал. Переобулся, потому что не мужик.

При этом ты заявлял, что твоя ручная сериализация быстрее моей "со всеми оптимизациями". Хотя самая первая и очевидная оптимизация, про которую было сказано несколько раз — это бинарный формат записи. Но ты всё равно привёл в пример текстовую сериализацию (причём с конкатенацией через "+", что вообще нонсенс для производительности) и сказал, что это всё равно быстрее, чем у меня "со всеми оптимизациями". И всячески игнорировал мои аргументы про бинарность с подробными объяснениями, почему это быстрее текста.

И вот, когда я уже начал писать тест и запахло жареным, ты спохватился и заявил, что вообще-то ты тоже за бинарную сериализацию. Которую 5 минут назад отрицал, как принципиально важный момент. Переобулся, потому что не мужик.

Мы пришли к тому, что сторонник БД и противник кастомных сериализаций, особенно хитрых бинарных решений, в которых не пишутся имена; показывает мне пример кастомной бинарной сериализации, в которой не записывает имена. Только не хитрой и автоматической, а тупо ручной в виде длинющих портянок; без какого-либо переиспользования кода; и без какой-либо версионности и дальнейшей поддержки.

В общем, эта клоунада мне надоела. Настоящим сообщаю, что я окончательно убедился, что ты второй Jimnik, и с этого момента к твоим постам минимум толерантности. Если я увижу, что ты где-то поучительным тоном пишешь вредную чушь под видом экспертного мнения и советов, это всё будет удаляться.

#344
20:55, 31 янв. 2021

Alprog
что обосрался? а где же тесты? я все еще жду :)

Страницы: 122 23 24 2528 Следующая »
Инди-ЮнитиФорум

Тема закрыта.