» »

[C++] Kako optimizirati?

[C++] Kako optimizirati?

aaaaa93 ::

Imam c++ vprašanje, delam neko igro, in ob nekem dejanju moram preverjati določeno stvar
(stik z 1 ladjo,stik z 1ladje v mojo ladjo, razne bonuse itd če jih poberem)
To pomeni da ob vsakem premiku mora narediti ogromno stvari in ogromno preverjanja zato stvar upočasni, tako da če ima kdo dobro zamenjavo z telim mojim parimi vrsticami kode oziroma kako idejo kako zmanjšat porabo pomnilnika, oz nujno je da zmanjšam saj malo vse lega pa je zelo moteče da lega že v manjši igri..

do
{
 // y += cos(smer*PI/180)*0.01;
    metekx-= 0.01;
 izris2();
      i++;


      Sleep(5);

//preverjanjeali metek trkne ob ladjo;

double dx =    ship->x - metekx;
double dy = ship->y - meteky;
double ar = ship->r+ metekr;
if(dx*dx + dy*dy < ar*ar)
        {
      int a;
        a=ship->zdravje;
        a=a-10;
        ship->zdravje=a;
        if((ship->zdravje)==0)
        ship->reset();

  //        ship->izpis_zdravja(a);

//   Montazna_ladja= new montazna_ladja();
             }

     }
    while(i<75);
  • spremenil: Mavrik ()

win64 ::

1. ena splošna optimizacija: deklariraj spremenljivke zunaj zanke
double dx,dy,ar;
int a;
do{
} while(i<75)


2. spremeni te tri stavke v:
a=ship->zdravje;
a=a-10;
ship->zdravje=a;
if((ship->zdravje)==0)
        ship->reset();

ship->zdravje -= 10;
if(!ship->zdravje)
  ship->reset();


3. mislim, da velja tudi to(če so vse vrednosti pozitivne):
if(dx*dx + dy*dy < ar*ar)
je enako
if(dx+dy < ar)


4. v zanki uporabljaš sleep, kar pomeni, da se bo ta zanka izvajala najmanj 75*5 ms = 375ms. To je največja zakasnitev. Mislim pa, da si hotel to zakasnitev.

5. naprej poglej, če se da izris2() premakniti iz zanke, torej po izračunih.
Po navadi je poenostavljena game zanka taka:
- preberi vhodne podatke(pritisnjene tipke, miška)
- obdelaj podatke(spremeni pozicije, preveri trke...)
- izriši
- počakaj (1/fps - časIzvajanjaFunkcij) in ponovi
Poizkusi preoblikovati svojo igrico, da boš imel za vsak ta korak svojo funkcijo. Tako boš lažje ugotovil kje procesor porabi največ časa.

6. kako izrisuješ ladje? v konzoli, directx, gdi,...

KruceFix ::

Vegova? Izdelek za maturo? :)
"Bomo videli" so rekli slepi gluhim ...

Vesoljc ::

aaaaa93 je izjavil:


 metekx-= 0.01; 



s temle si se ustrelil v nogo...
mas dve moznosti, ali nardis fixed time step alpa time based movement
http://gamedev.stackexchange.com/questi...
Abnormal behavior of abnormal brain makes me normal...

technolog ::

Praktično vse, kar ste napisali naj bi naredil optimizator. In fact, tole bi moral bit prvi odgovor:

matej94, uporabi optimizacije prevajalnika. To pomeni, da ko prevajaš, dodaš še flag -O3 .

Vesoljc ::

kot so zgoraj omenili, je navečja zakasnitev Sleep funkcija ;)
Abnormal behavior of abnormal brain makes me normal...

technolog ::

Saj ni važno, čeprav je res, mogoče se fantu ne gre za hitrost izvajanja programa, ampak hoče imet čim manjši CPU usage.

Senitel ::

win64 je izjavil:

3. mislim, da velja tudi to(če so vse vrednosti pozitivne):
if(dx*dx + dy*dy < ar*ar)
je enako
if(dx+dy < ar)


Ne, tole ne štima čeprav so vse vrednosti pozitivne. Primer: dx = 0.5, dy = 0.5, ar = 0.8 (now fixed >:D).
Boljša optimizacija bi bila iz double na float, ker garant ne rabi take natančnosti.

Zgodovina sprememb…

  • spremenil: Senitel ()

Vesoljc ::

@technolog
either way, tak način ni "pravilen". update funkcijo mora razbit ter spisati sistem tako, da upošteva dejanski čas med update-i. Le tako bo lahko naredil premikanje neodvisno od hitrosti izvajanja programa.

ne me narobe razumet, zbit cpu usage je super, ampak tudi to moraš narest na pravem mestu (na koncu globalnega update-a če že, ne pa v collision handlingu).

loop:
deltatime = current time - previous time
previous time = current time
readinput()
update(deltatime)
render
sleep if needed



void updateshipmovement(float deltatime)
{
   ship.x += inputdirection.x * shipspeed * deltatime;
   ship.y += inputdirection.y * shipspeed * deltatime;
}
Abnormal behavior of abnormal brain makes me normal...

aaaaa93 ::

KruceFix je izjavil:

Vegova? Izdelek za maturo? :)

Jap

technolog je izjavil:

Saj ni važno, čeprav je res, mogoče se fantu ne gre za hitrost izvajanja programa, ampak hoče imet čim manjši CPU usage.


Gre se mi da oboje zajema da je čimbolj optimizirana, kot aplikacija zakasnjeno je pa streljanje ladjic

Zgodovina sprememb…

  • spremenil: aaaaa93 ()

aaaaa93 ::

Gre se mi da se zadeva čimbolj optimizira, zakj bi bilo preveč procesiranja in preverjanj če ni potrebno.
Zelo čudno mi pa izriše strel, mi izriše takole:
------------------


(to prikazuje faze potovanja, da občutiš da potuje pri meni je samo slika..)

namesto takole:
-
 -
  -
    -
     -
;

Zgodovina sprememb…

  • spremenil: aaaaa93 ()

Vesoljc ::

Abnormal behavior of abnormal brain makes me normal...


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Python primer async/await

Oddelek: Programiranje
182122 (1228) jype
»

Grafika

Oddelek: Programiranje
201688 (1040) aaaaa93
»

[C++][Naloga]Točka, Daljica, Razdalja

Oddelek: Programiranje
91910 (1550) snow
»

Šah [Pacsal]

Oddelek: Programiranje
152218 (1821) NeOman
»

n kraljic

Oddelek: Programiranje
141472 (1310) Thomas

Več podobnih tem