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

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

Страницы: 1 2 3 416 Следующая »
ZabПостоялецwww6 мар. 201812:48#15
Пусть сам выбирает как ему парсить, наивно или по науке. Мое дело проинформировать как можно. Если по науке - сложность разбираемого файла не ограничена. Уметь надо, а применять ли в конкретном случае - в этом случае и решать.
DampireУчастникwww6 мар. 201812:48#16
Polyflow3d
> уже есть, сейчас нужно сделать его быстрым и без нагрузки на GC.
Если ты собираешься парсить тект, то без нагрузки на GC только посимвольное чтение. Вперед и с песней. В любом другом случае, извини, но строка reference тип.
Polyflow3dПостоялецwww6 мар. 201812:51#17
Dampire
Если ты собираешься парсить тект, то без нагрузки на GC только посимвольное чтение. Вперед и с песней.

да вообще ни вопрос. Просто велосипедить все с нуля не хочется , может есть че нибудь от чего можно оттолнуться

КлапауцийПостоялецwww6 мар. 201812:57#18
Polyflow3d
> импорт моделей в рантайм

Polyflow3d
> сделать его быстрым и без нагрузки

и при этом парсить текстовик?

конверти в бинарник и будет тебе быстро и без нагрузки.

и на всякий случай:
https://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tu… rial_Load_OBJ

DampireУчастникwww6 мар. 201813:02#19
Клапауций
Не катит. Даже BinaryFormatter задевает чувства GC.
Polyflow3dПостоялецwww6 мар. 201813:03#20

Мне уже тут посоветывали
1)поучится писать компиляторы,
2)сменить язык програмирования,
3)сменить формат.
 
КлапауцийПостоялецwww6 мар. 201813:10#21
Polyflow3d
> 2)сменить язык програмирования,
крестохейтеры хотят избавиться от GC?
:LOL
Polyflow3dПостоялецwww6 мар. 201813:19#22
Ладно. Давайте так:
Есть char[]
Как из него достать число?

Zab раскажи, как это сделать по науке?

КлапауцийПостоялецwww6 мар. 201813:25#23
Dampire
> Не катит. Даже BinaryFormatter задевает чувства GC.
что мешает один раз аллоцировать память и грузить туда разные обжи>>>.bin???
bagaПостоялецwww6 мар. 201813:46#24
собрался парсить в hard realtime что GC так напрягает? lol
FordPerfectПостоялецwww6 мар. 201814:45#25
Polyflow3d
> Есть char[]
> Как из него достать число?
Если нужно точно, так без выделения памяти сложно:
https://gamedev.ru/flame/forum/?id=233556&page=2#m19

Если достатотчно с небольшой погрешностью, так в чём проблема?
Например читаешь посимвольно, обновляешь текущее значение.

Тебе набросать код?

ZabПостоялецwww6 мар. 201814:48#26
Polyflow3d
> Есть char[]
> Как из него достать число?
> Zab раскажи, как это сделать по науке?
Чаще всего числа извлекаются в лексическом анализаторе. В приведенном мной примере это фрагмент:
      default:
        if (!isValueChar(c))
          throw ESyntError( "unexpected char %c(%d)", c, c );

        m_CurLex.Add( c );
        State = ST_VALUE;
        break;
      }
      break;
    case ST_VALUE:
      if (!isValueChar(c))
      {
        UnGetChar();
        State = ST_BEGIN;
        return;
      }

      m_CurLex.Add( c );
      break;

Правка: 6 мар. 2018 14:50

Polyflow3dПостоялецwww6 мар. 201814:50#27
FordPerfect
а откуда возьмется погрешность?
Ну вот например строка
v  9250.5791 1530.8700 -10228.8789
Переводим ее в char[] и дальше парсим.
Покажи как это делается правильно. А то на ум приходит какой то лютый велосипед.
FordPerfectПостоялецwww6 мар. 201815:16#28
Polyflow3d
Как правильно - в статье по ссылке.
Там реально порядком кода.

Кривой код, без проверки ошибок и с погрешностью:

double parse_number(const char *buffer,int &cur)
{
    double result=0.0;
    double multiplier=1.0;
    double sign=1.0;
    int exponent_sign=1;
    int exponent=0;
    bool number_started=false;
    bool fraction_started=false;
    bool exponent_started=false;
    while(true)
    {
        char a=buffer[cur++];
        if(a=='-') {if(exponent_started)  exponent_sign=-1; else sign=-1.0; number_started=true;}
        else if(a=='+') {number_started=true;}
        else if(a=='.') {number_started=true;fraction_started=true;}
        else if(a=='e'||a=='E') {exponent_started=true;}
        else if(a>='0'&&a<='9')
        {
            int b=a-'0';
            if(exponent_started) exponent=10*exponent+b;
            else if(fraction_started) {multiplier/=10.0;result+=double(b)*multiplier;}
            else result=10.0*result+b;
        }
        else if(number_started) break;
    }
    --cur;
    return sign*result*pow(10.0,exponent_sign*exponent);
}

Писал без проверки.

ZabПостоялецwww6 мар. 201815:21#29
FordPerfect
pow применять не надо, она работает через log + exp. Мало того что дорого, так еще и не точно.

Polyflow3d
Незачем самому числа конструировать atof сделает это за тебя скорее всего более эффективно.
Надо только фрагмент строки выделить, где это число живет.

Страницы: 1 2 3 416 Следующая »

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

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