Wczytanie przed uruchomieniem

Ogólne dyskusje na temat Blender Game Engine.
Awatar użytkownika
Mortus
Posty: 88
Rejestracja: 19 lip 2012, 0:06

Wczytanie przed uruchomieniem

Postautor: Mortus » 16 lis 2013, 23:16

Temat taki w sumie na odwal, nie wiem jak to nazwać. Mniejsza o to.

Mam pewien problem z BGE - zapewne nie tylko ja :P . Problem jest związany z dodawaniem obiektów z ukrytej warstwy w trakcie gry - czyli zwykłe Add Object. Konkretnie chodzi tutaj o to "pierwsze" dodanie danego obiektu. Może przedstawię to za pomocą przykładu. Mamy powiedzmy samochód, chcemy zrobić by wybuchł a na jego miejsce pojawił się model wraku. Przy drugim, trzecim, dziesiątym razie działa w porządku. Ale gdy spróbować wyłączyć blendera, włączyć go ponownie - przy pierwszym "utworzeniu" obiektu blender się na chwilę zacina by wczytać ten obiekt. Oczywiście przy kolejnych próbach działa dobrze bo model wraku jest już wczytany. Tak samo jeśli odpalimy grę z *.exe - za pierwszym razem się zakrztusi, a potem można te przykładowe samochody "wybuchać" bez problemu. Tutaj moje pytanie - co zrobić, by blender po uruchomieniu gry od razu wczytał wszystkie obiekty, a nie doczytywał je w ostatniej chwili. Problem jest o tyle wkurzający, że czasem obiekt jest potrzebny na "już", bo leci timer, bo synchronizacja z animacją itd. Przez taką drobnostkę czasem potrafi mi się rozsypać jakaś sekwencja, bo obiekt nie wczytał się na czas...
Tak na marginesie - na nowszych wersjach blendera jest z tym coraz gorzej, bo kiedyś się przyciął na chwilkę i leciał dalej, a teraz bardzo często zwyczajnie wywala mnie do pulpitu. Nie wiem czy to tylko u mnie, ale to potrafi być potwornie frustrujące.

szudizlav
Posty: 7
Rejestracja: 18 mar 2014, 23:21

Re: Wczytanie przed uruchomieniem

Postautor: szudizlav » 25 sie 2014, 22:19

no wlasnie! Dołaczam sie do prosby!

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

Re: Wczytanie przed uruchomieniem

Postautor: lukaszfito » 26 sie 2014, 19:22

Problem, który przedstawił Mortus tak na prawdę składa się z trzech mniejszych problemów - zacznę od najprostszego.

Gdy obiekt pojawia się po raz pierwszy na scenie, musi zostać wczytana jego tekstura, a dokładniej musi być przerobiona na format docelowy środowiska graficznego OpenGL. Znalazłem prosty sposób, by usunąć ten problem (przetestowałem go na becie Red End).
Wystarczy stworzyć płaszczyznę (Plane), podzielić ją na " X " części (gdzie iksem jest ilość tekstur użytych w scenie/grze) i każdą wypełnić jednym materiałem, który wykorzystuje daną teksturę. Po tym zabiegu trzeba przesunąć płaszczyznę w pole widzenia kamery (dopiero widziane obiekty wczytują sobie tekstury). Można odwrócić naszą płaszczyznę tak, by "wypinała się" do nas swoją lewą stroną (czyli tą, której Blender nie renderuje z włączonym " Backface Culling ", gdyż obiekt będzie znajdował się w polu widzenia kamery - nie można jednak uczynić go niewidocznym przez " Invisable "). Obiekt wczyta nam wszystkie tekstury w pierwszej klatce gry (czyli przytnie się tylko raz jakby "podczas" wczytywania). Należałoby go jeszcze usunąć skryptem, lub dodając do niego kostkę logiki Edit Object > End Object. Dość proste prawda? :)

Drugim problemem jest wczytanie siatki mesh i jej UV (to trwa krócej, więc nie zawsze jest zauważalne). W tym wypadku trzeba najpierw zasłonić kamerę jakąś bitmapą z napisem "Wczytywanie" i napisać skrypt, który po kolei doda i usunie każdy obiekt, który chcemy wczytywać szybciej, podczas działania programu. Po "mignięciu" nimi wszystkimi należy usunąć ekran wczytywania i problem jest już rozwiązany.

Jednak jest jeszcze trzecia rzecz, którą Mortus zaznaczył na końcu. Wyłączanie się programu przy podmianie funkcjami endObject() na starym i addObject() na nowym obiekcie musi być przeprowadzone w odpowiednich kolejnościach, inaczej Blender może się pogubić. Najlepiej też pozbawiać rodzica wszystkich obiektów, które chcemy usunąć, zanim właściwie je usuniemy - to samo tyczy się dzieci obiektu, gdyż często pojawia się błąd z próbą wykorzystania obiektu, który został uwolniony z pamięci RAM. Jak to dokładnie wygląda, zależy od konkretnego przypadku. Maiłem podobny problem z LibFree() który uwalniał z pamięci co popadnie.

Awatar użytkownika
Mortus
Posty: 88
Rejestracja: 19 lip 2012, 0:06

Re: Wczytanie przed uruchomieniem

Postautor: Mortus » 27 sie 2014, 23:20

Szczerze powiedziawszy to już całkiem zapomniałem o tym temacie.
W każdym razie muszę przyznać, że też myślałem o tym, żeby blenderowi od razu po uruchomieniu kazać wczytać wszystkie możliwe obiekty i ukryć to ekranem "wczytywanie". Miałem nadzieję jednak że jest jakaś bardziej "elegancka" (?) metoda. Mimo, że sposób jako tako działa, to może być nieco kłopotliwy przy większej ilości obiektów. Poza tym nie jest uniwersalny, bo nie można tak wczytać na przykład obiektu który na scenie może się pojawić tylko raz, albo obiekty których pojawienie się uruchamia jakieś zdarzenie mogą w tym momencie porozsyłać jakieś swoje sygnały "pojawiłem się, więc samochód wybucha". Sam rozumiesz...
W każdym razie można tak wczytać najbardziej potrzebne obiekty, albo te, o których wiem że nic nie może się przycinać gdy faktycznie będą się pojawiać.
Jak by nie było - dzięki za odpowiedź ;) .

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

Re: Wczytanie przed uruchomieniem

Postautor: lukaszfito » 28 sie 2014, 12:15

Odpisałem, bo ktoś poprosił o odpowiedź, jego post się nie pojawił, bo albo go usunął, albo maniek go jeszcze nie zaakceptował.

Mówisz, że używanie addObject() dla każdego obiektu może zakłócić działanie gry, bo obiekty mogą mieć własne skrypty - masz rację, ale wystarczy stworzyć jeden obiekt i używać na nim replaceMeshe(), wtedy siatki i teksturki zostaną wczytane a żaden skrypt obiektu się nie odpali :D


Wróć do „Ogólnie”

Kto jest online

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