使用 QHash 和 QList 提高性能

Posted

技术标签:

【中文标题】使用 QHash 和 QList 提高性能【英文标题】:Improving performance using QHash and QList 【发布时间】:2013-06-13 00:53:31 【问题描述】:

我正在使用这些类:

QHash: 表示场景的所有对象(不能修改这个类)

QList: 显示所有选中的对象。它包含ID(另存为int

//DrawSelectedObjects()

QHash<QString, SceneObject*>& hash=sc->getObj();
QList<int> tempList = HitsList;

int counter =0;

for (QHash<QString,SceneObject*>::ConstIterator i = hash.begin();i!=hash.end();++i) 

     if (tempList.startsWith(counter)) 
            .
            Draw_as_selected()
            .
            tempList.removeOne(counter);
     


因此,例如,如果我选择对象 #77,则其 ID 保存在 Hitslist (QList) 中。

之后,HitsList 被排序,DrawSelectedObjects() 被调用。

它必须迭代 QHash 直到 counter=77Draw_as_selected()。之后,QList 的第一个元素被移除,将第二个元素拉到前面。

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

您能建议我一种更有效的方法吗?任何帮助将不胜感激。

编辑:

感谢您的回复。问题是我无法摆脱 QList&lt;int&gt;(我只能将整数推送到 OpenGL 选择堆栈的顶部)。

因此,上述解决方案的另一种方法是为QHash 的每个元素执行QString.toInt() 并将它们保存到QList&lt;int&gt;

事实是...如何使用QList 上的int(现在通过从QString 转换计算,不再来自计数器)在哈希上找出正确的QString

【问题讨论】:

【参考方案1】:

如果您访问散列中的对象的方式是使用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 中。事实是......如何使用 QList 上的 int(现在通过从 QString 转换,不再从计数器计算)在哈希上找出正确的 QString? @nicolagenesin 好的,我看到了你的问题。那么,除了QHash&lt;QString, SO*&gt; 之外,唯一计算效率高的解决方案是在内存中保留QHash&lt;int, QString&gt; stringFromInt;(或QMap&lt;int,Qstring&gt;)。每次创建对象时,都会执行stringFromInt[myObject-&gt;name()] = myObject-&gt;id();。如果你不能改变你的初始哈希表:最好是直接有一个QHash&lt;int, SO*&gt;。最后一条建议:OpenGL 内置选择机制非常缓慢且已弃用。我过去使用它,但现在为此使用我自己的着色器(或者如果可行的话在 CPU 中进行)。 谢谢,这就是我的想法,但我认为它“非常可怕”。事实上,由于旧的 gl 限制,我讨厌改变架构。从 GL_SELECT 机制升级到着色器?有什么好的教程可以链接到我吗? @nicolagenesin 是的 - 太可怕了 ;-) 但是如果你不想或不能改变原来的 QHash,那么你别无选择:-/ 注意无论选择机制如何,您都会遇到相同的问题,因为它可能是基于 int 的(您只能将 QString 与 CPU 选择一起使用,但即便如此,我更喜欢 int,强制执行唯一 ID 比执行唯一名称要简单得多)。 “从 GL_SELECT 机制升级到着色器机制很难吗?”是的。最糟糕的是,我还没有找到一个很好的教程。如果你现在正在工作,并且你不能花时间转移到基于 GPU 着色器的拾取上,最好不要碰它。请注意,Blender 仍然使用 GL_SELECT,这有点可惜。

以上是关于使用 QHash 和 QList 提高性能的主要内容,如果未能解决你的问题,请参考以下文章

有效提高ThinkPHP的应用性能的几点建议

怎么提高电脑内存的性能及使用效率都有哪些方法

使用 libevent 和 libev 提高网络应用性能

java中大量数据如何提高性能?

通过使用公共变量来提高性能?

JAVA进阶:提高SQL性能的几种方法