Skocz do zawartości

Tekstury a optymalizacja


Ignatus

Rekomendowane odpowiedzi

Dwa szybkie pytanka

 

1.Po załadowaniu do gry wyższej jakości tekstur (na podstawie zdjęć) gra drastycznie spowolniła akcję( o jakieś 40%)- jest jakiś sposób żeby chodziła normalnie ale nie pozbywać się lepszych tekstur?

 

2.Niektóre tekstury zostawiają jakąś "magiczną" linię na poziomie na którym się kończą (jakby wzdłuż górnej krawędzi-np na przykładzie drzewa- linia idzie poziomo ponad jego czubkiem).Nie było by w tym nic niezwykłego gdyby to była wina tekstur- ale błąd pojawia się dopiero po uruchomieniu gry (wcześniej nigdzie nie ma śladu).Co więcej wiem już jak się z nim uporać-należy odciąć dolną część obrazka(wymazać kawałek dołu) wtedu linia na górze znika - nie mam pojęcia co to ma być i dlaczego usunięcie dołu pomaga- przetestowałem z wieloma i cały czas błąd wyskakuje i można tak go rozwikłać( tekstury to zdjęcia).Dlaczego tak się dzieje? To bardzo uporczywe bo ciąć dół trzeba za pomocą gumki już w GM - a to bardzo nie precyzyjne i w ogóle cała sytuacja absurdalna...

Odnośnik do komentarza
Udostępnij na innych stronach

1. Która wersja GMa? (nie powiesz mi chyba, że to GM6.1 ;o)

2. nie pokazałeś screena tego psucia się, więc z tego co wywnioskowałem, chodzi Ci o texture bleeding, co oznacza, że pixele graniczne tekstury podczas interpolacji (czy to zmiennoprzecinkowa pozycja obiektu na ekranie, czy to źle dopasowana kamera - dosłownie cokolwiek, będzie sprawiać, że będą powstawać na krawędziach nieprzyjemne półprzezroczyste (bądź koloru sąsiedniej tekstury atlasu - GMS) paski).

3. to się naprawia dodając jednopikselowe obramowanie tekstury, ale w GMie może to być toporne tak, ja to opisałeś.

Odnośnik do komentarza
Udostępnij na innych stronach

Zakładam, że to nie pomoże, bo to dla GMS Pro, ale może ktoś w przyszłości znaleźć to w google i mieć problem z głowy, czy coś... poza tym nienawidzę poranków i muszę coś ze sobą zrobić.

 

Łatwe rozwiązanie mogę dać tylko dla GMS pro w wersji professional, gdzie masz w ustawieniach globalnych "texture page". Nie wchodząc w szczegóły istnienia tych linii, możesz im zapobiec w gms:pro wchodząc w global game settings > Texture Groups. Następnie wybierając grupę tekstur i zmieniając wartość w "Texture Border Width(texels)". Im większe tekstury tym większa może być potrzebna granica. Ważne jest to, że zwiększa to objętość stron tekstur, mniej się na nich mieści, więc będzie ich więcej, a to oznacza większe zużycie zasobów.

Jeżeli chodzi o poprawę wydajności, to zależy od platformy. To co tu napiszę jest dla platform nie-windowsowych, na windowsie po prostu nic to nie zmienia: Skoro już zakładamy, że masz dostęp do gms:pro, możesz utworzyć grupy tekstur. Jak pogrupujesz, zależy od Ciebie. Całym sensem jest, aby było pogrupowane tak, abyś mógł wyrzucić z pamięci. Może to być pogrupowane według roomów, żebyś np. nie trzymał w pamięci grafik z menu głównego gdy już z niego wyszedłeś, albo jeżeli korzystasz z unikalnych grafik dla każdego poziomu(lub serii poziomów), pogrupować je tak, żebyś mógł mieć wczytane tylko te, które są potrzebne dla obecnego poziomu. Tekstury można wtedy wyrzucić z pamięci za pomocą draw_texture_flush();, ale powinno się po tym spróbować wczytać po 1 zasobie z każdej strony z której chcemy skorzystać, aby nie zmuszać programu do wczytywania tekstur w pośpiechu kiedy są już potrzebne "na teraz".

 

 

Teoretyczne, toporne rozwiązanie dla każdego innego gm'a:

 

Powiększ każdą teksturę o kilka pikseli. Problem jest taki, że będziesz musiał korzystać z funkcji które wyświetlają tylko kawałek sprite'a, jak draw_sprite_part, draw_background_part.

