LoD system - optymalizacja

Tematy związane z przyspieszaniem oraz wydajnością gier w Blender Game Engine
Awatar użytkownika
lukaszfito
Posty: 140
Rejestracja: 28 gru 2013, 1:37
Lokalizacja: Gdańsk
Kontaktowanie:

LoD system - optymalizacja

Postautor: lukaszfito » 22 lut 2014, 13:05

Oto pierwszy temat w nowym dziale Optymalizacja BGE dotyczący LoD-ów (i w ogóle pierwszy :D temat w tym dziale). No cóż, do pracy :shock: . Jako tako temat optymalizacji samego systemu z poradnika LoD system - sposób zwiększenia wydajności w grach jest opisany, ale zawsze można znaleźć coś czego brakuje. Dlatego wrzucę to czasem coś co wymyśle, odkryje lub znajdę - niekoniecznie na temat tego systemu LoD. Mam nadzieję, że pójdziecie moimi śladami i doszukacie się kolejnych sposobów na zwiększenie wydajności.

Obiekty za kamerą
Na pewno część z Was szukała sposobu, by nie renderowały się obiekty położone za graczem (a dokładniej za kamerą). Bo oczywiście im więcej obiektów jest ukrytych, tym gra działa lepiej. Jest na to bardzo prosty sposób, ale coś za coś - jeśli system ustawimy na powolne sprawdzanie obiektów, to minie trochę czasu zanim wszystkie obiekty pojawią się po obróceniu gracza o 180 stopni. Ja zmniejszyłbym ilość obiektów w grze i zwiększył prędkość LoD-a, albo sprawdzał tylko dalekie obiekty (czy znajdują się za graczem) i nie spowalniał LoD-a. Jeśli zakrywamy tylko dalekie obiekty, to po obrocie gracza zawsze coś będzie widoczne (nie będzie pusto) a w dodatku bliskie obiekty częściowo zakryją to co jest daleko (a raczej to czego tam nie ma). Oto sposób wykrywania czy obiekt jest za kamerą:

Kod: Zaznacz cały

vectTo=kamera.getVectTo(object.worldPosition)
if vectTo[2][2]>0:
    object.visible=False
else:
    object.visible=True


Oczywiście "kamera" to musi być obiekt kamery, a "object" to sprawdzany przez nas obiekt. Warto pamiętać, że "getVectTo" sprawdza wartość położenia globalnego (worldPosition) z dowolnym wektorem położenia, więc jeśli chcemy, by obiekty ukrywały się poprawnie, musimy pobrać globalną pozycję obiektu (a nie lokalną), czyli "object.worldPosition".

Żeby dodać kod do opisanego przeze mnie systemu wystarczy zamienić jedną linijkę i dodać ukrywanie gdzie nam się podoba (na przykład do najdalszych obiektów):

Kod: Zaznacz cały

for ob in objects[grupa*ktora_grupa:grupa*(ktora_grupa+1)]:
    if ob.meshes:
        mesh=str(ob.meshes[0])
        if mesh[0]=="_":
            vectTo=owner.getVectTo(ob.worldPosition) # używamy getVectTo
            dist=vectTo[0] # getVectTo posiada też wartość odległości, więc nie ma potrzeby korzystać z innej funkcji
            if dist>zasieg_widzenia:
                ob.visible=False
            else:
               if mesh[1]=="N":
                    ost=mesh[-1]
                    ob.visible=True #(( tu odkryto obiekt ))
                    if dist>zmiana_lod_2 and vectTo[2][2]>0: # sprawdzamy czy obiekt jest za kamerą
                        ob.visible=False # ukrywamy go
                    elif dist>zmiana_lod_2 and ost!="3": # w innym wypadku postępujemy normalnie
                        ob.replaceMesh(mesh[:-1]+"3") # tylko zmieniamy siatkę, obiekt odkryto wcześniej
                    elif dist>zmiana_lod_1 and dist<=zmiana_lod_2 and ost!="2":
                        ob.replaceMesh(mesh[:-1]+"2")
                    elif dist<zmiana_lod_1 and ost!="1":
                        ob.replaceMesh(mesh[:-1]+"1")
                elif mesh[1]=="S":
                    if dist<zmiana_lod_1:
                        ob.visible=True
                    else:
                        ob.visible=False


Dodaliśmy tylko jedno zapytanie "if" z jedną linijką oraz linijkę dla" getVectTo" i poprawiliśmy "dist". Najdalsze obiekty ukrywają się zamiast zmieniać mesh (jeśli są za graczem). Pamiętajmy, że wykrywamy tylko co znajduje się "za" graczem, a nie co znajduje się "poza" kamerą, wszystko po bokach jest renderowane.

Awatar użytkownika
Fyex
Posty: 68
Rejestracja: 23 sie 2012, 0:16
Lokalizacja: Kraków
Kontaktowanie:

