【问题标题】:OpenGL - Plotting Points from external fileOpenGL - 从外部文件绘制点
【发布时间】:2020-04-12 02:19:08
【问题描述】:

AM 试图从 CSV 文件中绘制一些点。由于文件很大(>2GB),将文件内容加载到向量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    
-------
----
--  

有什么建议吗?

【问题讨论】:

  • 小提示:这种工作方式需要每渲染一帧通读整个文件。如果您打算在程序中添加缩放/平移/任何内容,您将需要重新读取文件或使用 VBO 将点上传到 GPU。

标签: c++ opengl visual-c++ freeglut opengl-compat


【解决方案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 无法进行转换,则会抛出无效参数异常。

【讨论】:

  • 是否将整个数据存储在向量中?因为我一直在使用相同的方法,但仅适用于较小的数据。
  • @Sid133 不,向量只包含 1 个点(1 行的数据)。当读取下一行时,前一行的数据就丢失了。注意parsedRow是外循环块范围内的局部变量。
  • 对于 57600 点的 1.7Mb 文件,加载大约需要 8 秒。OpenGL 渲染只需一秒,但从外部 csv 文件读取速度很慢。有没有更快的读取文件的方法?
  • @Sid133 为什么不将文件内容读取到缓冲区并从缓冲区中提取文件? 57600个顶点不是很多。
  • 我明白了。但是我正在经历的缓慢只是阅读。读取缓冲区是否比读取向量快?是否可以直接将外部文件读取到缓冲区,而不是像stackoverflow.com/a/44687218/9304804 那样在两者之间使用向量。但是,在使用 fscanf 而不是 getline if (FILE *fp = fopen(fileName, "r")) { while (fscanf(fp, "%f,%f,%f", &amp;x, &amp;y, &amp;z) == 3) 之后,我能够稍微提高速度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多