Skocz do zawartości

Optymalne rysowanie siatki


Rekomendowane odpowiedzi

Witajcie! Tak jak w temacie: jak optymalnie narysować siatkę? Chodzi mi o to, żeby podczas rysowania siatki aplikacja nie lagowała.

Takim kodem rysuję z lagami:

DRAW

GML
for(i=0;i<=room_width;i+=32)

{

for(j=0;j<=room_height;j+=32)

{

draw_rectangle(i,j,i+32,j+32,true)

}

}

Jak narysować taką siatkę bez lagów

Odnośnik do komentarza
Udostępnij na innych stronach

Rysować raz na surface!!!

Surface powinien być większy od viewa i musiał byś przesuwać tą siatkę razem z ruchem viewa ale skokowo co jedną kratkę tak by siatka zawsze była w kadrze ale sprawiała wrażenie że stoi w miejscu a nie jest podczepiona do tego viewa.

Odnośnik do komentarza
Udostępnij na innych stronach

musiał byś przesuwać tą siatkę razem z ruchem viewa ale skokowo co jedną kratkę tak by siatka zawsze była w kadrze ale sprawiała wrażenie że stoi w miejscu a nie jest podczepiona do tego viewa.

Czyli tak jak ja zrobiłem używając mod w pętli.

 

A pomysł z surface może w tym wypadku okazać się wolniejszy, bo cały surface będzie w pamięci.

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki! Moja pętla wygląda teraz tak:

GML
for(i=view_xview[3]-(view_xview[3] mod 32);i<=view_xview[3]+view_wview[3];i+=32)

{

for(j=view_yview[3]-(view_yview[3] mod 32);j<=view_yview[3]+view_hview[3];j+=32)

{

draw_line(i,j,i,j+view_hview[3])

draw_line(i,j,i+view_wview[3],j)

}

}

Odnośnik do komentarza
Udostępnij na innych stronach

Nie sądzę by użycie surface było wolniejsze od wykonania takiej pętli. Pamiętaj Threef że GMa pięta Achillesowa to wolne w uj pętle.

Zobacz ile tutaj jest obliczeń mod jest używany tutaj bardzo często a na surface był by użyty tylko 2 razy jak się nie mylę.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeszcze taki drobny tip.

for(i=view_xv...

for(var i=view_xv... dopisanie tego var przyspiesza pętlę

 

Na surface:

GML (create)
/// rysowanie siatki na surfacce

gestosc = 32;

surface_siatka = surface_create( view_wview + 2*gestosc, view_hview + 2*gestosc );

 

surface_set_target( surface_siatka )

 

draw_clear_alpha(0, 0);

draw_set_colour(0);

for(var i = 0; i <= view_wview+gestosc*2; i+= gestosc)

{

for(var j = 0; j <= view_hview+gestosc*2; j+= gestosc)

{

draw_line(i,j,i,j+view_hview)

draw_line(i,j,i+view_wview,j)

}

}

 

surface_reset_target();

 

GML (draw)
/// rysowanie surface na ekranie

draw_surface( surface_siatka, view_xview div gestosc * gestosc - gestosc,

view_yview div gestosc * gestosc - gestosc );

 

Zaleta jest oczywista, cała matematyka wykonuje się raz ( w create ) oraz nie ważne jaka będzie gęstość czy 4, 16, 32, 128 nigdy to nie wpłynie na różnicę w fpsach.

Po za tym na surface możesz sobie ładne pola rysować zamiast tych lini za pomocą draw_sprite i to nadal nie wpłynie na zmianę fpsów.

Odnośnik do komentarza
Udostępnij na innych stronach

@HuderLord fajne tylko poprav draw_set_colour(0); dla copy/paste ludzi :thumbsup:

 

jak by mialo byc dla slabszych kompow/notebookow/etc to chyba bedzie problem s videoram

jezeli by nieskodzila troche grubsza siatka, to mozna pograc sobie z przykladem HuderLorda i zmiejszyc surface od 1/2 do 1/8, miejszy chyba bylo by juz przesada. wystarczy uzyc draw_surface_stretched

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