Re: LoD system - optymalizacja

Postautor: Fyex » 23 lut 2014, 19:56

Mógł byś wrzucić jakiś przykład (zupełnie nie wiem jak to wklejać i gdzie...)

Awatar użytkownika
lukaszfito
Posty: 140
Rejestracja: 28 gru 2013, 1:37
Lokalizacja: Gdańsk
Kontaktowanie:

Re: LoD system - optymalizacja

Postautor: lukaszfito » 23 lut 2014, 21:10

Wystarczyło podmienić pętle for z poradnika na tą z poprzedniego wpisu, ale jeśli potrzeba przykładu, oto on:
https://drive.google.com/file/d/0B85CWI ... sp=sharing

Poruszasz się strzałkami ( lewo, prawo, góra, dół ). Dodałem drugą kamerę, widok jest z góry, więc widać, że obiekty za graczem się ukrywają. Skrypt ukrywa tylko te najdalsze, dlatego żeby było widać efekt zmniejszyłem znacznie granice zamiany siatki modeli.

Awatar użytkownika
pawianek
Posty: 61
Rejestracja: 03 sty 2013, 21:20

Re: LoD system - optymalizacja

Postautor: pawianek » 23 lut 2014, 22:43

Czy możecie w miarę określić jak bardzo stosowanie lod przyśpiesza grę, bo się nie znam. Rozumiem też że stosowanie lod opłaca się tylko gdy w grze jest dobra grafika a nie kwadraciaki ?
Jeśli zechcemy możemy stworzyć wiele wspaniałych i dobrych rzeczy :)

Awatar użytkownika
lukaszfito
Posty: 140
Rejestracja: 28 gru 2013, 1:37
Lokalizacja: Gdańsk
Kontaktowanie:

Re: LoD system - optymalizacja

Postautor: lukaszfito » 23 lut 2014, 23:30

W skrócie masz rację, LoD pomaga, gdy grafika spowalnia grę. Jednak dodałbym, że LoD przydaje się, gdy chcemy widzieć duży obszar i tylko wtedy się przydaje. Jeśli robisz dwuwymiarową platformówkę z nieziemską grafiką, to lepiej użyj samego ukrywania ukrywania (wiec nie podmiany modeli) i może paru sztuczek graficznych. Przytoczę też słynnego Minecrafta, chociaż gra jest z prostych sześcianów, to też korzysta z systemu LoD :shock: - nie zauważyliście? Jeśli któraś z płaszczyzn znajduje się obok innego sześcianu, albo jest trwale zakryta przez otaczające ją sześciany, to zostaje usunięta (czyli siatka obiektu jest zmieniona, więc mówimy tu o LoD).

Jeśli chcesz policzyć jak LoD zwiększy wydajność, to musisz wyliczyć ile płaszczyzn znajduje się na scenie i ile znajdowałoby się płaszczyzn z systemem LoD. Różnica między ilością płaszczyzn może być uznawana za "przyśpieszenie" szybkości gry. Ale musimy jeszcze pamiętać, że pętla LoD spowolni grę (chyba że spowolnisz samą pętlę do prędkości żółwia - bo czasem tyle wystarcza).

Awatar użytkownika
pawianek
Posty: 61
Rejestracja: 03 sty 2013, 21:20

Re: LoD system - optymalizacja

Postautor: pawianek » 24 lut 2014, 20:46

dzięki za odpowiedź, lod jest fajny ale dużo przy nim zabawy, do mojej gry chyba wykorzystam obiekty typu Occlude, tylko jeszcze nie wiem jak one dokładnie działają bo się nimi nie zajmowałem ale się dowiem :]
Jeśli zechcemy możemy stworzyć wiele wspaniałych i dobrych rzeczy :)

Awatar użytkownika
lukaszfito
Posty: 140
Rejestracja: 28 gru 2013, 1:37
Lokalizacja: Gdańsk
Kontaktowanie:

Re: LoD system - optymalizacja

Postautor: lukaszfito » 25 lut 2014, 12:38

Blender 2.70 jest już dostępny w wersji testowej i można w niej sprawdzić LoD :D , który również korzysta z podmiany stworzonych wcześniej modeli, ale ma dość ciekawą właściwość, otóż działa on w projekcie i nie trzeba włączać gry, żeby widzieć jego efekt.

Oto link:
http://download.blender.org/release/Blender2.70/

Awatar użytkownika
szymon5596
Posty: 150
Rejestracja: 19 lip 2012, 19:23

Re: LoD system - optymalizacja

Postautor: szymon5596 » 25 lut 2014, 19:18

Biorę się za testy. :) Zwróćcie uwagę, ile teraz nasz Blender waży - ok. 75MB... Gdzie te czasy gdy ważył ok. 10-15MB..


Wróć do „Optymalizacja BGE”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość