Skocz do zawartości

Optymalizacja kodu


Rekomendowane odpowiedzi

Nie mam już z tym siły, proszę Was o ogarnięcie tego(wiem gorzej tego napisać nie mogłem):

 

GML
switch(walk)

{

case 1://a

if !place_meeting(x+lengthdir_x(1,180),y+lengthdir_y(1,180),obj_solid) x-=1

break

case 2://w

if !place_meeting(x+lengthdir_x(1,90),y+lengthdir_y(1,90),obj_solid)y-=1

break

case 3://s

if !place_meeting(x+lengthdir_x(1,270),y+lengthdir_y(1,270),obj_solid)y+=1

break

case 4://d

if !place_meeting(x+lengthdir_x(1,0),y+lengthdir_y(1,0),obj_solid)x+=1

break

case 5://a

if !place_meeting(x+lengthdir_x(2,180),y+lengthdir_y(2,180),obj_solid)x-=2

break

case 6://w

if !place_meeting(x+lengthdir_x(2,90),y+lengthdir_y(2,90),obj_solid)y-=2

break

case 7://s

if !place_meeting(x+lengthdir_x(2,270),y+lengthdir_y(2,270),obj_solid)y+=2

break

case 8://d

if !place_meeting(x+lengthdir_x(2,0),y+lengthdir_y(2,0),obj_solid)x+=2

break

case 9://a

if !place_meeting(x+lengthdir_x(3,180),y+lengthdir_y(3,180),obj_solid)x-=3

break

case 10://w

if !place_meeting(x+lengthdir_x(3,90),y+lengthdir_y(3,90),obj_solid)y-=3

break

case 11://s

if !place_meeting(x+lengthdir_x(3,270),y+lengthdir_y(3,270),obj_solid)y+=3

break

case 12://d

if !place_meeting(x+lengthdir_x(3,0),y+lengthdir_y(3,0),obj_solid)x+=3

break

case 13://AW

if !place_meeting(x+lengthdir_x(1,135),y+lengthdir_y(1,135),obj_solid)

{

x+=lengthdir_x(1,135)

y+=lengthdir_y(1,135)

}

break

case 14://WD

if !place_meeting(x+lengthdir_x(1,45),y+lengthdir_y(1,45),obj_solid)

{

x+=lengthdir_x(1,45)

y+=lengthdir_y(1,45)

}

break

case 15://DS

if !place_meeting(x+lengthdir_x(1,315),y+lengthdir_y(1,315),obj_solid)

{

x+=lengthdir_x(1,315)

y+=lengthdir_y(1,315)

}

break

case 16://SA

if !place_meeting(x+lengthdir_x(1,225),y+lengthdir_y(1,225),obj_solid)

{

x+=lengthdir_x(1,225)

y+=lengthdir_y(1,225)

}

break

case 17://AW

if !place_meeting(x+lengthdir_x(2,135),y+lengthdir_y(2,135),obj_solid)

{

x+=lengthdir_x(2,135)

y+=lengthdir_y(2,135)

}

break

case 18://WD

if !place_meeting(x+lengthdir_x(2,45),y+lengthdir_y(2,45),obj_solid)

{

x+=lengthdir_x(2,45)

y+=lengthdir_y(2,45)

}

break

case 19://DS

if !place_meeting(x+lengthdir_x(2,315),y+lengthdir_y(2,315),obj_solid)

{

x+=lengthdir_x(2,315)

y+=lengthdir_y(2,315)

}

break

case 20://SA

if !place_meeting(x+lengthdir_x(2,225),y+lengthdir_y(2,225),obj_solid)

{

x+=lengthdir_x(2,225)

y+=lengthdir_y(2,225)

}

break

case 21://AW

if !place_meeting(x+lengthdir_x(3,135),y+lengthdir_y(3,135),obj_solid)

{

x+=lengthdir_x(3,135)

y+=lengthdir_y(3,135)

}

break

case 22://WD

if !place_meeting(x+lengthdir_x(3,45),y+lengthdir_y(3,45),obj_solid)

{

x+=lengthdir_x(3,45)

y+=lengthdir_y(3,45)

}

break

case 23://DS

if !place_meeting(x+lengthdir_x(3,315),y+lengthdir_y(3,315),obj_solid)

{

x+=lengthdir_x(3,315)

y+=lengthdir_y(3,315)

}

break

case 24://SA

if !place_meeting(x+lengthdir_x(3,225),y+lengthdir_y(3,225),obj_solid)

{

x+=lengthdir_x(3,225)

y+=lengthdir_y(3,225)

}

break

}

 

case muszą zostać!

Odnośnik do komentarza
Udostępnij na innych stronach

tak to kod na sterowanie(client, inny gracz)

walk jest to zmienna jaką się przesyła od clienta do serwera i na odwrót, aby chodzenie było płynne, a nie przesyłanie x i y raz na 3 sek, lub co gorsza co stepa

mówiąc optymalizacja mam na myśli w tym przykładzie pozbycie się bilirda powtarzających się if i prawie tego samego kodu

OFTOP:

wytłumaczy mi ktoś jak postawić serwer z gamemakera na jakimś hostingu i do jakich cen dochodzi.

Odnośnik do komentarza
Udostępnij na innych stronach

mozna oto tak, dla inspiracji:

GML
//a 1

ldir[1,0]=1;

ldir[1,1]=180;

walk_name[1]="x";

walk_var[1]=-1;

//w 2

ldir[2,0]=1;

ldir[2,1]=90;

walk_name[2]="y";

walk_var[2]=-1;

//s 3

ldir[3,0]=1;

ldir[3,1]=270;

walk_name[3]="x";

walk_var[3]=1;

//d

/*

...

dodaj dalse dane dla inne kieronki

...

*/

//

//d 12

ldir[12,0]=3;

ldir[12,1]=0;

walk_name[12]="x";

walk_var[12]=3;

 

walk=get_integer("input numer 1-12","");

 

if (!place_meeting(x+lengthdir_x(ldir[walk, 0], ldir[walk, 1]), y+lengthdir_y(ldir[walk, 0], ldir[walk, 1]), obj_solid) ) {

variable_local_set(walk_name[walk], variable_local_get(walk_name[walk])+walk_var[walk] );

};

jesli nadal volisz case to mozes v case odvolyvac sie do scryptu if, podajoc popravnie zmienne :)

dla AW, WS,DS... odpoviedno zmodifikuj kod GML

Odnośnik do komentarza
Udostępnij na innych stronach

nie kminie tego kodu

tam gdzie jest //a 1 ma być case tak?

 

kod musi być wykonany w jednym skrypcie- kod wykonuje się gdy client dostanie informacje od serwera o zmianie kierunku/prędkośći innego gracza

 

jesteś zza granicy?

tam gdzie powinno być "w" piszesz "v" :D

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Moment, to jest zmienna z serwera, która mówi gdzie inny gracz idzie tak? To po co sprawdzanie kolizji? Btw. widzę, że używasz wszystkich możliwych kierunków podzielnych przez 45, oraz odległosci 1,2,3. W takim razie ja proponuję, aby zmienna walk wysyłała

 

GML
walk = (dystans << 4) || (kierunek div 45);

 

a potem odbierasz:

 

GML
var dystans, kierunek;

dystans = walk >> 4;

kierunek = (walk & $FFF0) * 45;

 

var xx,yy;

xx = lengthdir_x(dystans,kierunek);

yy = lengthdir_y(dystans,kierunek);

 

if !place_meeting(x + xx,y+yy,obj_solid) {x += xx; y+=yy;}

 

I to cała optymalizacja. Przypominam, ze walk ma w tym wypadku min. 16 bitów. Można oczywiście rozbić go na dwa bity, ale ten przykład pozwala na użycie dystansu większego niż 8 dzięki przesunięciom.

Odnośnik do komentarza
Udostępnij na innych stronach

tak jestem z czech.

przepraszam za bledy v polskim, nieuzyvam translatora bo robi duzy balagan i sam pak nierozumiem co on pisze :)

 

kod vyzej jest v pelni funkcjonalny. event mouse click vystarczy. bedzie on ruszac x, y obiektem. tylko walk wprovadzam przez get_integer.

 

case teraz niejest vogole potrzebne.

//a 1 jest zamiast case 1

etc.

 

jezeli jednak volisz case mozes dac do scriptu i v case podavac mu 4 argumenty

GML
//script _script_case_jaki_zrobis()

ldir[1,0]=argument0;

ldir[1,1]=argument1;

walk_name[1]=argument2;

walk_var[1]=argument3;

if (!place_meeting(x+lengthdir_x(ldir[walk, 0], ldir[walk, 1]), y+lengthdir_y(ldir[walk, 0], ldir[walk, 1]), obj_solid) ) {

variable_local_set(walk_name[walk], variable_local_get(walk_name[walk])+walk_var[walk] );

};

case 1 moze byc ot tak
GML
case 1://a

_script_case_jaki_zrobis(1, 180, "x", -1);

break;

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

proszę bardzo:

 

dystans = 4, kierunek = 90;

 

4 to jest binarnie 100, a << 4 oznacza przesuń o 4 bity w lewo, zatem 1000000 - przesuwam po to, żeby na pierwsze 4 bity móc wstawić resztę z dzielenie kierunku przez 90. Dlaczego 4 bity? Bo 360/45 = 8, a 8 binarnie to 1000, zatem każdą mniejszą liczbę zapiszemy za pomocą mniejszej ilości bitów. DIV oznacza dzielenie całkowite, zatem 90/45 = 2, 135/45 = 3, ale 134/45 = 2 (bo zostaje 44 reszty).

 

A potem to odwracamy. Takie trochę pakowanie bitów ;) Ale jak mówię, jak korzystasz z 39dll to możesz obie rzeczy przesłać osobno jako dwa bity, będzie łatwiej bez i przesuwania:

 

GML
walk1 = dystans;

walk2 = kierunek div 45;

odbieram:

GML
walk2*=45;

 

 

var xx,yy;

xx = lengthdir_x(walk1,walk2);

yy = lengthdir_y(walk1,walk2);

 

if !place_meeting(x + xx,y+yy,obj_solid) {x += xx; y+=yy;}

Odnośnik do komentarza
Udostępnij na innych stronach

gnysek twój 1 kod chyba nie działa

GML (create)
_dir=get_integer("kierunek",0)

_speed=get_integer("prędkość",0)

walk = (_speed << 4) || (_dir div 45);

dystans = walk >> 4;

kierunek = (walk & $FFF0) * 45;

GML (draw)
draw_text(0,0,"walk:"+string(walk)+"#PRZED#dir:"+string(_dir)+"#speed:"+string(_speed)+"#PO#dir:"+string(kierunek)+"#speed"+string(dystans))

i wyświetla mi sie:

walk:1

PRZED

dir:45

speed:1

PO

dir:0

speed:0

co robie źle?!

Odnośnik do komentarza
Udostępnij na innych stronach

dlatego ze || jest logic or a | jest bit or.

sproboj

GML
walk = (_speed << 4) | (_dir div 45);

a tak przy okazji, chyba lepiej bedzie popravic:

GML
kierunek = (walk & $FFF0) * 45;

na

GML
kierunek = (walk & $0F) * 45;

przeciez majo pozostac 4 nejmiej vazne bity ;)

Odnośnik do komentarza
Udostępnij na innych stronach

rad pomoge jesli moge :)

$FFF0 masz tutaj

princip gnyska jest ladny i prosty.

 

pakovanie:

1-255 decymalnie jest 00000000 - 11111111 bitowo

do Bajtu walk zapisuje 4 xxxx bity speed ( zapis jest od pravej strony) 0000xxxx

presuva o 4 bity do leva xxxx0000 i zapisuje ctery yyyy bity znow od prava( najmien znacoce bity so od prava) xxxxyyyy

 

teraz walk ma v polovie bajtu speed a v polovie direction(max 16 direction, bo wiecej sie niezmiesci v 4 bite) i wysylasz.

 

odwrotnie:

do speed zapisujesz walk po przesunieciu 4 bite v pravo. xxxxyyyy>>>> 0000xxxx. speed=0000xxxx

do direction zapisujesz walk , ale dzieki bitovej masce 00001111 i operacji bite AND( | ) nulujesz bity xxxxx i pozostaje tylko yyyy

direction = xxxxyyyy | 00001111 = 0000yyyy

 

moj stary przyklad bral pod uwage twe zodanie na "case musi byc" :)

ale gnysek jest bardziej efektivny.

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