Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Парсинг текстового файла без напряга для GC и без unsafe (4 стр)

Парсинг текстового файла без напряга для GC и без unsafe (4 стр)

Страницы: 13 4 5 616 Следующая »
MrShoorУчастникwww7 мар. 201811:12#45
Polyflow3d
Вообще классика - это распилить весь текст на токены (типа string.split).
Поскольку ты хочешь без аллокаций, то для твоего случая можно каждый токен представить как структуру:
struct StrToken 
{
  srting src; //ссылка на всю строку
  int start; //индекс символа с которого начинается токен
  int end;  //индекс первого символа после токена
}
ну и дальше в этой структуре перегружаешь ==, реализуешь TryToFloat(), TryToInt(). Сюда же можно добавить метод, который инициализирует токен из подстроки со смещением. Итого имеем что-то в духе:
struct StrToken
{
  srting src;
  int start;
  int end;
  public static bool operator == (StrToken token, string s)
  {
    if (s.Length != (token.end - token.start)) return false;
    int j = 0;
    for (int i = token.start; i < token.end; i++)
    {
      if (s[j] != token.src[i]) return false;
      j++;
    }
    return true;
  }
  public bool TryToFloat(out float result)
  {
    //todo
  }
  public bool TryToInt(out int result)
  {
    //todo
  }
  private static bool IsTokenSeparator(char ch)
  {
    return (ch == ' ') || (ch == (char)10) || (ch == (char)13);
  }
  public static StrToken CutToken(string src, ref int seek)
  {
    StrToken result;
    result.src = src;
    result.start = -1;
    result.end = -1;
    while(seek < src.Length)
    {
      if (IsTokenSeparator(src[seek]))
      {
        if (result.start < 0) result.start = seek;
        if (result.end > result.start) return result;
      }
      else
      {
        if (result.start >= 0) result.end = seek;
      }
      seek++;
    }
    return result;
  }
}

Правка: 7 мар. 2018 12:02

FlyOfFlyПостоялецwww7 мар. 201811:13#46
MrShoor
>
> Вообще классика - это распилить весь текст на токены (типа string.split).
> Поскольку ты хочешь без аллокаций, то для твоего случая можно каждый токен
> представить как структуру:
а string ?
MrShoorУчастникwww7 мар. 201811:13#47
FlyOfFly
> а string ?
Что стринг?
FlyOfFlyПостоялецwww7 мар. 201811:17#48
MrShoor
>
> Что стринг?
MrShoor
>
> srting src; //ссылка на всю строку
string
Он же тоже влияет на GC
MrShoorУчастникwww7 мар. 201811:18#49
FlyOfFly
> Он же тоже влияет на GC
Так это один раз при загрузке, а дальше то аллокаций нет.
*Lain*Постоялецwww7 мар. 201811:19#50
MrShoor
Структуры аллоцируется))) надо их аллоцировать в List<StrToken> и это разгрузит сборщик мусора. Только не юзайте класс вместо структуры
FlyOfFlyПостоялецwww7 мар. 201811:20#51
MrShoor
>
> Так это один раз при загрузке, а дальше то аллокаций нет.
Ну. я как понял, ему вообще не надо, даже при загрузки
*Lain*Постоялецwww7 мар. 201811:22#52
Ну и помните что шарповая стринга копируется и переалоцируется при любой записи, поэтому не делайте так. Лучше StringBuilder или List чаров
MrShoorУчастникwww7 мар. 201811:27#53
FlyOfFly
> Ну. я как понял, ему вообще не надо, даже при загрузки
Ему надо:
без напряга для GC и без unsafe
Так что сделать 2 аллокации на старте вполне нормально будет.

*Lain*
>Структуры аллоцируется))) надо их аллоцировать в List<StrToken> и это разгрузит сборщик мусора. Только не юзайте класс вместо структуры
Структуры это же велью типы. Они сразу на стеке выделяются. Ну и само собой можно List выделить на куче.

> Ну и помните что шарповая стринга копируется и переалоцируется при любой
> записи, поэтому не делайте так. Лучше StringBuilder или List чаров
Где ты там запись увидел?

*Lain*Постоялецwww7 мар. 201811:33#54
MrShoor
Не, записи тут нет. Просто гц оптимизации же в треде обсуждаем.

> можно List выделить на куче.
Когда будешь давать ссылку на структуру в листе - не будет ли боксинга? Надо будет почитать...

Правка: 7 мар. 2018 11:34

MrShoorУчастникwww7 мар. 201811:36#55
*Lain*
> Когда будешь давать ссылку на структуру в листе - не будет ли боксинга?
Это не ссылка, а данные. Value тип же. Боксинг будет, если со структурой начать творить всякую непотребщину, типа навесить реализацию интерфейса, и хранить в List-е интерфейсы. В текущем виде боксинга не будет.
Polyflow3dПостоялецwww7 мар. 201812:18#56
FlyOfFly
Чувак с самого начала пишет про С# и obj файлы. Ему предлагают написать компилятор и дают код на C++ или предлагают assimp.
А по теме: Никак

да походу так и есть.
Даже просто чтение всех строк обжа (размером 600кб)  срёт в GC на 1.5м.
И это без парсинга строк, просто чтение.

Теоретически, наверное можно написать свою читалку текстовых файлов  но я не настолько красноглазик..

Вообще прикольная реакция.
Я тут недавно пытался обсудить новый(относительно) модный alembic формат - в ответ тишина полная.
Обсуждаю obj - в ответ: "зачем ты старое ущербное гавно для инвалидов ковыряешь?"

Правка: 7 мар. 2018 12:21

FlyOfFlyПостоялецwww7 мар. 201812:18#57
MrShoor
>
> Ему надо:
> без напряга для GC и без unsafe
> Так что сделать 2 аллокации на старте вполне нормально будет.
Ну, с этим спорить не буду
Polyflow3dПостоялецwww7 мар. 201812:21#58
Кстати, вот скажите мне, (те кто задает вопрос "ЗАЧЕМ") :

Вкорячивать в свой движек скритповый язык что бы писать код в рантайме - это нормально.
А загружать артовые ресурсы в рантайме - это дикая причуда.
Да?

FlyOfFlyПостоялецwww7 мар. 201812:35#59
Polyflow3d
>
> Вкорячивать в свой движек скритповый язык что бы писать код в рантайме - это
> нормально.
> А загружать артовые ресурсы в рантайме - это дикая причуда.
> Да?

А этим разве Resources.LoadAsync не занимается?

Страницы: 13 4 5 616 Следующая »

/ Форум / Программирование игр / Общее

2001—2018 © GameDev.ru — Разработка игр