C++ 使用QHash和QList提高性能

C++ 使用QHash和QList提高性能,c++,performance,qt,qlist,qhash,C++,Performance,Qt,Qlist,Qhash,我正在使用这些类: QHash:重新呈现场景的所有对象无法修改此类 QList:重新呈现所有选定对象。它包含保存为int的id 因此,例如,如果我选择对象77,它的ID将保存在Hitslist QList中 之后,HitsList被排序,DrawSelectedObject被调用 它必须迭代QHash,直到counter=77,并将_绘制为选中的_。然后,删除QList的第一个元素,将第二个元素拉到前面 每次选择一个对象时都会调用此函数。对于小的导入场景,这一切都没问题,但是当我使用大于10MB

我正在使用这些类:

QHash:重新呈现场景的所有对象无法修改此类

QList:重新呈现所有选定对象。它包含保存为int的id

因此,例如,如果我选择对象77,它的ID将保存在Hitslist QList中

之后,HitsList被排序,DrawSelectedObject被调用

它必须迭代QHash,直到counter=77,并将_绘制为选中的_。然后,删除QList的第一个元素,将第二个元素拉到前面

每次选择一个对象时都会调用此函数。对于小的导入场景,这一切都没问题,但是当我使用大于10MB的文件时,我可以看到一些明显的输出延迟,因为我正在迭代一个巨大的QHash

你能给我一个更有效的方法吗?任何帮助都将不胜感激

编辑:


谢谢你的回复。问题是我无法摆脱QList iI只能在OpenGL选择堆栈上推整数的问题

因此,上述解决方案的另一种方法是对QHash的每个元素执行QString.toInt,并将它们保存到QList中


事实是……如何使用从QString(不再是从QList上的计数器)转换而来的int计算出哈希上正确的QString?

如果您访问哈希中对象的方式是使用QString,我猜是对象的名称,而不是其ID,那么您还应该使用QString列表来存储所选对象

QHash<QString, SceneObject*> & hash = getAllObjects();
QList<QString> & tempList = getSelectedObjects();

foreach(QString name, tempList)
    hash[name]->drawAsSelected(); // or drawAsSelected(hash[name]) depending on your design

谢谢你的回复。问题是我无法摆脱QList,我只能在OpenGL选择堆栈上推整数。因此,上述解决方案的另一种方法是对Qhash的每个元素执行QString.toInt,并将它们保存到QList中。事实是……如何使用从QString转换而来的int计算出哈希上正确的QString,而不是从QList上的计数器中计算出来?@nicolagenesin好的,我看到了你的问题。然后,除了QHash之外,唯一计算效率高的解决方案是在内存中保留QHash stringFromInt;或QMap。每次创建对象时,都要执行stringFromInt[myObject->name]=myObject->id;。如果您无法更改初始哈希表,那么最好是直接使用QHash。最后一点建议:OpenGL内置的选择机制非常慢,不推荐使用。我以前用过,但现在用我自己的着色器,如果可行的话,也可以用CPU来实现。谢谢,这就是我的想法,但我认为它相当可怕。事实上,我讨厌改变架构,因为旧的gl限制。从gl_选择机制升级到着色器机制是否困难?你知道有什么好的教程可以链接到我吗?@nicolagenesin是的,它很可怕;-但如果您不想或无法更改原始QHash,那么您别无选择:-/请注意,无论选取机制如何,您都会遇到相同的问题,因为它可能是基于int的,您只能在CPU选取时使用QString,但即使如此,我还是更喜欢int,强制唯一ID比强制唯一名称简单得多。从GL_选择机制升级到着色器机制是否困难?对最糟糕的是,我还没有找到一个很好的教程。如果您的正在工作,并且您不能花时间移动到基于GPU着色器的拾取,最好不要触摸它。请注意,Blender仍然使用GL_SELECT,这有点遗憾。
QHash<QString, SceneObject*> & hash = getAllObjects();
QList<QString> & tempList = getSelectedObjects();

foreach(QString name, tempList)
    hash[name]->drawAsSelected(); // or drawAsSelected(hash[name]) depending on your design