OpenGL - точки построения из внешнего файла

AM пытается нанести несколько точек из CSV-файла. Поскольку размер файла большой (> 2 ГБ), загрузка содержимого файла в вектор std::vector<std::vector<std::string> >parsedCsv вызвала исключение нехватки памяти.

Поэтому я подумал, что вместо того, чтобы читать файл в вектор, а затем строить его, можно построить его непосредственно из CSV. Ищу некоторые модификации ниже на glVertex3f(x,y,z)

    std::ifstream  data("D:\\Files\\Dummy2.csv");
    std::string line;
    while (std::getline(data, line))
    {
        std::stringstream lineStream(line);
        std::string cell;
        std::vector<std::string> parsedRow;
        while (std::getline(lineStream, cell, ','))
        {
            glBegin(GL_POINTS);
            glColor3f(0.0f, 1.0f, 1.0f);
            glVertex3f(----how to represent the points--?)
            glEnd();
        }

Файл CSV уже имеет нужный формат:

x1,y1,z1    
x2,y2,z2    
x3,y3,z3    
-------
----
--  

Какие-либо предложения ?


person Sid133    schedule 19.12.2019    source источник
comment
Небольшое примечание: этот способ работы требует одного считывания всего файла на каждый отрендеренный кадр. Если вы собираетесь добавить масштабирование/панорамирование/ ЧТО-НИБУДЬ в программу, вам нужно либо перечитать файл, либо загрузить точки в GPU с помощью VBO.   -  person Botje    schedule 19.12.2019


Ответы (1)


Вы можете использовать stof для преобразования строковых значений в числа с плавающей запятой. Переместите номера ячеек в vector. Компоненты координаты вершины хранятся в vector и могут быть отображены с помощью glVertex3fv:

std::ifstream data("D:\\Files\\Dummy2.csv");
std::string line;
while (std::getline(data, line))
{
    std::stringstream lineStream(line);

    std::string cell;
    std::vector<float> parsedRow;
    while (std::getline(lineStream, cell, ','))
        parsedRow.push_back(std::stof(cell));

    if (parsedRow.size() == 3)
    {
        glBegin(GL_POINTS);
        glColor3f(0.0f, 1.0f, 1.0f);
        glVertex3fv(parsedRow.data());
        glEnd();
    }
}

Обратите внимание: если stof не может выполнить преобразование, возникает исключение недопустимого аргумента.

person Rabbid76    schedule 19.12.2019
comment
Будут ли все данные храниться в векторе?. потому что я использовал тот же метод, но только для данных меньшего размера. - person Sid133; 19.12.2019
comment
@ Sid133 Нет, вектор содержит только 1 точку (данные 1 строки). При чтении следующей строки данные предыдущей строки теряются. Примечание parsedRow — это локальная переменная в области блока внешнего цикла. - person Rabbid76; 19.12.2019
comment
Для файла размером 1,7 МБ из 57600 точек загрузка занимает около 8 секунд. Рендеринг OpenGL занимает всего одну секунду, но чтение из внешнего файла csv происходит медленно. Есть ли более быстрый способ чтения файлов? - person Sid133; 23.12.2019
comment
@ Sid133 Почему вы не читаете содержимое файла в буфер и не рисуете файлы из буфера? 57600 вершин - это не очень много. - person Rabbid76; 23.12.2019
comment
Я понял. Но медлительность, которую я испытываю, связана только с чтением. Чтение в буфер быстрее, чем чтение в вектор? И возможно ли читать внешние файлы непосредственно в буфер вместо использования промежуточного вектора, как здесь stackoverflow.com/a/44687218/ 9304804. Однако я смог немного увеличить скорость после использования fscanf, а не getline if (FILE *fp = fopen(fileName, "r")) { while (fscanf(fp, "%f,%f,%f", &x, &y, &z) == 3) - person Sid133; 27.12.2019