Оптимизация большого количества данных

Программирование на Юнити.

Оптимизация большого количества данных

Сообщение alitanar 08 дек 2019, 16:02

Всем привет, у меня возникла проблема.
Пытаюсь сделать планету состоящую из гексовых ячеек. При этом данные для каждой ячейки уже есть в json. Так вот - каким образом мне это все загрузить. Просто на данный момент, получается что у меня из json загружаются Vector3 позиции для каждой точки каждого гекса. Но юнити просто отказывается загружать такое кол-во (около 30000 Vector3). Как это обойти? Или вообще не надо загружать в отдельный массив, а сразу назначать позиции мешу? Как это все делается?
Буду рад любой помощи!
alitanar
UNец
 
Сообщения: 9
Зарегистрирован: 08 дек 2019, 15:56

Re: Оптимизация большого количества данных

Сообщение 1max1 08 дек 2019, 16:15

Но юнити просто отказывается загружать такое кол-во

Что это значит?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Оптимизация большого количества данных

Сообщение alitanar 08 дек 2019, 16:40

1max1 писал(а):
Но юнити просто отказывается загружать такое кол-во

Что это значит?


Я создаю массив Vectro3[]. Затем в него из json загружаю все векторы. В json их около 30000, и, следовательно, этот массив становится размерностью примерно 30000. Ну загружая такое количество векторов - юнити просто зависает, пытаясь это сделать. Естественно - такое длительное ожидание пока он всё загрузит (я так ни разу и не дождался) не допустимо, особенно если представить что это будет игра, к примеру, про планеты. Но если использовать json с меньшим количеством векторов - то все загружается.
Вот собственно и появился вопрос: как вообще обычно решается задача построения таких больших планет, полей, поделенных на ячейки - гексы. Отказаться от json я не могу. Так что данные в любом случае придется брать из него. Возможно постепенная загрузка, но планету видно сразу целиком, со стороны и при этом ее еще вращать можно будет. Так вот и непонятно что делать.
alitanar
UNец
 
Сообщения: 9
Зарегистрирован: 08 дек 2019, 15:56

Re: Оптимизация большого количества данных

Сообщение waruiyume 08 дек 2019, 16:46

Какую из бесчисленных реализаций JSON вы используете для загрузки?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Оптимизация большого количества данных

Сообщение 1max1 08 дек 2019, 16:59

На калькуляторе запускаешь?

Синтаксис:
Используется csharp
using UnityEngine;
using System.Diagnostics;

struct SaveData
{
    public Vector3[] positions;
}

class XXX : MonoBehaviour
{
    void Start()
    {
        SaveData sd = new SaveData();
        Stopwatch sw = new Stopwatch();

        for (int q = 0; q <= 100; q += 10)
        {
            sw.Start();

            int size = 1000 * q;
            sd.positions = new Vector3[size];
            for (int i = 0; i < size; ++i)
                sd.positions[i] = Random.insideUnitSphere;

            var json = JsonUtility.ToJson(sd); // в джесон
            sd = JsonUtility.FromJson<SaveData>(json); // из джесона

            sw.Stop();

            print($"Кол-во позиций: {size} Затрачено мс: {sw.ElapsedMilliseconds}");
        }
    }
}

Кол-во позиций: 10000 Затрачено мс: 53
Кол-во позиций: 20000 Затрачено мс: 164
Кол-во позиций: 30000 Затрачено мс: 320
Кол-во позиций: 40000 Затрачено мс: 538
Кол-во позиций: 50000 Затрачено мс: 808
Кол-во позиций: 60000 Затрачено мс: 1128
Кол-во позиций: 70000 Затрачено мс: 1502
Кол-во позиций: 80000 Затрачено мс: 1927
Кол-во позиций: 90000 Затрачено мс: 2410
Кол-во позиций: 100000 Затрачено мс: 2952
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Оптимизация большого количества данных

Сообщение alitanar 08 дек 2019, 17:07

waruiyume писал(а):Какую из бесчисленных реализаций JSON вы используете для загрузки?

Встроенную в юнити по дефолту
alitanar
UNец
 
Сообщения: 9
Зарегистрирован: 08 дек 2019, 15:56

Re: Оптимизация большого количества данных

Сообщение alitanar 08 дек 2019, 17:13

1max1 писал(а):На калькуляторе запускаешь?

