Повышение производительности с помощью QHash и QList

Я использую эти классы:

QHash: представление всех объектов сцены (невозможно изменить этот класс)

QList: отображение всех выбранных объектов. Он содержит идентификаторы (сохраненные как 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, его идентификатор сохраняется в Hitslist (QList).

После этого сортируется HitsList и вызывается DrawSelectedObjects().

Он должен повторять QHash до counter=77 и Draw_as_selected(). После этого снимается первый элемент QList, вытягивая вперед второй.

Эта функция вызывается КАЖДЫЙ раз при выборе одного объекта. С небольшими импортированными сценами все в порядке, но когда я использую файлы> 10 МБ, я вижу некоторую задержку вывода (это очевидно, потому что я повторяю огромный QHash).

Не могли бы вы предложить мне более эффективный способ сделать это? Любая помощь будет оценена по достоинству.

РЕДАКТИРОВАТЬ:

Спасибо за ваш ответ. Проблема в том, что я не могу избавиться от этого QList<int> (я могу поместить только целые числа поверх стека выбора OpenGL).

Итак, еще один способ из приведенного выше решения - сделать QString.toInt() для каждого элемента QHash и сохранить их в QList<int>.

Дело в том... как узнать правильное QString в хэше, используя int (рассчитывается теперь путем преобразования из QString, а не больше из счетчика) в QList?


person Nicola    schedule 13.06.2013    source источник


Ответы (1)


Если для доступа к объектам в хэше используется QString (я думаю, это «имя» объекта, а не его идентификатор), то вам также следует использовать список 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
person Boris Dalstein    schedule 13.06.2013
comment
Спасибо за ваш ответ. Проблема в том, что я не могу избавиться от этого QList (я могу поместить только целые числа поверх стека выбора OpenGL). Таким образом, еще одним способом из приведенного выше решения является выполнение QString.toInt() для каждого элемента Qhash и сохранение их в QList. Дело в том... как узнать правильную QString в хэше, используя int (вычисляемый теперь путем преобразования из QString, а не больше из счетчика) в QList? - person Nicola; 15.06.2013
comment
@nicolagenesin Хорошо, я вижу вашу проблему. Тогда единственное решение, эффективное с вычислительной точки зрения, состоит в том, чтобы в дополнение к вашему QHash<QString, SO*> хранить в памяти QHash<int, QString> stringFromInt; (или QMap<int,Qstring>). Каждый раз, когда вы создаете объект, вы выполняете stringFromInt[myObject->name()] = myObject->id();. Это если вы не можете изменить свою исходную хэш-таблицу: оптимально, лучше всего иметь непосредственно QHash<int, SO*>. Последний совет: встроенный механизм выбора OpenGL очень медленный и устарел. Я использовал его в прошлом, но теперь использую для этого свои собственные шейдеры (или делаю это на процессоре, если это возможно). - person Boris Dalstein; 15.06.2013
comment
Спасибо, это то, что я думал, но я думаю, что это довольно ужасно. Дело в том, что я ненавижу менять архитектуру из-за старых ограничений gl. Сложно ли перейти с механизма GL_SELECT на механизм шейдеров? знаешь ссылку на меня? - person Nicola; 15.06.2013
comment
@nicolagenesin Да, это -ужасно ;-) Но если вы не хотите или не можете изменить исходный QHash‹QString,SO*›, у вас нет выбора :-/ Обратите внимание, что у вас будет такая же проблема в любом случае механизм выбора, поскольку он, вероятно, будет основан на int (вы можете использовать QString только с выбором ЦП, но даже в этом случае я бы предпочел int, гораздо проще обеспечить уникальные идентификаторы, чем уникальные имена). - person Boris Dalstein; 15.06.2013
comment
Сложно ли перейти с механизма GL_SELECT на шейдерный? да. И что хуже всего, я не нашел хорошего учебника по этому вопросу. Если у вас сейчас работает, и вы не можете тратить время на переход на пикинг на основе GPU-шейдеров, лучше не трогайте его. Обратите внимание, что Blender по-прежнему использует GL_SELECT, что немного обидно. - person Boris Dalstein; 15.06.2013
comment
Спасибо за ваше время, я ценю это! - person Nicola; 15.06.2013
comment
@nicolagenesin Пожалуйста, для этого и существует сообщество, я возвращаю время, которое ТАК спасло меня раньше :) - person Boris Dalstein; 16.06.2013