forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Библиотеки (http://forum.boolean.name/forumdisplay.php?f=28)
-   -   Секционная разбивка (http://forum.boolean.name/showthread.php?t=4545)

HolyDel 29.12.2011 04:04

Ответ: Секционная разбивка
 
ну ладно, подготавливаем.

самое основное это ответ на твой вопрос - "и заодно узнаем скока всего объектов в ней". работает быстро.

H@NON 29.12.2011 14:40

Ответ: Секционная разбивка
 
для любителей покопаться в коде, у меня это выглядет несколько по другому :
Код:

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


Черный крыс 30.12.2011 01:23

Ответ: Секционная разбивка
 
H@NON - некрофил! :crazy:

LLI.T.A.L.K.E.R. 30.12.2011 01:48

Ответ: Секционная разбивка
 
Цитата:

Сообщение от Diablo1909 (Сообщение 215736)
H@NON - некрофил! :crazy:

Разница времени сообщения H@NONа от предыдущего около 10 часов.

ЗЫ: да HolyDel делал библиотечку в 2007, может в чём-то можно упрекнуть код или сам способ реализации..
Но Blitz3D всё ещё требуется великая оптимизация.

LLI.T.A.L.K.E.R. 01.01.2012 22:15

Ответ: Секционная разбивка
 
Видео:

Сектора (ячейки) перед зрением игрока становятся видимыми, остальные остаются скрытыми (ShowEntity | HideEntity).

Квадратами могут быть и комнаты со множеством приборов интерьера, или же леса, поля с деревьями и камнями (на что я и рассчитываю).
Лучшим будет если деревья AddMesh-ить в один меш поля.

Для наглядности размер квадратов 50. Применять можно и большие величины (как DeltaForce)

Пока идёт перебор всех ячеек вокруг в радиусе (затем сортировка). Нужно постараться оптимизировать код для меньшего перебора.

Про момент: игрок идёт назад и попадает в невидимый на тот момент сектор - просто пивот передвинуть на b3d-метры назад, чтобы зад мог подготовиться.

LLI.T.A.L.K.E.R. 07.01.2012 10:41

Ответ: Секционная разбивка
 

burovalex 21.07.2012 22:03

Ответ: Секционная разбивка
 
Сталкер, в начале ты нормальную тему раскручивал, а сейчас тебя немного не туда понесло )
Дело в том, что блитз автоматически проверяет что входит в обзор камеры и скрывает ненужные элементы.
Сам попробуй - запихни на сцену в одном месте например 100 сфер детализацией 64, выдай фпс и отверни от них камеру ;)

moka 21.07.2012 22:35

Ответ: Секционная разбивка
 
Тут скорее оптимизация не рендера, а логики.

LLI.T.A.L.K.E.R. 22.07.2012 12:21

Ответ: Секционная разбивка
 
Цитата:

Сообщение от burovalex (Сообщение 233706)
Сталкер, в начале ты нормальную тему раскручивал, а сейчас тебя немного не туда понесло )
Дело в том, что блитз автоматически проверяет что входит в обзор камеры и скрывает ненужные элементы.
Сам попробуй - запихни на сцену в одном месте например 100 сфер детализацией 64, выдай фпс и отверни от них камеру ;)

http://www.youtube.com/watch?v=K0_eh...ilpage#t=66 s
Разница всё же есть. Просто обдумывать блитзу придётся меньше объектов.

То что квадратики в начале видео - это сектора, в них может быть до 100 (и более) мини-объектов.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot