Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Box2D] Active=false vs Create; (http://www.flasher.ru/forum/showthread.php?t=167089)

Seagull 08.09.2011 02:08

Active=false vs Create;
 
Работаю с объектным пулом. Все объекты пресоздаются, по необходимости достаются, активируются, умирая отправляются обратно в пул. Всё как положено. Однако физ тела, создаются при активации. И удаляются при деактивации. Со всем накладными расходами. Вот и вопрос как этого избежать. activate=false, есть решение? или висящие, даже в неактивном виде объекты являются просадой по производительности? Как минимум потому что они в общем списке тел, и каждый Step по ним идёт итерация?

goodguy 08.09.2011 06:59

Цитата:

даже в неактивном виде объекты являются просадой по производительности? Как минимум потому что они в общем списке тел, и каждый Step по ним идёт итерация?
Естественно являются. Поэтому неактивным телам лучше задавать тип b2_staticBody, для таких тел физика не спросчитывается.
Цитата:

Однако физ тела, создаются при активации. И удаляются при деактивации. Со всем накладными расходами. Вот и вопрос как этого избежать.
Что тут понимается под деактивацией? SetActive(false)? или какой-то свой метод?

Seagull 08.09.2011 17:01

Цитата:

Сообщение от goodguy (Сообщение 1029302)
Поэтому неактивным телам лучше задавать тип b2_staticBody, для таких тел физика не спросчитывается.

Что тут понимается под деактивацией? SetActive(false)? или какой-то свой метод?

Свои методы. Стандартные для паттерна "объектный пул". Задача активации - проинициализировать объект, добавить в списки отображения, подписать на таймер, и тп.. Задача Деактивации- всё наоборот. В бокс2д, насколько я вижу из дебаггера, даже неактивное тело лежит в одном списке с всеми остальными. (проверить можно GetNext()-ом). Не знаю нет ли отдельного, внутреннего списка активных для обсчёта внутренних процессов, но допиливать физ движок не очень входит в мои планы:o неблагодарное это дело, времени кушать много будет. Вот поэтому, лишние 100-200 неактивных тел, держать не хочется... А создавать каждый раз, малость противоречит идее пула.

Кстати, вы не правы. Для статических тел физика считается. Но только с динамическими. Между собой статические не обсчитываются. А вот флаг active=false - судя по рефференсу, и по опыту, отключает рассчёты.

Но это тоже полумера. Вот думал,может кто знает как корректно работать с телами. Возможно, их можно создавать минуя CreateBody, И просто подцеплять в список тел. Может им ещё что- то нужно. Кто-то знает?

goodguy 08.09.2011 17:50

Цитата:

Вот поэтому, лишние 100-200 неактивных тел, держать не хочется...
А зачем создавать такую кучу тел? Без этого всегда можно обойтись, по идее

Seagull 09.09.2011 00:26

Цитата:

Сообщение от goodguy (Сообщение 1029455)
А зачем создавать такую кучу тел? Без этого всегда можно обойтись, по идее

Очень сомневаюсь что вы действительно этого не знаете, однако Ссылка. Очень не понятно и не приятно, когда вроде бы старожилы(по кол-ву постов и репутации хотя бы), вроде бы собравшись отвечать пишут ни о чём. Создаётся впечатление, что либо хотят хоть что-то написать, чтобы было, либо за дебила считают. Мне кажется зачем создавать столько объектов, в данном случае не принципиально. Но это лирика, вообще проблема вроде решена. Не совсем так как хотелось бы, но решена.

Пока я создал времянку-функцию AddBody() в b2World-е... Которая работает почти так же как и Create, но пропускает момент создания тела получая его извне. Да, таким образом действительно получается нормально кэшировать физ тела, не теряя производительность даже на 1000 предсозданных тел. В отличии от SetActive они не присутствуют в общем списке тел, сответственно не отрисовываются DebugDraw и не едят процессорное время. только память. Багов пока не наблюдаю. Я посмотрел код, вроде там ничего горбить и не должно. Ибо на С++ строжайше запрещали создавать тела иначе как через вызов CreateBody()... Во всяком случае мне помнится такое...


Часовой пояс GMT +4, время: 12:36.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.