|
3D-программирование Вопросы, касающиеся программирования 3D мира |
16.06.2010, 14:12
|
#1
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
3Д оптимизация
Сделал некий способ скрытия объекта, который находится позади видимого.
Использовал основу стандартного урока - расчёт в 2д крайних вершин объекта.
Есть глюки и их нужно доработать. Прошу помочь, а то голова уже кипит
Так же не работает скрытие при показе объектов в обратном порядке (не скрываются объекты, которые отображались до текущего). Здесь нужно доработать алгоритм.
На 3-ем рисунке в режиме WireFrime 1 чётко видно то (указано мною зелёным цветом), что объекты которые не видны - они не отображаются. Так понижается количество полигонов и должен повыситься ФПС.
Сначала хотел использовать эту систему в своём проекте.. А как допёрло реализовать его - выкладываю здесь.
|
(Offline)
|
|
16.06.2010, 15:10
|
#2
|
Бывалый
Регистрация: 17.05.2009
Адрес: Днепропетровск
Сообщений: 672
Написано 180 полезных сообщений (для 428 пользователей)
|
Ответ: 3Д оптимизация
Вообще, работает , но смысла честно... у меня фпс не меняется вообще.
|
(Offline)
|
|
16.06.2010, 15:13
|
#3
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: 3Д оптимизация
Идея хорошая, только всё-таки сделай много обьектов и сравни фпс.
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
16.06.2010, 15:27
|
#4
|
Бывалый
Регистрация: 17.05.2009
Адрес: Днепропетровск
Сообщений: 672
Написано 180 полезных сообщений (для 428 пользователей)
|
Ответ: 3Д оптимизация
Я создавал 3000 кубиков, лаги ужасные. Думаю тут для сравнения нужны высокополигоналки
|
(Offline)
|
|
17.06.2010, 08:08
|
#5
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: 3Д оптимизация
Применение этого способа оптимизации я вижу такое:
в игре имеются высоко полигональные модельки/объекты (больше подойдут типа прямоугольный параллелепипед - например домики, здания, бункера, стены или ящики). Например у здания каждое окошко обработано.
Но не стоит считывать крайние точки именно у самой модели, так как просчитывание каждой вершины будет накладно.
Лучше в редакторе модели сразу же сделать прямоугольник (или плоскость) по краям модели. А в программе считывать вершины этого прямоугольника.
*____________* <- вершина |(~~~)---/~~)| |! моделька !| |!__________!|
Поправки:
RenderMaxXL=Width ;исправил с =Widht2(пол экрана) на ширину экрана (крайнее правое)
RenderMaxXR=0 ;с пол экрана на противоположное крайнее левое
RenderMaxYU=Height ;с =Height2 (пол высоты) на крайнее нижнее (в понимании верхнее)
;а то до этого застревали точки на середине экрана
|
Text RenderMaxXL,RenderMaxYU,RenderMaxXL ;здесь случайно оставил RenderMaxYD
Text RenderMaxXR,RenderMaxYU,RenderMaxXR
|
If (leftmost>RenderMaxXL+1) And (rightmost<RenderMaxXR-1) And (topmost>RenderMaxYU+1) Then
HideEntity ent
Else
If (topmost>1) And (leftmost>1) And (rightmost<Width-1) Then ShowEntity ent ;добавил проверку. Без этого при наклонении камеры, вниз все объекты (топмост и др. которых был меньше 0 и 1) изображались.
End If
|
Вроде в коде оставил pxCreateWorld(1,"") и pxSetGravity(0,-40,0) - их нужно удалить.
Остаётся глюк (на рисунке): почему-то крайнее левое иногда равняется 0 (нулю). То ли что-то пропущено, то ли равняется на невидимый объект.
И все же невыгодно просчитывать каждые 1000 или 10000 тысячные объекты. Нужно как-то сократить число (но вроде не возможно, кроме как просто иметь меньшее их количество).
Блин глюки в работе с верхней вершиной. Когда задний объект ниже ближнего, но края его видны.
|
(Offline)
|
|
17.06.2010, 09:01
|
#6
|
|
Ответ: 3Д оптимизация
|
|
|
Эти 4 пользователя(ей) сказали Спасибо за это полезное сообщение:
|
|
17.06.2010, 14:29
|
#7
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: 3Д оптимизация
да, да таких целей юзаются порталы и BSP.
и ещё я чето не понял - если стоит бублик, который крайними точками загораживает то что за ним, через дырку тоже ничего не увидишь? и все объекты на экране не идеальные квадраты, а могут иметь кучу всяких дырок и углублений.
---
кстати во)
http://insidecpp.ru/antipatterns/reinventing_the_wheel/
Последний раз редактировалось Mr_F_, 18.06.2010 в 14:57.
|
(Offline)
|
|
17.06.2010, 18:12
|
#8
|
|
Ответ: 3Д оптимизация
Думаю лучше погугли на тему Octree
|
|
|
09.07.2010, 00:03
|
#9
|
Оператор ЭВМ
Регистрация: 02.07.2010
Сообщений: 30
Написано 0 полезных сообщений (для 7 пользователей)
|
Ответ: 3Д оптимизация
А я думаю дольше будет проверять, скрывать, отображать кубики, чем просто рисовать их...
|
(Offline)
|
|
09.07.2010, 00:10
|
#10
|
Бывалый
Регистрация: 17.05.2009
Адрес: Днепропетровск
Сообщений: 672
Написано 180 полезных сообщений (для 428 пользователей)
|
Ответ: 3Д оптимизация
скрывать, отображать кубики
|
Полигоны все равно подвергаются рендеру.
|
(Offline)
|
|
09.07.2010, 00:52
|
#11
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: 3Д оптимизация
те что скрыты или альфа==0 не обрабатываются рендером.
__________________
|
(Offline)
|
|
09.07.2010, 00:58
|
#12
|
Бывалый
Регистрация: 17.05.2009
Адрес: Днепропетровск
Сообщений: 672
Написано 180 полезных сообщений (для 428 пользователей)
|
Ответ: 3Д оптимизация
А скрываю и уменя почему то RenderTris не меняется
|
(Offline)
|
|
09.07.2010, 20:35
|
#13
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: 3Д оптимизация
Идея скрывать и показывать не кубики, а прикреплённые к ним высокополигональные объекты (например домик или бункер, гараж, здание - такие как в Delta Force)
Теперь нужно прикрепить формулу нахождения точки в многоугольник (я её пока не понял и она на другом языке прог-я), но видимо в Blitz-е математические вычисления - слабое место..
Не подскажете что в Blitz-е выгоднее:
сразу рендерить 50 (или др.) высокополигональных объектов
или
вычислять свойства 50 кубиков, потом рендерить видимый объект?
А если 1000?
Ну в стиле Delta Force это будет непригодно, а вот если в стиле города GTA?
В OpenGL читал используют Z-буффер вроде и там легче
- - - - -
Ещё есть альтернативная идея:
кубики разукрашивать в разные неповторяющиеся цвета - а потом брать с экрана цвет пикселей в 2D координатах граней кубика.
Если цвет не его - значит он не видим и значит не нужно рисовать его "объект".
Ну и в запас для ограничения лишней повторной проверки держать некую базу данных не/видимости.
Но это уже вычисления и проверка буффера.
|
(Offline)
|
|
09.07.2010, 21:30
|
#14
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: 3Д оптимизация
кубики разукрашивать в разные неповторяющиеся цвета - а потом брать с экрана цвет пикселей в 2D координатах граней кубика.
Если цвет не его - значит он не видим и значит не нужно рисовать его "объект".
Ну и в запас для ограничения лишней повторной проверки держать некую базу данных не/видимости.
Но это уже вычисления и проверка буффера.
|
Это тормозня еще хуже выйдет.
__________________
Ибо как сказал Бгдн:
|
(Offline)
|
|
09.07.2010, 23:32
|
#15
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Ответ: 3Д оптимизация
да какая это оптимизация !!
З-буфер и в директ икс юзается кста !!
Реальный оптимайз получится на уровне железа !! А так можно деревъя и порталы юзать для большых пространств !!
А то что ты запрячешь 10 домиков а остальные 100500 отрендеришь ничего, при этом написав кучу ифов и проверок, не даст !!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:37.
|