|
Библиотеки Сторонние библиотеки для Blitz |
29.12.2011, 04:04
|
#16
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Секционная разбивка
ну ладно, подготавливаем.
самое основное это ответ на твой вопрос - "и заодно узнаем скока всего объектов в ней". работает быстро.
|
(Offline)
|
|
29.12.2011, 14:40
|
#17
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: Секционная разбивка
для любителей покопаться в коде, у меня это выглядет несколько по другому :
Global maxArrayX
Global maxArrayY
Global maxArrayThings
Global ArrayStartX = 0
Global ArrayStartY = 0
Global ArrayStepX = 10
Global ArrayStepY = 10
Global ArrayHeroRadiusX = 1
Global ArrayHeroRadiusY = 1
Global maxArrayParams = 3
Dim ThingsArray(maxArrayX,maxArrayY,maxArrayThings,maxArrayParams)
Const ArrayThingType = 0, ArrayThingHNDL = 1, ArrayThingCnt=2, ArraySingleMesh=3
Function InitArrayThings(x, y, thingsCnt)
Dim ThingsArray(0,0,0,0)
maxArrayX = x
maxArrayY = y
maxArrayThings = thingsCnt
Dim ThingsArray(maxArrayX,maxArrayY,maxArrayThings,maxArrayParams)
End Function
Function GetArrayX(x#)
Return Floor ((x - ArrayStartX) / ArrayStepX)
End Function
Function GetArrayY(y#)
Return Floor ((y - ArrayStartY) / ArrayStepY)
End Function
Function AddThingToArray(HNDL)
Local dx#,dy#,dz#,cnt
Local t.ThingT = Object.ThingT(HNDL)
dx = GetArrayX(xEntityX(t\ent,1))
dy = GetArrayY(xEntityZ(t\ent,1))
If dy>=0 And dx>=0 And dy <= maxArrayY And dx <= maxArrayX Then
If ThingsArray(dx,dy,0,ArrayThingCnt) < maxArrayThings Then
ThingsArray(dx,dy,0, ArrayThingCnt) = ThingsArray(dx,dy,0, ArrayThingCnt) + 1
cnt = ThingsArray(dx,dy,0, ArrayThingCnt)
ThingsArray(dx,dy,cnt, ArrayThingType) = t\typ
ThingsArray(dx,dy,cnt, ArrayThingHNDL) = HNDL
t\ArrayX = dx
t\ArrayY = dy
t\ArrayNum = cnt
Return True
Else
;RuntimeError("no more things to array.")
Return False
EndIf
Else
;RuntimeError("thing out from array.")
Return False
EndIf
End Function
Function MergeThingArray(HNDL,n,x,y)
FreeThingFromArray(x,y,n)
AddThingToArray(HNDL)
End Function
Function FreeThingFromArray(x,y,n)
Local cnt, k, t.ThingT
cnt = ThingsArray(x,y,0,ArrayThingCnt)
If n = cnt Then
ThingsArray(x,y,n,ArrayThingType) = 0
ThingsArray(x,y,n,ArrayThingHNDL) = 0
Else
For k = n+1 To cnt
ThingsArray(x,y,k-1,ArrayThingType) = ThingsArray(x,y,k,ArrayThingType)
ThingsArray(x,y,k-1,ArrayThingHNDL) = ThingsArray(x,y,k,ArrayThingHNDL)
t.ThingT = Object.ThingT(ThingsArray(x,y,k,ArrayThingHNDL))
t\ArrayNum = k-1
Next
EndIf
ThingsArray(x,y,0,ArrayThingCnt) = ThingsArray(x,y,0,ArrayThingCnt) - 1
End Function
Function UpdateArrayThings()
Local cnt, N, X, Y
For X = H\ArrayX-ArrayHeroRadiusX To H\ArrayX+ArrayHeroRadiusX
For Y = H\ArrayY-ArrayHeroRadiusY To H\ArrayY+ArrayHeroRadiusY
If InArrayCheck(X, Y) Then
cnt = ThingsArray(X,Y,0,ArrayThingCnt)
For N = 1 To cnt
CheckAndUseThing(ThingsArray(X,Y,N,ArrayThingType), ThingsArray(X,Y,N,ArrayThingHNDL))
Next
EndIf
Next
Next
End Function
Function InArrayCheck(x, y)
If y>=0 And x>=0 And y <= maxArrayY And x <= maxArrayX Then Return True
Return False
End Function
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо H@NON за это полезное сообщение:
|
|
30.12.2011, 01:23
|
#18
|
|
Ответ: Секционная разбивка
H@NON - некрофил!
|
|
|
30.12.2011, 01:48
|
#19
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Секционная разбивка
Сообщение от Diablo1909
H@NON - некрофил!
|
Разница времени сообщения H@NONа от предыдущего около 10 часов.
ЗЫ: да HolyDel делал библиотечку в 2007, может в чём-то можно упрекнуть код или сам способ реализации..
Но Blitz3D всё ещё требуется великая оптимизация.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.01.2012, 22:15
|
#20
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Секционная разбивка
Видео:
Сектора (ячейки) перед зрением игрока становятся видимыми, остальные остаются скрытыми (ShowEntity | HideEntity).
Квадратами могут быть и комнаты со множеством приборов интерьера, или же леса, поля с деревьями и камнями (на что я и рассчитываю).
Лучшим будет если деревья AddMesh-ить в один меш поля.
Для наглядности размер квадратов 50. Применять можно и большие величины (как DeltaForce)
Пока идёт перебор всех ячеек вокруг в радиусе (затем сортировка). Нужно постараться оптимизировать код для меньшего перебора.
Про момент: игрок идёт назад и попадает в невидимый на тот момент сектор - просто пивот передвинуть на b3d-метры назад, чтобы зад мог подготовиться.
Последний раз редактировалось LLI.T.A.L.K.E.R., 02.01.2012 в 07:32.
|
(Offline)
|
|
07.01.2012, 10:41
|
#21
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Секционная разбивка
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо LLI.T.A.L.K.E.R. за это полезное сообщение:
|
|
21.07.2012, 22:03
|
#22
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Секционная разбивка
Сталкер, в начале ты нормальную тему раскручивал, а сейчас тебя немного не туда понесло )
Дело в том, что блитз автоматически проверяет что входит в обзор камеры и скрывает ненужные элементы.
Сам попробуй - запихни на сцену в одном месте например 100 сфер детализацией 64, выдай фпс и отверни от них камеру
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.07.2012, 22:35
|
#23
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Секционная разбивка
Тут скорее оптимизация не рендера, а логики.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
22.07.2012, 12:21
|
#24
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Секционная разбивка
Сообщение от burovalex
Сталкер, в начале ты нормальную тему раскручивал, а сейчас тебя немного не туда понесло )
Дело в том, что блитз автоматически проверяет что входит в обзор камеры и скрывает ненужные элементы.
Сам попробуй - запихни на сцену в одном месте например 100 сфер детализацией 64, выдай фпс и отверни от них камеру
|
http://www.youtube.com/watch?v=K0_eh...ilpage#t=66 s
Разница всё же есть. Просто обдумывать блитзу придётся меньше объектов.
То что квадратики в начале видео - это сектора, в них может быть до 100 (и более) мини-объектов.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:05.
|