Skocz do zawartości

Optymalizacja - Android


Jeremiah

Rekomendowane odpowiedzi

Witam!

 

Majstruję sobie czasem po robocie małą gierkę na telefony. Nic specjalnego, taki tower defense. Co jakiś czas z góry ekranu nacierają przeciwnicy i toczą walkę z ustawionymi przez nas jednostkami.

Niemniej trochę zaskoczyło mnie jak bardzo trzeba się skupić na optymalizacji nawet bardzo prostych projektów. Chyba że jest coś nie tak z samym GM lub jego konfiguracją...

 

Napotkałem następujące problemy:

 

1. Fala przeciwników pojawia się 10 sekund po pokonaniu ostatniego wroga z poprzedniej. Wtedy co sekundę, w zależności od aktualnej rundy, realizowany jest kod:

GML
repeat (5) instance_create(choose(15,60,105,150,195,240,285,330,375,420),(random(200)*-1),corsair)

Na PC działa normalnie, na zwykłym eksporcie do Androida też było ok (stałe 30 fps). Przy użyciu YYC fps-y spadają do około 20... niby gry miały być szybsze, a tu co? To problem optymalizacji czy konfiguracji GM? Bo plany biorą w łeb, jeśli będę musiał ograniczyć ilość wrogów.

 

2. Kolejny problem. Przeciwnik może wpaść w obiekt jego wielkości, który ma spowolnić jego ruch. Kod w step jest następujący:

GML
if !place_meeting(x,y,wodorosty) then speed=3 else speed=1

Tutaj też zauważyłem spadek FPS i to również mnie dziwi, ponieważ kod nie jest zbyt skomplikowany.

 

3. Kolejna sprawa. Aby przeciwnicy nie nachodzili na siebie zastosowałem poniższy kod:

GML
var rendz;

for (rendz=0;rendz<8;rendz+=1)

{

if place_meeting(x,y+rendz,enemy)

{

speed=0

}

}

Być może trochę łopatologiczny, ale nie wpadłem na lepszy pomysł, w jaki sposób obiekt miałby reagować na inny o tej samej wartości x, a większej do 8 wartości y.

Podejrzewam, że to może być kolejną przyczyną spadku fps-ów, jedna z jednostek gracza na tej samej zasadzie oblicza dystans przeciwnika od siebie, aby oddawać strzały.

Normalnie zastosowałbym po prostu "distance_to_object", ale aby doszło do jakiejś interakcji oba obiekty muszą posiadać tę samą wartość x.

 

4. Stosuję surface na całym ekranie, ale kiedy go usuwam, to nie zauważam dużej różnicy w fps-ach. Swoją drogą, czy na PC i Androidzie używamy inaczej surface czy tak samo?

 

Na razie to tyle. Generalnie jestem zaniepokojony, bo na ekranie naraz znajdować się będzie co najmniej kilkadziesiąt integrujących ze sobą obiektów, a jeśli gm-owy eksport do Androida nie daje rady przy ledwie kilku-kilkunastu, to plan się strasznie sypie. W dodatku co wnosi YYC, jeśli działa wolniej od zwykłego eksportu?...

 

Liczę na to, że to nie problemy z kiepskim kodem, tylko coś nie tak z konfiguracją GM.

Odnośnik do komentarza
Udostępnij na innych stronach

Z 1 problemem wiem o co chodzi. Samo tworzenie instance nie powinno powodować takich zwiech, ale to co się dzieje w create każdego z nich już jest istotne. Szczególnie że tworzysz 5 na raz. Przyjrzyj się. Może tam jest coś dziwnego.

 

2 może być największym i najprostrzym błędem. ;) Może po prostu masz "Precise collision checking"?

 

Na 3 jest bardzo proste rozwiązanie: Użyj collision_line() albo sprawdzaj tylko dwa skrajne punkty. Bo gdy na którymś pixelu w środku jest kolizja to też jest na którymś z krańców. ;)

 

Taka ogólna rada którą dowiedzieliśmy się dopiero nie dawno. Mocno zamulające jest używanie przezroczystości. Każda grafika rysowana z inną alphą powoduje że gra musi rysować wszystko od nowa.

Odnośnik do komentarza
Udostępnij na innych stronach

1. No właśnie nie. W create jest tylko zadeklarowanie prędkości, kierunku i jeszcze jednej zmiennej.

2. Mam odznaczone ;/

3. Super, dzięki! Niby oczywiste rozwiązanie, a nie pomyślałem o tym.

 

Hm... co jakiś czas tworzyły się małe obiekty rysujące przezroczysty okrąg... po ich wywaleniu fps-y jakby trochę lepsze, na razie nie spadały poniżej 25. Co i tak nie jest rewelacją, bo widziałem bardziej rozbudowane i ambitne projekty na telefony wykonane dzięki GM. Niemniej, projekt traci trochę na tym wizualnie. Nie da się w ogóle przezroczystych obiektów stosować czy jak? I czy trzeba się z tym pogodzić, czy też kiedyś zostanie to załatane w jakiejś aktualizacji?

Coś mi tu ciągle nie pasuje, a nie wydaje mi się, bym miał aż tak źle zoptymalizowany kod. Zwłaszcza, że wiele go nie ma :P

 

Potestuję jeszcze później i zobaczę, czy przy okazji eksport do YYC w końcu wyrobi więcej niż 20 fps. Sytuacja i tak trochę załamuje.

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ę...