Bonusowe punkty, jeżeli na te nowe dodatkowe piksele będą "smugą" z pikseli na krawędzi starego obrazka. To tak zwany clamping. Przykład jak to wygląda poniżej:

clamp.png

 

Ale to opcjonalne chyba w Twoim przypadku. I pracochlonne. Bezpieczna szerokosc pikseli zalezy od wielkosci tekstury, wiec zakladam ze w Twoim przypadku starczą 1 do 4 pikseli.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Dziwna ta krecha.

Spróbuj wejść w global game settings > Windows > Graphics i wybierz "Preview" przy rozdzielczości teksture page. Zobacz czy ta krecha jest na texture page.

 

Edit:

Jeżeli zmieniasz rozdzielczość gry polecam również zmianę wielkości application_surface. Może to to.

GML
surface_resize(application_surface,nowa_szerokosc,nowa_wysokosc)
Odnośnik do komentarza
Udostępnij na innych stronach

Kreska też jest na texture page (ale nie widać jej nigdzie przy przeglądaniu samej grafiki).Problem nie dotyczy tylko tej jednej grafiki drzewa- jakikolwiek obrazek w wysokiej rozdzielczości(czyli przerobione foto) daje taki sam efekt- nawet jeżeli nic przy nim nie kombinuje-i zawsze to znika jak poucinam dolną krawędź.

 

Obraz jest przechylony bo kamera zmienia delikatnie kąt przy poruszaniu postaci w danym kierunku, a to screen z gry(ale akurat bez postaci widocznej)

Odnośnik do komentarza
Udostępnij na innych stronach

Wyjaśnij jeszcze co rozumiesz przez wycięcie dolnej krawędzi, bo może to oznaczać wiele rzeczy.

Jak duże są twoje grafiki? To są tła czy sprite?

 

Jak je ustawiasz? Może po prostu masz jakoś śmiesznie włączone powtarzanie w pionie więc to przez to?

Odnośnik do komentarza
Udostępnij na innych stronach

1.Otwieram w edytorze w GM makerze - wybieram gumkę i wymazuje dolne 1-2cm- totalna amatorka i absurd- nawet opcja zaznacz i potem usuń nic nie daje, musi być gumka.

 

2.Bardzo duże, w oryginale zdjęcia mają rozdzielczość 6000x4000 ale wycinam tylko poszczególne elementy,zmniejszam pod ekran gry, potem GM jeszcze to skaluje(obstawiam że tu właśnie może być przyczyna błędu)

 

3.Wstawiam jako background jeżeli o to chodzi

 

