[C#] Varför laggar mitt spel?!

Permalänk
Medlem
Skrivet av LinusNeuman:

Jag har olika klasser, men inte i olika .cs om du förstår vad jag menar.

Filer..?

Om du redan använder klasser tjänar du på att separera dem i enskilda filer. Det kommer bli mycket mer lättöverskådligt, speciellt om du använder namespaces!

Mmm... namespace..

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Filer..?

Om du redan använder klasser tjänar du på att separera dem i enskilda filer. Det kommer bli mycket mer lättöverskådligt, speciellt om du använder namespaces!

Mmm... namespace..

Precis, namespace.

Jag gör samtidigt ett spelprojekt i skolan som vi kallar för StarPong, där har vi olika klasser och har underbart bra strukturerad kod. Det är även därför jag varit lite inaktiv här.

Ett problem dock:

foreach (Lasers laser in lasers) { LaserPos += LaserVel; if (Vector2.Distance(LaserPos, SpaceShipPos) > 480) laser.isVisible = false; }

Vill jag byta ut med:

for (int i = 0; i < lasers.Count; i++) { LaserPos += LaserVel; if (Vector2.Distance(LaserPos, SpaceShipPos) > 800) laser.isVisible = false; }

Men i den sista koden säger den att laser finns inte. Hur ska jag gå tillväga, förlåt ifall någon redan svarat på detta, bra på att missa svar i tråden ibland.. xD

Skrivet av EuQ:

Det finns en funktion som heter RemoveAt när det gäller att ta bort objekt ur listor.
Då gör du enklast en for loop som loopar igenom din lista ut av lasrar och kollar sedan ifall den är utanför skärmen. Ifall den är det så tar du list.RemoveAt(i); så kommer den att försvinna ur listan.

List<Laser> laserList = new List<Laser>(); for(int i = 0; i < laserList.Count(); i++) { if(!laserList[i].isVisible) laserList.RemoveAt(i); }

Skrev bara ur minne, ett tag sen jag gjorde något i C#

En fråga:
Det hade jag redan men den koden såg ut såhär:

for (int i = 0; i < lasers.Count; i++) { if (!lasers[i].isVisible) { lasers.RemoveAt(i); i--; } }

Vad gör i-- för skillnad?

Tack för all hjälp förresten, behöver allt jag kan få.

Permalänk
Medlem
Skrivet av LinusNeuman:

Vad gör i-- för skillnad?

Tack för all hjälp förresten, behöver allt jag kan få.

i-- gör att det fungerar överhuvudtaget, men det är fult och dumt. Om du kan bör du använda lasers.Where(x => x.isVisible).ToList(); istället. Den gör samma sak utan att krångla till det.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

i-- gör att det fungerar överhuvudtaget, men det är fult och dumt. Om du kan bör du använda lasers.Where(x => x.isVisible).ToList(); istället. Den gör samma sak utan att krångla till det.

Hm ok.

Spelet är mycket mer stabilt nu, men det laggar fortfarande.
Om ni vill så vill jag gärna att ni tittar in i koden som kan hämtas här för att hitta skit som gör det ostabilt. VÄädigt ostrukturerad kod, men jag tackar på förhand, behöver hjälpen..

Permalänk
Medlem

Kan hålla med om din kod, wow
Vet inte var man ska börja och ge dig tips på, du vill ju inte göra klasser.

Dina if-satser är inge vidare, kolla igenom koden och sätt else där det behövs.
Om en sak bara kan inträffa åtgången så behövs det inte nån check på övriga 100 if-satser.

Sen så har du remove funktioner överallt?
I din updateBullet så kollar du om den behövs tas bort sätt invisible till false?
Sen loopar du igenom alla igen, ta bort om invisible är false?
Varför inte ta bort skottet direkt? skippa invisible helt.
Nu är det formodligen inga större listor du jobbar med.
Men att loopa igenom listorna flera gånger sådär kostar extra, helt onödigt.
Skapa upp en funktion som hantera allt med borttagning av objekt, så allt ligger på ett ställe.
I din loadenemy så tar du även bort där, loadenemy ska väl bara loada?

I din shoot funktion, skapar du upp ett objekt, kollar om det inte är över 20.
Alltså skapa inte upp nåt objekt, skapa bara objektet om du vet att du kan lägga till det, ifsatsen före allt.

I din draw har du massa if-satser, där kan du bryta ut slippa onödiga kollar.
Är ingame == true då gör jag detta else gör jag detta tex.

Kolla igenom hela din kod på ifsatser.

Vi kan börja med detta, så tar vi mer efterhand.
Lycka till

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Skrivet av NoPaiN^:

Kan hålla med om din kod, wow
Vet inte var man ska börja och ge dig tips på, du vill ju inte göra klasser.

Dina if-satser är inge vidare, kolla igenom koden och sätt else där det behövs.
Om en sak bara kan inträffa åtgången så behövs det inte nån check på övriga 100 if-satser.

Sen så har du remove funktioner överallt?
I din updateBullet så kollar du om den behövs tas bort sätt invisible till false?
Sen loopar du igenom alla igen, ta bort om invisible är false?
Varför inte ta bort skottet direkt? skippa invisible helt.
Nu är det formodligen inga större listor du jobbar med.
Men att loopa igenom listorna flera gånger sådär kostar extra, helt onödigt.
Skapa upp en funktion som hantera allt med borttagning av objekt, så allt ligger på ett ställe.
I din loadenemy så tar du även bort där, loadenemy ska väl bara loada?

I din shoot funktion, skapar du upp ett objekt, kollar om det inte är över 20.
Alltså skapa inte upp nåt objekt, skapa bara objektet om du vet att du kan lägga till det, ifsatsen före allt.

I din draw har du massa if-satser, där kan du bryta ut slippa onödiga kollar.
Är ingame == true då gör jag detta else gör jag detta tex.

Kolla igenom hela din kod på ifsatser.

Vi kan börja med detta, så tar vi mer efterhand.
Lycka till

Okej en sak i taget nu..
1. Har inga klasser för att jag lärde mig att använda mig klasser när jag var mitt i programmeringen och pallade inte göra strukturerad kod när det redan var ett shitstorm med kod överallt.
2. Hur gör jag det? Jag använder mig utav:

if (!bullets[i].isVisible) { bullets.RemoveAt(i); i--; }

När den ska tas bort, och då använder den sig utav värdet av i för att bara ta bort bara just den kulan, hur gör jag det utan isVisible?
3. Hmm.. Ska försöka sätta else så ofta jag kan så att den inte kollar om och om igen. Tillbaks efter lite kodning och har satt else if på det mesta, men grovt instabilt fortfarande. Men du som har koden, har du kört det med emulatorn nån gång? Då märker du ju att i spelet så börjar den lagga sönder efter en stund och släpper lös till slut, det måste vara en loop nånstans som inte slutar? Eller? Det måste vi få stopp på i alla fall, det kanske slutar ifall vi fixar alla onödiga foreach loopar!

Permalänk
Medlem

public void UpdateBullets() { foreach (Bullets bullet in bullets) { bullet.position += bullet.velocity; if (bullet.position.X <= 0) { bullet.isVisible = false; } } for (int i = 0; i < bullets.Count; i++) { if (!bullets[i].isVisible) { bullets.RemoveAt(i); i--; } } }

Säg att du har 100skott då och inga behöver tas bort, då loopar du 200gånger istället för 100?

for (int i = 0; i < bullets.Count; i++) { bullet.at(i).position += bullet.at(i).velocity; if (bullet.at(i).position.X <= 0) { bullets.RemoveAt(i); i--; } }

Nåt sånt hoppas du förstår vad jag är ute efter.
Jag har inte kört ditt spel, bara kollat igenom din kod lite snabbt.
Nu vet jag inte hur spelet ser ut, men kan skotten bara gå åt ett håll eller?
Antar att det är ett vanligt sidescroller åt en riktning?

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Skrivet av NoPaiN^:

public void UpdateBullets() { foreach (Bullets bullet in bullets) { bullet.position += bullet.velocity; if (bullet.position.X <= 0) { bullet.isVisible = false; } } for (int i = 0; i < bullets.Count; i++) { if (!bullets[i].isVisible) { bullets.RemoveAt(i); i--; } } }

Säg att du har 100skott då och inga behöver tas bort, då loopar du 200gånger istället för 100?

for (int i = 0; i < bullets.Count; i++) { bullet.at(i).position += bullet.at(i).velocity; if (bullet.at(i).position.X <= 0) { bullets.RemoveAt(i); i--; } }

Nåt sånt hoppas du förstår vad jag är ute efter.
Jag har inte kört ditt spel, bara kollat igenom din kod lite snabbt.
Nu vet jag inte hur spelet ser ut, men kan skotten bara gå åt ett håll eller?
Antar att det är ett vanligt sidescroller åt en riktning?

AHA!
Smart!

Dock så säger den att bullets.at inte finns, testat med stort A också. :/

Yes, det är en sidescroller!
Du får gärna köra spelet annars!

Permalänk
Medlem
Skrivet av LinusNeuman:

AHA!
Smart!

Dock så säger den att bullets.at inte finns, testat med stort A också. :/

Yes, det är en sidescroller!
Du får gärna köra spelet annars!

Ett tips kan vara att ha nån form av referens till det du arbetar med, jag tog bara ett exempel.
Det borde finnas nån liknande syntax för din lista, tex elementAt, indexOf eller dylikt.

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770