Java 高效合并交叉索引数据

Java 高效合并交叉索引数据,java,opengl,collada,Java,Opengl,Collada,和前面的问题一样,我从索引交错的格式(COLLADA)加载了一些顶点和索引数据。答案建议使用缓冲区纹理,但也警告了渲染性能的损失,我希望避免这种损失。 因此,问题是将所有交叉索引和顶点数据合并到多个VBO和一个索引缓冲区中。 数据是这样给出的 P N P N P N P N P N P N ... 0 0 1 0 2 0 7 1 6 1 5 1 ... 其中,每个p表示一个位置,每个N表示一个法向量 解决此问题的一种方法是跟踪列表中的所有元组(在本例中为两个元组)。如果我读取下一个元组,我会在

和前面的问题一样,我从索引交错的格式(
COLLADA
)加载了一些顶点和索引数据。答案建议使用缓冲区纹理,但也警告了渲染性能的损失,我希望避免这种损失。
因此,问题是将所有交叉索引和顶点数据合并到多个
VBO
和一个索引缓冲区中。
数据是这样给出的

P N P N P N P N P N P N ...
0 0 1 0 2 0 7 1 6 1 5 1 ...
其中,每个
p
表示一个位置,每个
N
表示一个法向量

解决此问题的一种方法是跟踪列表中的所有元组(在本例中为两个元组)。如果我读取下一个元组,我会在列表中搜索这个元组,如果它存在,我会使用这个位置作为新的索引数据,如果它不存在,我会构造一个新的顶点并将元组放在列表中。
当然,这非常慢,因为它包括将这些元组与每个现有元组进行比较

有没有更有效的方法来实现这一点?

我编写了一个名为“可以做你想做的事情”的工具

用于执行所需操作的过滤器称为
标准化索引

  --normalize_indices   Goes through all triangle sets, changing all index
                        values to go from 1 to N, replacing sources to be size
                        N
但是,它通常也与其他一些过滤器配合使用效果最好。我建议您尝试以下方式:

meshtool --load_collada yourfile.dae --medium_optimizations \
    --normalize_indices --save_collada yourfile-optimized.dae
您可以通过以下方式安装它:

pip install meshtool

所以真正慢的部分是在列表中搜索-所以不要这样做。在这种情况下,使用哈希表将大大加快速度-我实际上已经实现了类似的一些功能,而且效果非常好-只要您能够为哈希表提供额外的内存。

内存根本不应该是个问题-我将尝试一下:)正如@derhass在下面的回答中所建议的,使用比列表更有效的数据结构。我在这里的回答中发布了一些伪代码:。