Форум: "Игры";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
Вниз[GLScene] Быстрое обращение к объектам Найти похожие ветки
← →
Домовенок (2005-03-11 00:13) [0]Вот у меня созрел весьма любопытный вопрос по GLScene. К примеру уменя есть N-ое количество объектов (моделей) и все они находятcя к примеру в DummyCube1, мне хочется как то оживить все это N-ое количество объектов и заставить их к примеру покачиваться. В этом случае я в обработчике GLCadencer1.OnProgress пишу что-то вроде этого:
...
var
i: Integer;
begin
for i := 0 to DummyCube1.Count-1 do begin
TGLActor(DummyCube1.Children[i]).Position.Y := TGLActor(DummyCube1.Children[i]).Position.Y+(10*deltaTime);
end;
end;
На самом деле код у меня там немного по больше - просчет покачивания объектов. В общем, проблема состоит в следующем: когда количество объектов доходит до 200, а то и больше, соответственно цикл выполнятся дольше, что вызывает своеобразное под тормаживание, время уходит на выполнение цикла. Мне хочется реализовать подобный алгоритм, что бы в один такт времени могло без особых проблем (торможений) обрабатываться до 1000 объектов. Может кто-то подскажет как правильнее и быстрее обращаться к объектам (моделям)?
← →
DeadMeat © (2005-03-11 00:46) [1]А это и не важно... Хоть как обращайся.. Разве что если прямо по памяти шагать.
Как вариант, завести дополнительный поток, и в нем считать...
Либо еще такое извращение. Каждому объекту, в его OnProgress впихнуть процедуру свою. Ну в смысле все их свести в одну. А в ней уже делать покачивание по флагу.. Когда надо, взвел флаг, начал качаться и в таком духе..
Это только мысли.. Не проверял.
Или еще вот.
Если они должны разом все качаться одинаково, то можно распределить по даммикубам, и качать уже их.. Т.е. например 200 объектов: 50 качаются с одной амплитудой, 50 с другой, а 100 стоят на месте... Первые 50 в один даммикуб, вторые во второй.. А те, что 100 в отдельный. Далее качать соответственно этим даммикубы...
---
...Death Is Only The Begining...
← →
Домовенок (2005-03-11 02:53) [2]> DeadMeat (11.03.05 00:46) [1]
> А это и не важно... Хоть как обращайся.. Разве что если прямо по памяти шагать.
Почему не важно? :) С циклом явная задержка выходит :) Можно конечно сделать и так:
var
gi: Integer;
...
// OnProgress...
begin
Inc(gi);
if gi <= GLDummyCube1.Count-1 then begin
TGLActor(DummyCube1.Children[gi]).Position.Y := TGLActor(DummyCube1.Children[gi]).Position.Y+(10*deltaTime);
end;
end;
Задержки (тормоза) не будет, зато потребуется намного больше времени, хоть и без явных дерганий, чтобы обработать все объекты. Если честно так не пробовал, но догадываюсь что это совсем не то.
> Либо еще такое извращение. Каждому объекту, в его OnProgress впихнуть процедуру свою.
Мысль! Обязательно попробую :) О результатах сего извращения сообщу дополнительно... :)
> Если они должны разом все качаться одинаково...
Тоже выход. Но есть еще такой расчет на будущие: вот нужно будет в игру добавить совсем немного реальной физики, а ради мелких трюков с физикой, которые можно легко написать самому, явно большую библиотеку с кучей возможностей как ode.dll подключать нет смысла. А ведь если писать самому то, тоже нужно будет обращаться ко всем моделям с определенным флагом и совершать над ними физические формулы! :)
← →
DeadMeat © (2005-03-11 10:19) [3]
Почему не важно? :) С циклом явная задержка выходит :)
Ну дык это метод перечисления а не метод обращения в объектам...
Если делать так, то можно конечно избавиться от тормозов на всегда, НО... В таком варианте, объекты не будут ровно передвигаться.. В смысле не одновременно. Для этого, надо набить формулу и вывести в ней зависимость от времени (newtime). Тогда все они будут двигаться одинаково (в смысле конечной точки), но будут дергаться... Этот способ еще можно сочитать со способом перечисления порциями, т.е. 50 первых объектов в одном кадре, а 50 остальных в следующем.. Тогда дерганья не будут так сильнь заметны...
Но всеже попробуй еще вариант с потоком.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.015 c