Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
4-1113389095
psa247
2005-04-13 14:44
2005.06.06
ShFileOperation


14-1116657776
lookin
2005-05-21 10:42
2005.06.06
Какое окно все-таки активно?


4-1113663236
Gaffer
2005-04-16 18:53
2005.06.06
Создание расширения


6-1110103285
leonidus
2005-03-06 13:01
2005.06.06
idHTTP при работе в потоке


14-1116079521
Ihor Osov'yak
2005-05-14 18:05
2005.06.06
пару фоток





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский