[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Разработка быстрой загрузки
g_p3dДата: Понедельник, 16.03.2009, 20:38 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 17
Награды: 0
Репутация: 1
Статус: Offline
[color=yellow]
Здравствуйте я очень рад что наконец то у нас появился сайт панды по Русски (спасибо вам огромное за этот сайт).

Сам я недавно взялся за питон и панду до этого 4 года програмировал на блитц3Д. Сейчас решил переписать
свои старые коды в панде и столкнулся с проблемой. Рускоязычных ресурсов (типо сайты, туториалы и т.п.)
в ру.нете проктически нет. А с английским у меня отношения немного натянутые вот и возникли некоторые
вопросы.

Как вы смотрете на то чтобы обменятся опытом ?.
Я неплохо разбираюсь в игровом искуственном интеллекте и чуть-чуть в физике на блитце3Д ИИ был
мой канёк в панде я конечно-же ещё ничего подобного не делал как на блитце3Д но могу
поделится теорией по ии.

В будующем как освою немного панду открою тему по ии.

Друзья довайте осваивать панду вместе и этим мы поможем друг-другу ведь мы опэнсорсники а опенсорсники
должны помогать друг-другу ведь мы почти одной крови.

Пожалуйста посмотрите на этот код и кому не жалко пары минут ответьте на несколько моих вопросов они
находятся ниже. Поделитесь мнением на эту тему что вы об этом думаете.

# _*_ coding: utf_8 _*_
''' Вот код грузится 17 секунд не пугайтесь. Время загрузки я смотрел в дос-окне.
В координатах x-0,y-0,z-0 появится 100000 серых шаров.'''

import direct.directbase.DirectStart,sys
import CameraHandler

for i in range(100000):
# Кто знает как ускорить этот участок кода
copyModel=loader.loadModel('../copyObject/ball')
copyModel.reparentTo(render)

# Это код так для удобсва
CameraHandler.CameraHandler() # Управление камерай
base.accept('escape',sys.exit)# Выход

run()

Вот вопросы
1 Кто знает как ускорить прицесс загрузки моделей хотябы в двое ?.

2 Есть-ли способ грузить не с HDD а из оперативной памяти ?.

3 Есть-ли в панде комманды быстрого кланирования или копирования моделей
( только обязательно быстрого это очень важно ) ?.

4 Как пользоватся коммандой loadModelCopy() из модуля loader я не понял поясните пожалуйста ?.

Вот архивчик с ресурсами для запуска примера вытащите папку в корень C:

Прикрепления: copyObject.zip (77.3 Kb)


Сообщение отредактировал g_p3d - Понедельник, 16.03.2009, 20:47
 
3dmaxДата: Вторник, 17.03.2009, 00:18 | Сообщение # 2
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
а зачем так много и к тому же они грузяться в одно место - координаты одни и те же.
У меня машинка далеко не слабенькая 4-х ядерный проц и видео GeFs9800GS, и выдает только 1.5 фпс. Это никуда не годиться wacko
 
dpsstudioДата: Вторник, 17.03.2009, 01:25 | Сообщение # 3
Сержант
Группа: Модераторы
Сообщений: 29
Награды: 0
Репутация: 1
Статус: Offline
Во-первых,зачем создавать новость на главной странице с текстом этой же темы?Для этого ведь форум есть.
Во-вторых,тему желательно бы перенести в раздел "Общие вопросы",т.к. текущем разделе размещаются примеры готового работоспособного кода,который может оказаться полезен другим,а не вопросы.
Теперь по теме:
1)Ускорить процесс загрузки модели можно переводом её в бинарный формат(.bam) при помощи утилиты egg2bam.exe
Заметно сокращается время загрузки и размер модели.
3)метод copyTo(model).Применяется так: model1.copyTo(model2).Только учти,что перед этим у тебя model2 должен быть создан как NodePath.
2)Имея массив вершин можно скопировать его в NodePath,но гораздо более проще и удобнее использовать предыдущий способ для копирования данных из памяти.
4)loadModelCopy,если судить по документации,при загрузке проверяет,есть ли эта модель в модельном пуле,если она в нём есть,то этот метод копирует модель из пула и возвращает её,а если модели в пуле нету,то грузит с диска.
 
ILIUSДата: Вторник, 17.03.2009, 08:04 | Сообщение # 4
Сержант
Группа: Проверенные
Сообщений: 24
Награды: 0
Репутация: 1
Статус: Offline
Есть еще возможность дублирования, размножения - хз как по русски сказать - одного обьекта на множество копий.
http://panda3d.org/wiki/index.php/Instancing
Нужно помнить что это будет оставаться один объект, просто позиционированный в разных местах, с разным поворотом и т.п. Например траву или деревья натыкать таким образом вполне логично.
Вот пример кода из мануала:
Code
dancer = Actor.Actor("chorus-line-dancer.egg", {"kick":"kick.egg"})
dancer.loop("kick")
dancer.setPos(0,0,0)
chorusline = NodePath('chorusline')
for i in range(50):
   placeholder = chorusline.attachNewNode("Dancer-Placeholder")
   placeholder.setPos(i*5,0,0)
   dancer.instanceTo(placeholder)

for i in range(3):
   placeholder = render.attachNewNode("Line-Placeholder")
   placeholder.setPos(0,i*10,0)
   chorusline.instanceTo(placeholder)

Ключевой метод instanceTo.

 
g_p3dДата: Вторник, 17.03.2009, 21:09 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 17
Награды: 0
Репутация: 1
Статус: Offline
Quote (3dmax)
а зачем так много и к тому же они грузяться в одно место - координаты одни и те же.
У меня машинка далеко не слабенькая 4-х ядерный проц и видео GeFs9800GS, и выдает только 1.5 фпс. Это никуда не годиться

1 В этом коде мощность cpu и видюхи значения не имеют потому-что код работает с HDD и оперативкой.
2 Так много потому что нужно контролировать скорасть загрузки чем больше объектов грузим тем точней показывается время
затраченое на загрузку, а чем точней время тем больше объектов отсюда и потеря фпс у меня вообще 1.1 фпс.
Время нам нужно максимально точное для того чтобы контролировать эфективность отдельных комманд и всего алгоритма загрузки.
ФПС здесь вобще не нужен.

Добавлено (17.03.2009, 21:09)
---------------------------------------------

Quote (dpsstudio)
Во-первых,зачем создавать новость на главной странице с текстом этой же темы?Для этого ведь форум есть.
Во-вторых,тему желательно бы перенести в раздел "Общие вопросы",т.к. текущем разделе размещаются примеры готового работоспособного кода,который может оказаться полезен другим,а не вопросы.

/\
Извеняюсь запутался.

Quote (dpsstudio)
Теперь по теме:
1)Ускорить процесс загрузки модели можно переводом её в бинарный формат(.bam) при помощи утилиты egg2bam.exe
Заметно сокращается время загрузки и размер модели.
3)метод copyTo(model).Применяется так: model1.copyTo(model2).Только учти,что перед этим у тебя model2 должен быть создан как NodePath.
2)Имея массив вершин можно скопировать его в NodePath,но гораздо более проще и удобнее использовать предыдущий способ для копирования данных из памяти.
4)loadModelCopy,если судить по документации,при загрузке проверяет,есть ли эта модель в модельном пуле,если она в нём есть,то этот метод копирует модель из пула и возвращает её,а если модели в пуле нету,то грузит с диска.

/\
1 Это первая мысль которая меня посетила. Но мая цель найти быстрый метод загрузки и создания копий объектов по этому
конвертировать в .bam пока не буду смысла нет этот потенциал оставим на будующее.

2 Ты работал с этим массивом вершин можно по подробней об этом как его создавать, копировать в NodePath, и вобще использовать.
Если ты с этими коммандами работал то что на твой взгляд быстрей 'массив вершин' или copyTo() к стати copyTo() хорошая комманда
она улучшила время загрузки почти в двое первый алгоритм грузил 100000 моделей за 18 секунд второй с copyTo() грузит за 11.

Сообщение отредактировал g_p3d - Вторник, 17.03.2009, 21:16
 
g_p3dДата: Вторник, 17.03.2009, 21:21 | Сообщение # 6
Рядовой
Группа: Пользователи
Сообщений: 17
Награды: 0
Репутация: 1
Статус: Offline
Немного о новом коде.
1 Я вынес медленную загрузку объекта за цикл.
2 С помощью attachNewNode() в цикле создается новый нод и на это уходит 5 секунд. У меня возник вопрос в панде есть более
шустрый оналог attachNewNode() ?. Сразу скажу что у attachNewNode() и NodePath() скорасть создания нода одинаковая я тестировал
обе комманды скажите пожалуйста есть в панде что нибудь более быстрое для создания нода.
3 Комманда copyTo() копирует объект в нод на это уходит почти все остольное время загрузки.
4 removeNode() удаляет модель загруженую перед циклом копирования.

# 2-й Вариант побыстрей грузится уже за 10.7 сек (а не 17.5)
import direct.directbase.DirectStart,sys
import CameraHandler

loadModel=loader.loadModel('../copyObject/ball')

for i in range(100000):
# Кто знает как ускорить этот участок кода
NodeModel=render.attachNewNode('NodeModels')
loadModel.copyTo(NodeModel)

loadModel.removeNode()

# Это код так для удобсва-------------------------
CameraHandler.CameraHandler() # Управление камерай
base.accept('escape',sys.exit) # Выход
#-------------------------------------------------
run()

Вот новый архивчик v2 с ресурсами.
Для запуска примера вытащите папку в корень C:

Прикрепления: copyObjectv2.zip (77.5 Kb)
 
ninthДата: Вторник, 17.03.2009, 22:14 | Сообщение # 7
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
А зачем тебе вообще создавать для каждого объекта отдельный нод? Вынеси его тоже за цикл. Сам по себе метод copyTo уже создаёт нод.
 
3dmaxДата: Вторник, 17.03.2009, 23:50 | Сообщение # 8
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
а вообще для чего тебе это нужно ? ты что стратегию делать будешь ?
 
g_p3dДата: Среда, 18.03.2009, 14:44 | Сообщение # 9
Рядовой
Группа: Пользователи
Сообщений: 17
Награды: 0
Репутация: 1
Статус: Offline
Quote (ninth)
А зачем тебе вообще создавать для каждого объекта отдельный нод?

Я знаю что copyTo() создаёт нод. До того как выложить copyObjectv2.zip была готова и третья версия где
attachNewNode() находится за циклом просто мне хотелось найти самую быструю комманду для создания нода.

Добавлено (18.03.2009, 14:44)
---------------------------------------------

Quote (3dmax)
а вообще для чего тебе это нужно ? ты что стратегию делать будешь ?

(Потвоему только движки стратегий используют загрузку объектов.)

Вобще это нужно для динамической генерации чего нибудь.
Например для создания пули или каких нибуть частиц напримен обломков от взорвавшегося объекта.
А вобще в любом игровом реалтайм движке умение быстро копировать или генерировать объекты очень важный и нужный инструмент.

 
BlackCatДата: Среда, 18.03.2009, 14:50 | Сообщение # 10
Подполковник
Группа: Проверенные
Сообщений: 144
Награды: 0
Репутация: 1
Статус: Offline
К сожалению не знаю как в Панде. А в том же Иррлихте, который я раньше использовал, реализовано следующим образом. Если модели идентичны, то грузится только одна модель. После чего эта же модель используется для создания нод. После загрузки и применения модель вообще больше не нужна, поэтому ее необходимо выгрузить. Т.е. по ходу дела, я так понимаю, модель запихивается в видеопамять в виде объекта для рендера и после этого ее нужно выгрузить из оперативной памяти, чтобы ее освободить. Может в Панде то же самое? Вчера я поискал немного по референсу. Но, к сожалению, документация Панды не отличается полнотой. sad Поэтому ничего подобного так и не нашел, кроме методов loadModelCopy и ему подобных. sad

http://alphahole.do.am - версия 0.015 вышла 22.02.10
 
g_p3dДата: Среда, 18.03.2009, 15:48 | Сообщение # 11
Рядовой
Группа: Пользователи
Сообщений: 17
Награды: 0
Репутация: 1
Статус: Offline
Проделана хорошая работа по ускорению загрузки моделей в панде первая версия грузила 100000 моделей за ( 18 сек +-1 ),
вторая версия за ( 10.5 сек +-0.8 ) и наконец третья финальная версия делает это за ( 5.5 сек +-0.3) что тут сказать Ура-а-а-а...

В последней версии удалось сократить время загрузки 100000 моделей до 5 секунд/
что-бы ещё ускорить загрузки модели конвертируйте её в .bam при помощи утилиты egg2bam.exe

Похоже мы закончили алгоритм быстрой загрузкии и я выкладываю его на форуме в 'Примеры кода' во всеобщее пользование .

Я сменил имя ахива с "copyObject" на "Fast loading".

Всем кто помогал огромное спосибо и отдельное спосибо "dpsstudio" и "ninth".
Самые полезные советы были именно от них.

Тема закрыта спосибо и досвидание.

Вот последний архивчик "Fast loading" с ресурсами.
Для запуска примера вытащите папку в корень C:

Прикрепления: Fastloading.zip (77.6 Kb)
 
g_p3dДата: Среда, 18.03.2009, 16:29 | Сообщение # 12
Рядовой
Группа: Пользователи
Сообщений: 17
Награды: 0
Репутация: 1
Статус: Offline
спосибо и досвидание.

Сообщение отредактировал g_p3d - Среда, 18.03.2009, 16:35
 
  • Страница 1 из 1
  • 1
Поиск: