在尝试解析wavefront .obj文件时,我想到了两种方法:
海事组织,选项1将是非常内存密集型,但要快得多。因为选项2涉及到广泛的文件读取(而且大多数对象中的顶点数量变得非常大),这会慢得多,但内存密集型要小得多。
问题是:比较内存和速度之间的权衡,哪种选择更适合于普通计算机?还有另一种方法吗?
我计划使用OpenGL和GLFW来呈现对象。
发布于 2011-10-17 15:57:11
海事组织,选项1将是非常内存密集型,但要快得多。
无论如何,你必须把这些顶点记在记忆里。但是没有必要使用2D数组,BTW会导致两个指针的不方向,因此性能受到很大的影响。只需为您的数据使用一个简单的std::vector<Vertex>,矢量索引就是所附人脸列表的索引。
由于注释而进行编辑
class Vertex
{
union { struct { float x, y, z }; float pos[3] };
union { struct { float nx, ny, nz }; float normal[3] };
union { struct { float s, t }; float pos[2] };
Vertex &operator=();
}
std::vector<Vertex>;发布于 2011-10-17 15:41:21
通常,您会将顶点列表读入数组。解析ASCII文本非常慢;加载文件时只解析一次,然后将所有内容存储在内存中。
三角形/面孔也是如此。每个三角形通常由三个顶点索引组成。也应该存储在数组中。
您可能会发现VTK开源库中的OBJ阅读器是有用的:http://www.vtk.org/doc/nightly/html/classvtkOBJReader.html。我们用它而没有理由写我们自己的..。直接使用VTK,否则您可能会发现学习源代码有助于进一步启发您自己的读者。
在我看来,OBJ文件的主要缺点之一是ASCII的使用。3D ASCII文件(无论是STL、PLY、OBJ等)由于字符串解析,如果它们是ASCII,则加载非常慢。二进制格式文件的速度要快得多,如果性能有问题,应该始终使用:良好二进制格式的加载时间是瞬时的。
发布于 2011-10-17 16:42:56
只是将它们加载到数组中。记忆不应该是一个问题。你的系统(通常)比你的GPU有更多的内存。如果您遇到内存问题,您可能正在加载一个过于详细的模型。(我半假设你要在OpenGL上做游戏。)如果您对这样大的模型文件有特定的需求,您仍然需要想出一种方法来加载适当的块。)
https://stackoverflow.com/questions/7795995
复制相似问题