Fps laskee 400vihollisen jälkeen

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
spurdo
Newcomer
Posts: 6
Joined: Wed Feb 08, 2012 6:14 pm

Fps laskee 400vihollisen jälkeen

Post by spurdo »

fps laskee 60->50 400vihun jälkeen.Ja vihollisille tulee paljon muitakin ominaisuuksia,kun pelkkä liikkuminen :D nii tästä koodinpätkästä pitäis nyt hioo mahdollisimman nopea
Ilman objectpickiä pyöri reilusti yli 600vihollista ilman pelin hidastumista,mut vihollisetkin käveli seinii päin vähän turhan paljon.

Code: Select all

SCREEN 1280,1024
FrameLimit 60

Type viholliset
Field obj
Field nopeus
Field health
Field ajastin
Field luku1
Field uusisuunta
Field aika
Field aikaväli
Field suunta
Field tarkastaja
Field tarkastaja_dist
Field tarkastaja_distl
Field tarkastaja_distr

End Type 


maa1=LoadMap("media\tekoäly.til","media\tileset.bmp")
ObjectPickable maa1,ON

crosshair=LoadObject("media\target.bmp")
ShowMouse OFF

soldier= LoadObject ("media\soldier.bmp",4)
ShowObject soldier,OFF






Global määrä
Repeat


PositionObject crosshair,MouseWX(),MouseWY()

If Keydown(28) Then
makevihollinen(soldier,4,100,maa1)
EndIf 

If LeftKey() Then MoveCamera -2:ElseIf RightKey() Then MoveCamera 2

move_enemies(crosshair )

        DrawGame
        DrawToWorld 0,0,0
        Text 0,20,"FPS : "+FPS()
        Text 0,40,"Enemies : "+määrä
        Text 0,60,"MWX : " + MouseWX()+" MWY : " + MouseWY()
  

    
    DrawScreen

  

Forever

Function makevihollinen(kuva,nopeus,health,maa)
newenemy.viholliset=New(viholliset)
määrä=määrä+1
newenemy\obj=CloneObject(kuva)
newenemy\tarkastaja=MakeObject()
SetupCollision newenemy\obj,maa,2,4,2
newenemy\nopeus=nopeus
PositionObject newenemy\obj,Rand(-300,300),Rand(-250,250)
End Function 


Function move_enemies(tähtäin)

For newenemy.viholliset= Each viholliset



If newenemy\aika=0 Then
newenemy\aikaväli=Rand(1000,1600)
newenemy\ajastin=Timer()
newenemy\aika=1
EndIf 


MoveObject newenemy\obj,newenemy\nopeus

If CountCollisions(newenemy\obj)>0 Then TurnObject newenemy\obj,180:MoveObject newenemy\obj,5






ObjectPick newenemy\obj
newenemy\tarkastaja_dist=Distance(ObjectX(newenemy\obj),ObjectY(newenemy\obj),PickedX(),PickedY())





If Timer()>newenemy\ajastin+newenemy\aikaväli Or newenemy\tarkastaja_dist<80 Then
CloneObjectPosition newenemy\tarkastaja,newenemy\obj
RotateObject newenemy\tarkastaja,WrapAngle(ObjectAngle(newenemy\obj)+90)
ObjectPick newenemy\tarkastaja
newenemy\tarkastaja_distl=Distance(ObjectX(newenemy\obj),ObjectY(newenemy\obj),PickedX(),PickedY())

RotateObject newenemy\tarkastaja,WrapAngle(ObjectAngle(newenemy\obj)-90)
ObjectPick newenemy\tarkastaja
newenemy\tarkastaja_distr=Distance(ObjectX(newenemy\obj),ObjectY(newenemy\obj),PickedX(),PickedY())

If newenemy\tarkastaja_distl=>newenemy\tarkastaja_distr Then
turnobject newenemy\obj,90
newenemy\aika=0



ElseIf newenemy\tarkastaja_distl<newenemy\tarkastaja_distr Then
TurnObject newenemy\obj,-90
newenemy\aika=0
EndIf 
EndIf 








If ObjectsOverlap(tähtäin,newenemy\obj) And MouseDown(1) Then
määrä=määrä-1
DeleteObject newenemy\obj
Delete newenemy
EndIf 









Next newenemy
End Function 
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Fps laskee 400vihollisen jälkeen

Post by Jonez »

Jostain syystä fps ei laske cb:ssä tasaisesti, vaan portaittain. Nämä porrastukset riippuvat koneesta jolla ohjelma pyörii.

En voi koodiasi testata, koska ei ole siihen kuuluvaa mediaa... Et kuitenkaan näytä poistavan enemyn tarkastaja-objektia muun poiston yhteydessä. Jos sinulla on samaan aikaan 400 vihollista elossa, ei ihme että fps alkaa tippua. Cb:n rajat tulevat jossain välissä vastaan.

Suosittelen sisentämään koodin ja jättämään turhat välit pois. Koodisi ulkoasu on suoraan sanottuna hirveän näköistä, eikä sitä ole mukava lukea.
Sisennysesimerkki:

Code: Select all

//Sisennys kannattaa tehdä tabilla. Jotkut käyttävät spacea, mutta siinä ei omasta mielestäni ole mitään järkeä.
//Aina kun aloitetaan uusi blokki, tehdään sisennys. Blokin aloittaa mm. avainsanat Function, If, Else If, Select, For ...
//kun blokki sulkeutuu, palataan edelliseen sisennyskohtaan.
 
Function foo()
    //Sisennetään kaikki funktioblokissa
    For i = 1 To 10
        //sisennetään silmukkablokissa
        If ehto1 = ehto2 Then
            //sisennetään ehtoblokissa
            sisempi_muuttuja = 10
        Else If ehto2 = ehto3 Then
            sisempi_muuttuja = 10
        EndIf
    Next i
    
    //Tämän ja edellisen rivin välissä on väli. Älä kirjoita kaikkea yhteen, mutta älä myöskään tee kymmenen rivin välejä. Yksi riittää.
    Text 20, 20, "Tämä teksti on funktio-blokissa, ja menee sen sisennyksen mukaan."
EndFunction
Sisentäminen voi tuntua alussa rasittavalta, mutta ajan kuluessa se rupeaa tulemaan täysin itsestään. Ja se helpottaa koodin lukua huomattavasti (ja myös virheiden etsintää). Tulet sitä tekemään jossain välissä kuitenkin, joten kannattaa aloittaa heti. Toinen tärkeä juttu: kommentointi. Tee sitäkin.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Fps laskee 400vihollisen jälkeen

Post by axu »

En nyt kovin paljon koodiasi selaillut sisennysten puuttumisen vuoksi, mutta voisit kokeilla jättää tuon objectpickillä toimivan tarkastuksen vaikka joka viidenteen frameen, joka ei todennäköisesti haittaa itse peliä, mutta boostaa suorituskykyä todennäköisesti aika lailla. Lisäät vaikka viholliset-typeen fieldin, jonka arvoa vähennetään joka framella ja kun saavutaan nollaan, tehdään tarkistus ja nostetaan muuttujan arvo esim. neljään (=> joka viides frame). Tämä arvo kannattaa asettaa randomilla, kun luodaan paljon vihuja kerralla, etteivät kaikki ala yhtä aikaa tarkistelemaan.
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
spurdo
Newcomer
Posts: 6
Joined: Wed Feb 08, 2012 6:14 pm

Re: Fps laskee 400vihollisen jälkeen

Post by spurdo »

Juu jotain tollasta tarkotin.
E:asetin tarkastuksen 6framen välein(100ms),nyt pyörii 60fps +900 vihollista
Last edited by spurdo on Wed Feb 29, 2012 4:43 pm, edited 1 time in total.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Fps laskee 400vihollisen jälkeen

Post by Latexi95 »

spurdo wrote:Juu jotain tollasta tarkotin.
Onko timerillä vielä nopeempi,nii cb ei tarvii pienentää mintään 400muuttujaa samaan aikaan?
Ja timeri muutenkin varmempi.
Riippuu miten käytät timeria...

Axun selittämän tyyli ideana on, että kaikkia ObjectPickejä ei tehdä samalla kertaa vaan ne jakautuvat hieman tasaisemmin eikä peliin tule nykimistä. Eikä niiden 400 muuttujan vähentäminen niin hidasta ole.
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Fps laskee 400vihollisen jälkeen

Post by axu »

Niin, timeri on toinen vaihtoehto. Kannattaa pitää peli yhtenäisenä sen suhteen, käyttääkö ajastukseen timeriä vai framejen kulkua. Tällä hetkellä näyttäisi olevan koodissasi vihujen spawnaus timerin avulla toteutettu, mutta peli muuten ei ole FPS-riippumaton. Jos siis peli hidastuu, uusia vihuja spawnaa nopeammin pelin ajankuluun nähden. Foorumeilta löydät etsimällä lisää tietoa FPS-riippumattomuudesta.
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
spurdo
Newcomer
Posts: 6
Joined: Wed Feb 08, 2012 6:14 pm

Re: Fps laskee 400vihollisen jälkeen

Post by spurdo »

Joo siis timer on suunnanvaihtoa varten =D
Ja muutenkin randomilla tuo aikaväli,ettei sillä fps tippumisella mitään väliä pitäis olla.Ja aikaväli arvotaan jokaisen suunnanvaihdon jälkeen uudelleen.

Code: Select all

newenemy\aikaväli=Rand(1000,1600)
Jotain parannus ehdotuksia vihollisten tekoälyyn?
Enter spawnaaminen/vihollisten poisto ei liity peliin mitenkään ,ne on vaan fps testaamista varten ja helpompi seurata vihollisten törmäilyä.
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Fps laskee 400vihollisen jälkeen

Post by axu »

spurdo wrote:Joo siis timer on suunnanvaihtoa varten =D
Ja muutenkin randomilla tuo aikaväli,ettei sillä fps tippumisella mitään väliä pitäis olla.Ja aikaväli arvotaan jokaisen suunnanvaihdon jälkeen uudelleen.

Code: Select all

newenemy\aikaväli=Rand(1000,1600)
Jotain parannus ehdotuksia vihollisten tekoälyyn?
Enter spawnaaminen/vihollisten poisto ei liity peliin mitenkään ,ne on vaan fps testaamista varten ja helpompi seurata vihollisten törmäilyä.
Hups, luin vain newenemy\ajastin=Timer() ja ajattelin jotenkin, että tuossa asetetaan ajastin, milloin seuraava vihu spawnataan tai jotain.
Vaikka se on random-aikaväli, niin kyllähän se keskiarvoon vaikuttaa. Voit muuten korvata tuon systeemin lisäämällä satunnaisluvun suoraan siihen ajastinmuuttujaan:

Code: Select all

newenemy\ajastin = Timer() + Rand(1000, 1600)
...
If Timer() > newenemy\ajastin Or newenemy\tarkastaja_dist < 80 Then
Luulen, että tämäntyyppisiä muutoksia voi tehdä muuallekin koodiin, ettei vihuissa olisi niin paljon turhaa tietoa (jos vihuja on 400, yhden kokonaisluvun pois ottaminen säästää jo 4*400=1,6 kilotavua muistia ja selventää koodia).
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
Post Reply