Фреймворк voxplanet и игра Suber
|
|
Adriana | Дата: Среда, 17.10.2012, 13:28 | Сообщение # 31 |
Сержант
Группа: Пользователи
Сообщений: 21
Награды: 1
Репутация: 4
Статус: Offline
| RBC рушит программу, когда вызывается из асинхронного таска, а вызывать из основной нити программы слишком накладно, камера двигается рывками. Добавлено (17.10.2012, 13:28) --------------------------------------------- Вообще, кстати, эта ошибка мне уже все нервы съела: Code python: built/include/mutexPosixImpl.I:42: MutexPosixImpl::~MutexPosixImpl(): Проверочное утверждение «result == 0» не выполнено. Аварийный останов (core dumped)
|
|
| |
ninth | Дата: Среда, 17.10.2012, 16:59 | Сообщение # 32 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| 1. Попробуй сначала собирать RBC, а потом уже репарентить его в рендер.
2 .Так RBC, если не обращать внимания на время сборки, решает проблему или нет? Судя по скринам, деревья у тебя сгенеренные, может проще генератор допилить, чтобы он собирал не одно дерево, а сразу пачку в единую геометрию?
|
|
| |
Adriana | Дата: Понедельник, 22.10.2012, 13:26 | Сообщение # 33 |
Сержант
Группа: Пользователи
Сообщений: 21
Награды: 1
Репутация: 4
Статус: Offline
| В общем, я заменил деревья, полностью изменил методику их вставки и, кажется, проблему с деревьями решил.
Вкратце: 1. Деревья квадратные как в майнкрафте 2. Генерируются заранее 100 различных моделей 3. Эти модели используются для установки на сцену методом copyTo() 4. 10 деревьев инстанцируются в одну ноду, для которой делается flattenStrong(), с установленной задержкой 100мс, для того чтобы не было явных подергиваний при движении по миру (некоторое замедление движения все равно остается) 5. Все ноды с деревьями инстанцируются в большую ноду, для которой также делается flattenStrong() 6. Большая нода инстанцируется в ноду леса. 7. Используется временная нода, для того чтобы скрыть процесс перестройки деревьев.
Профит: генерируется один объект, который включает в себя все деревья, что делает фпс не ниже 100.
https://github.com/viatori....py#L142 код метода
|
|
| |
ninth | Дата: Вторник, 23.10.2012, 08:05 | Сообщение # 34 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Другие виды флаттенов не пробовал? Иногда бывает, что результат по фпс не сильно отличается, зато скорость отработки на медиум и лайт - выше.
|
|
| |
Adriana | Дата: Пятница, 26.10.2012, 13:49 | Сообщение # 35 |
Сержант
Группа: Пользователи
Сообщений: 21
Награды: 1
Репутация: 4
Статус: Offline
| Коллизии резко снижают фпс. Использую луч из камеры.
Профиль таска, отвечающего за камеру Code 20 function calls in 0.020 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function) 1 0.020 0.020 0.020 0.020 {method 'traverse' of 'libpanda.CollisionTraverser' objects} 1 0.000 0.000 0.020 0.020 interactive.py:239(mouseUpdate) 1 0.000 0.000 0.000 0.000 {method 'sortEntries' of 'libpanda.CollisionHandlerQueue' objects} 1 0.000 0.000 0.000 0.000 {method 'setFromLens' of 'libpanda.CollisionRay' objects} 1 0.000 0.000 0.000 0.000 {method 'findNetTag' of 'libpanda.NodePath' objects} 1 0.000 0.000 0.000 0.000 {method 'getEntry' of 'libpanda.CollisionHandlerQueue' objects} 1 0.000 0.000 0.000 0.000 {method 'getNumEntries' of 'libpanda.CollisionHandlerQueue' objects} 1 0.000 0.000 0.000 0.000 {method 'getPointer' of 'libpanda.GraphicsWindow' objects} 1 0.000 0.000 0.000 0.000 {method 'getIntoNodePath' of 'libpanda.CollisionEntry' objects} 1 0.000 0.000 0.000 0.000 {method 'movePointer' of 'libpanda.GraphicsWindow' objects} 1 0.000 0.000 0.000 0.000 {method 'getX' of 'libpanda.MouseData' objects} 1 0.000 0.000 0.000 0.000 {method 'getXSize' of 'libpanda.GraphicsOutput' objects} 1 0.000 0.000 0.000 0.000 {method 'isEmpty' of 'libpanda.NodePath' objects} 1 0.000 0.000 0.000 0.000 {method 'getYSize' of 'libpanda.GraphicsOutput' objects} 1 0.000 0.000 0.000 0.000 {method 'getX' of 'libpanda.LVecBase2f' objects} 1 0.000 0.000 0.000 0.000 {method 'getMouse' of 'libpanda.MouseWatcher' objects} 1 0.000 0.000 0.000 0.000 {method 'hasMouse' of 'libpanda.MouseWatcher' objects} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 1 0.000 0.000 0.000 0.000 {method 'getY' of 'libpanda.LVecBase2f' objects} 1 0.000 0.000 0.000 0.000 {method 'getY' of 'libpanda.MouseData' objects}
Сам по себе практически не отнимает время. Тем не менее что-то сильно грузит программу, куда покопать?
Сообщение отредактировал Adriana - Пятница, 26.10.2012, 13:50 |
|
| |
ninth | Дата: Пятница, 26.10.2012, 14:52 | Сообщение # 36 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Их тоже оптимизировать нужно ) Я так понимаю, ты лепил коллизии сразу на видимую геометрию? Вместо определения коллизии с "землёй", вероятно намного быстрее будет считать просто высоту по тому же принципу, по которому ты считал высоту для построения "земли". Так же посмотри в сторону "октрификации" http://www.panda3d.org/forums/viewtopic.php?t=12947 Вообще обычная практика при создании коллизий - делать под них отдельную геометрию достаточно сильно упрощённую. Если присмотришься - даже в самых современных играх с наикрутейшей физикой и т.п. применён данный подход.
|
|
| |
Adriana | Дата: Пятница, 26.10.2012, 23:27 | Сообщение # 37 |
Сержант
Группа: Пользователи
Сообщений: 21
Награды: 1
Репутация: 4
Статус: Offline
| С коллизиями я разобрался, у меня видимая геометрия итак упрощенная, земля из квадратов по два полигона. Собственно тормозит когда луч проходит через много полигонов, так что когда я тестировал этот самый луч, не учел этого. Когда луч смотрит строго вниз от модели, то ничего не тормозит.
В общем я подошел к другой проблеме, персонаж бегает рывками, даже с использованием globalClock.getDt(). Так как в фоне постоянно идут вычисления новых чанков, новых деревьев. Какой есть способ сделать так, чтобы персонаж всегда бежал с одинаковой скоростью, не обращая внимания на расчеты в фоне?Добавлено (26.10.2012, 23:27) --------------------------------------------- Собственно кажется и эту проблему решил, хитрыми манипуляциями с потоками, приоретатми и задержками. Видео: http://youtu.be/dCsFaj7MXFI
|
|
| |
ninth | Дата: Суббота, 27.10.2012, 13:01 | Сообщение # 38 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Гратс ) Успехи налицо ) Вот ещё идея для оптимизации - вместо большой дистанции видимости попробовать периодически делать рендер окружающего пространства, потом его скрывать, а получившееся накладывать на скайбокс. Но поскольку сам я так не пытался делать - то это только теоретическое предположение.
Ещё одно - возможно стоит поиграться с балансом (количество полигонов в кадре)/(количество перерасчётов), т.е. баланс GPU/CPU
По поводу упрощения - я имел ввиду установка вместо допустим десятка полигонов - одного аппроксимированного для коллизий.
з.ы. Может тему в WiP перенести?
|
|
| |
Adriana | Дата: Суббота, 27.10.2012, 16:03 | Сообщение # 39 |
Сержант
Группа: Пользователи
Сообщений: 21
Награды: 1
Репутация: 4
Статус: Offline
| Quote (ninth) Может тему в WiP перенести? Вы тут администратор, вам виднее, я не против, если что.
Со скайбоксом идея интересная, возьму на заметку.
GPU практически никак не нагружен, а вот на CPU идет нагрузка не слабая, так что приходится в основном эту нагрузку и снижать. Приоритеты и задержки между микрооперациями помогают пока.
|
|
| |
ninth | Дата: Воскресенье, 28.10.2012, 19:41 | Сообщение # 40 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Тему перенёс.
|
|
| |