2013-06-13 2 views
0

Я использую эти классы:Повышение эффективности использования 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?

ответ

2

Если способ доступа к объектам в хэше используется с 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 
+0

Благодарим за сообщение. Проблема в том, что я не могу избавиться от этого QList (я могу нажимать только целые числа поверх стека выбора OpenGL). Итак, еще один способ из вышеприведенного решения - сделать QString.toInt() для каждого элемента Qhash и сохранить их в QList. Фактически ... как узнать правильную QString в хэше, используя int (вычисленный теперь путем преобразования из QString, не более от счетчика) в QList? – Nicola

+0

@nicolagenesin Хорошо, я вижу вашу проблему. Тогда единственное эффективное для вычислений решение, помимо вашего 'QHash ', должно содержать в памяти 'QHash stringFromInt;' (или 'QMap '). Каждый раз, когда вы создаете объект, вы выполняете 'stringFromInt [myObject-> name()] = myObject-> id();'. Это, если вы не можете изменить свою начальную хеш-таблицу: оптимально, лучше всего иметь непосредственно «QHash ». Последний совет: встроенный механизм выбора OpenGL очень медленный и устаревший. Я использовал его в прошлом, но теперь использую свои собственные шейдеры для этого (или делаю это в CPU, если это возможно). – Boris

+0

Спасибо, это то, что я думал, но я думаю, что это «довольно ужасно». Дело в том, что я ненавижу менять архитектуру из-за старых ограничений gl.Is трудно обновить с механизма GL_SELECT до шейдеров один? Есть ли какие-либо хороший учебник, который вы знаете, чтобы со мной связаться? – Nicola