Синтаксис:
Используется csharp
using UnityEngine;
using System.Diagnostics;

struct SaveData
{
    public Vector3[] positions;
}

class XXX : MonoBehaviour
{
    void Start()
    {
        SaveData sd = new SaveData();
        Stopwatch sw = new Stopwatch();

        for (int q = 0; q <= 100; q += 10)
        {
            sw.Start();

            int size = 1000 * q;
            sd.positions = new Vector3[size];
            for (int i = 0; i < size; ++i)
                sd.positions[i] = Random.insideUnitSphere;

            var json = JsonUtility.ToJson(sd); // в джесон
            sd = JsonUtility.FromJson<SaveData>(json); // из джесона

            sw.Stop();

            print($"Кол-во позиций: {size} Затрачено мс: {sw.ElapsedMilliseconds}");
        }
    }
}

Кол-во позиций: 10000 Затрачено мс: 53
Кол-во позиций: 20000 Затрачено мс: 164
Кол-во позиций: 30000 Затрачено мс: 320
Кол-во позиций: 40000 Затрачено мс: 538
Кол-во позиций: 50000 Затрачено мс: 808
Кол-во позиций: 60000 Затрачено мс: 1128
Кол-во позиций: 70000 Затрачено мс: 1502
Кол-во позиций: 80000 Затрачено мс: 1927
Кол-во позиций: 90000 Затрачено мс: 2410
Кол-во позиций: 100000 Затрачено мс: 2952



Я же не просто сохраняю - загружаю, там еще происходят операции с правкой json файла, так как он приходит некорректный (ну вроде как).
Вот пример одного поля json. Массив массивов float:
"positions":[[-0.015981, -0.455174, 0.890259], [-0.026143, -0.446387, 0.894458], [-0.022306, -0.435257, 0.900030], [-0.008271, -0.432962, 0.901374], [0.001912, -0.441713, 0.897154], [-0.001959, -0.452797, 0.891611]]
а реализация json из стандартной библиотеки юнити - не поддерживает массивы
alitanar
UNец
 
Сообщения: 9
Зарегистрирован: 08 дек 2019, 15:56

Re: Оптимизация большого количества данных

Сообщение 1max1 08 дек 2019, 17:20

там еще происходят операции с правкой json файла, так как он приходит некорректный (ну вроде как).

В чем некорректность я так и не понял.
Не можешь всунуть чистый массив сразу в джесон? Ну так оберни в структуру как я в примере выше...
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Оптимизация большого количества данных

Сообщение alitanar 08 дек 2019, 20:58

1max1 писал(а):
там еще происходят операции с правкой json файла, так как он приходит некорректный (ну вроде как).

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


Так я обернул, но он не позволяет дальше преобразовать в вектор3 или хотябы в массив трех float.
как мне это:
{"positions":[[-0.015981, -0.455174, 0.890259], [-0.026143, -0.446387, 0.894458], [-0.022306, -0.435257, 0.900030], [-0.008271, -0.432962, 0.901374], [0.001912, -0.441713, 0.897154], [-0.001959, -0.452797, 0.891611]]}
преобразовать в Vector3[]?

Если сделать так, то не работает:
Синтаксис:
Используется csharp
void Awake(){
        string json = "{\"positions\":[[-0.015981, -0.455174, 0.890259], [-0.026143, -0.446387, 0.894458],
                [-0.022306, -0.435257, 0.900030], [-0.008271, -0.432962, 0.901374],
                [0.001912, -0.441713, 0.897154], [-0.001959, -0.452797, 0.891611]]}"
;
        Container c = JsonUtility.FromJson<Container>(json);
        print(c.positions[0]);
}

[System.Serializable]
public struct Container
{
    public Vector3[] positions;
}
 


Вариант с оберткой здесь так же не работает:
Синтаксис:
Используется csharp
void Awake(){
        string json = "{\"positions\":[[-0.015981, -0.455174, 0.890259], [-0.026143, -0.446387, 0.894458],
                [-0.022306, -0.435257, 0.900030], [-0.008271, -0.432962, 0.901374],
                [0.001912, -0.441713, 0.897154], [-0.001959, -0.452797, 0.891611]]}"
;
        Vector3[] arr = JsonHelper.FromJson<Vector3>(str);
        print(arr[0]);
}

public T[] FromJson<T> (string json)
    {
        Wrapper<T> wrap = JsonUtility.FromJson<Wrapper<T>>(json);
        return wrap.Array;
    }

[System.Serializable]
    private class Wrapper<T>{
        public T[] positions;
    }
 


В твоем примере не используется json такого формата - как тот что я написал выше. Если ты попробуешь его таким же образом преобразовать в vector3[] - то не получится.
Лично я не смог найти способ из json вытащить массив массивов адекватным образом. Если ты знаешь - буду премного благодарен.
Ну либо посоветуйте кто-нибудь адекватную либу =)
alitanar
UNец
 
Сообщения: 9
Зарегистрирован: 08 дек 2019, 15:56

Re: Оптимизация большого количества данных

Сообщение 1max1 08 дек 2019, 22:35

https://github.com/JamesNK/Newtonsoft.J ... n120r3.zip

Синтаксис:
Используется csharp
using UnityEngine;
using Newtonsoft.Json;
using System.Collections.Generic;

struct SaveData
{
    public List<float[]> positions;
}

class XXX : MonoBehaviour
{
    void Start()
    {
        string json = "{\"positions\":[[-0.015981, -0.455174, 0.890259]]}";
        var obj = JsonConvert.DeserializeObject<SaveData>(json);
        print(obj.positions[0][0]); // -0.015981  
    }
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Оптимизация большого количества данных

Сообщение alitanar 08 дек 2019, 23:32

1max1 писал(а):https://github.com/JamesNK/Newtonsoft.Json/releases/download/12.0.3/Json120r3.zip

Синтаксис:
Используется csharp
using UnityEngine;
using Newtonsoft.Json;
using System.Collections.Generic;

struct SaveData
{
    public List<float[]> positions;
}

class XXX : MonoBehaviour
{
    void Start()
    {
        string json = "{\"positions\":[[-0.015981, -0.455174, 0.890259]]}";
        var obj = JsonConvert.DeserializeObject<SaveData>(json);
        print(obj.positions[0][0]); // -0.015981  
    }
}


Спасибо большое, я уже разобрался! ^:)^
alitanar
UNец
 
Сообщения: 9
Зарегистрирован: 08 дек 2019, 15:56

Re: Оптимизация большого количества данных

Сообщение jetyb 09 дек 2019, 07:58

Зачем такие большие данные хранить в JSON файле? Это же конвертирование float в строку, раздутый размер файла, и большое время на парсинг при загрузках. Лучше хранить такое в бинарнике или в объектах unity (сцена, префаб, ассет), они в строку float не кодируют.
У меня кстати 2.5 миллиона double векторов в сцене хранятся - и ничего, unity не скрипит.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Оптимизация большого количества данных

Сообщение Jarico 09 дек 2019, 12:12

jetyb писал(а):Зачем такие большие данные хранить в JSON файле? Это же конвертирование float в строку, раздутый размер файла, и большое время на парсинг при загрузках. Лучше хранить такое в бинарнике или в объектах unity (сцена, префаб, ассет), они в строку float не кодируют.
У меня кстати 2.5 миллиона double векторов в сцене хранятся - и ничего, unity не скрипит.



Согласен,но лучше всего написать свой парсер (бинарный) с использованием BinaryReader и BinaryWriter...
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Оптимизация большого количества данных

Сообщение alitanar 09 дек 2019, 13:59

jetyb писал(а):Зачем такие большие данные хранить в JSON файле? Это же конвертирование float в строку, раздутый размер файла, и большое время на парсинг при загрузках. Лучше хранить такое в бинарнике или в объектах unity (сцена, префаб, ассет), они в строку float не кодируют.
У меня кстати 2.5 миллиона double векторов в сцене хранятся - и ничего, unity не скрипит.


Абсолютно согласен, но, это не от меня зависит. =)
alitanar
UNец
 
Сообщения: 9
Зарегистрирован: 08 дек 2019, 15:56

Re: Оптимизация большого количества данных

Сообщение Axil 10 дек 2019, 15:05

Тогда сделай кеширование.
Первый раз прочитай и запиши бинарник в кэш.
Потом смотри на modify time файла json, если он не поменялся - грузи из кэша, а если поменялся, то из json и обновляй кэш.
modify time можно хранить так, заменяя modify time бинарника.
Аватара пользователя
Axil
UNIт
 
Сообщения: 51
Зарегистрирован: 02 окт 2019, 11:26


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11