Я использую эти классы:Повышение эффективности использования QHash и QList
QHash
: rapresenting все объекты сцены (не может изменить этот класс)
QList
: rapresenting все объекты, выбранные. Она содержит идентификаторы (сохраненные в 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
).
Не могли бы вы предложить мне более эффективный способ сделать это? Любая помощь будет оценена по достоинству.
EDIT:
Благодарим Вас за проблемы reply.The, что я не могу избавиться от этого QList<int>
(Ii может толкнуть только целые числа на вершине стека OpenGL выбора).
Итак, еще один способ из вышеуказанного решения состоит в том, чтобы сделать QString.toInt()
для каждого элемента QHash
и сохранить их в QList<int>
.
Факт ... как узнать правильный QString
на хэш с помощью int
(рассчитанный в настоящее время путем преобразования из QString
, не более от счетчика) на QList
?
Благодарим за сообщение. Проблема в том, что я не могу избавиться от этого QList (я могу нажимать только целые числа поверх стека выбора OpenGL). Итак, еще один способ из вышеприведенного решения - сделать QString.toInt() для каждого элемента Qhash и сохранить их в QList. Фактически ... как узнать правильную QString в хэше, используя int (вычисленный теперь путем преобразования из QString, не более от счетчика) в QList? – Nicola
@nicolagenesin Хорошо, я вижу вашу проблему. Тогда единственное эффективное для вычислений решение, помимо вашего 'QHash', должно содержать в памяти 'QHash stringFromInt;' (или 'QMap '). Каждый раз, когда вы создаете объект, вы выполняете 'stringFromInt [myObject-> name()] = myObject-> id();'. Это, если вы не можете изменить свою начальную хеш-таблицу: оптимально, лучше всего иметь непосредственно «QHash ». Последний совет: встроенный механизм выбора OpenGL очень медленный и устаревший. Я использовал его в прошлом, но теперь использую свои собственные шейдеры для этого (или делаю это в CPU, если это возможно). –
Boris
Спасибо, это то, что я думал, но я думаю, что это «довольно ужасно». Дело в том, что я ненавижу менять архитектуру из-за старых ограничений gl.Is трудно обновить с механизма GL_SELECT до шейдеров один? Есть ли какие-либо хороший учебник, который вы знаете, чтобы со мной связаться? – Nicola