4.Wstawiam normalnie, nie rozszerzam ani nie powielam, tylko ewentualnie zmieniam położenie x,y żeby pasowało do gry (jeżeli nie zmieniam nie ma to wpływu na "kreskę"

Odnośnik do komentarza
Udostępnij na innych stronach

Skalowanie nie ma tu nic do czynienia. No to twoim problemem będą właśnie wielkie zdjęcia. A pewnie to że nie mieszczą się na texture page.

 

Poza tym chciałbym zauważyć że większe grafiki wcale nie oznaczają lepszych grafik.

Odnośnik do komentarza
Udostępnij na innych stronach

Mniejsza od texture page. To powinno wystarczyć.

 

A wracając do pytania o spowolnienie gry: Spokojnie można powiedzieć że każdy kolejny texture page powoduje że gra będzie działać 2 razy wolniej. Więc przy 4 wielkich grafikach zajmujących całe texture page twoja gra będzie działać co najmniej 8 razy wolniej niż przy jednym texture page. 5 to już 16 razy wolniej.

Odnośnik do komentarza
Udostępnij na innych stronach

wat, threef? kto Ci takich rzeczy naopowiadał? O.o

No chyba, że zjebali rendering w GMSie ;___;

Odnośnik do komentarza
Udostępnij na innych stronach

Mniejsza od texture page. To powinno wystarczyć.

 

A wracając do pytania o spowolnienie gry: Spokojnie można powiedzieć że każdy kolejny texture page powoduje że gra będzie działać 2 razy wolniej. Więc przy 4 wielkich grafikach zajmujących całe texture page twoja gra będzie działać co najmniej 8 razy wolniej niż przy jednym texture page. 5 to już 16 razy wolniej.

 

Szczerze wątpię, gry byłyby niegrywalne.

Nie da się zrobić gry bez conajmniej kilku(nastu) stron tekstur.

Odnośnik do komentarza
Udostępnij na innych stronach

Kurcze, wcześniej miałem inne słowo zamiast "Spokojnie" ale nie pasowało mi do struktury zdania, więc postanowiłem je zamienić. Teraz chyba ma inny sens, a ja zapomniałem co miało tam być. :/

 

Fajnie jakby ktoś mnie poprawił. Ktoś znający się lepiej na pipeline kart graficznych.

To co chciałem przekazać to to że GM w każdym "draw step" (który zazwyczaj ale nie zawsze wynosi tyle samo co "step"!) aby narysować cały room musi narysować wszystkie sprite. Jeżeli te znajdują się na kilku texture pages to GM musi każdą przed rysowaniem wysłać do karty graficznej. Nie pamiętam jak się liczyło pamięć dla bitmap ale czy to nie jest przypadkiem szerokość * wysokość * ilość bitów (32?), a przy takich oznacza to że kilkanaście razy na sekundę do karty graficznej wysyłane jest kilkaset MB które od razu po narysowaniu jednego sprite(!) jest usuwane żeby na jego miejsce mógł zostać wczytany następny texture page. Im więcej grafik potrzebnych do narysowania znajduje się na różnych texture pages tym więcej razy musi ta akcja być wykonywana.

 

Poza tym było jakieś fajne "branżowe" określenie dla texture pages (bo to wymyśliło sobie YoYoGames).

 

Szczerze wątpię, gry byłyby niegrywalne.

Nie da się zrobić gry bez conajmniej kilku(nastu) stron tekstur.

Pomijając to że się da, to nie zapominaj że aktualny sprzęt jest potężny i bez problemów radzi sobie z czymś takim. Dopiero przy wypadkach takich jak w tym temacie (czyli głupich) widać spadek wydajności z tego powodu. Chociaż nie ukrywam. Wydaje mi się rozmiar grafik ma większy wpływ na płynność gry niż ilość texture pages. ;)
Odnośnik do komentarza
Udostępnij na innych stronach

@Threef

Szerokość * Wysokość * 4B(32 bity, RGBA)

 

@Topic

 

Chyba cos znalazlem grzebiac w dokumentacji:

Here you can define how the image is to be stored on the texture page as well as whether it is an image specifically for use with a 3D object and which texture page (if any) it has to be assigned to. The first two options, Tile Horizontal and Tile Vertical relate to how the edges of the image will be created when placed on the texture page. An image that is to be tiled will have the edges (horizontal or vertical) added to by the edges from the opposite side, while if no tiling is selected the sprite will be clamped and the edges pixels will be repeated.

 

Nie masz czasem w ustawieniach tekstury(backgrounda / sprite'a) ustawionego "Tile: Vertical" ? To mogloby dodawac na gore clamp z dolnych pikseli i na odwrot(aby tekstura poprawnie sie powtarzala, czego raczej nie chcesz w tym przypadku)

 

Edit: Jako przyklad dla wyjasnienia podaje:

 

Coś w czym nie chcesz mieć Tile:Horizontal ani Tile:Vertical - http://puu.sh/hgUnW/f5a30d493d.png

Coś w czym mógłbyś chcieć Tile:Horizontal i/lub Tile:Vertical - http://puu.sh/hgUs6/2a24d0794e.png

Odnośnik do komentarza
Udostępnij na innych stronach

Miałem ustawione zarównovertical jak i horizontal- niestety wyłączenie zupełnie nic nie zmieniło (mam kilka tekstur z tym błędem- na żadnej nie było zmiany)

 

Spróbowałem zmniejszyć teksturę(poza gm- przed importem)- mimo że zajmuje teraz 1/5 viewu to i tak jest linia (tylko mniej wyraźna jakby)

Próbowałem umieścić jako tile set- linia nadal się pojawia

Odnośnik do komentarza
Udostępnij na innych stronach

v 1.4.1567

 

Na innych nie próbowałem i raczej nie ma takiej opcji.Myślę że to absolutnie moja wina nie programu, tylko muszę zrozumieć dokładnie co tu się dzieję;p Wcześniej wstawiałem sprite na bazie zdjęć i nie było problemów.Dopiero przy większych powierzchniach pojawiają się takie akcje.Najbardziej by mi pomogła wiedza jak przygotować obraz przed eksportem do GM (maksymalne rozmiary itp) żeby prblem w ogóle się nie pojawił, póki co metoda prób i błędów niewiele wniosła- nada wymazuje krzywo gumką;p

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...