Gå til innhold

C#: lager multiplayer snake, problem med minnebruk


Anbefalte innlegg

Jeg har begynt å lage et multiplayer snake-spill (ikke nettverk), noe ala dette:

http://www.worldoffreegames.com/factsheet.php?id=79

 

Problemet mitt er dette:

jeg bruker System.Drawing.PointF til å lagre posisjonen til hver snake, og alle posisjonene den har hatt.

 

Jeg har et array på 5 slanger, og hver av dem inneholder en slik liste:

List<PointF> positionLog = new List<PointF>();

Dette bruker jeg til å sjekke når en slange kjører inn i en annen. Problemet med dette er at det etter en stund tar fryktelig mye minne, og slangen går etter en stund litt hakkete. Kanskje ikke så rart, med tanke på hvor mange objekter den sjekker sin egen posisjon mot opptil flere ganger i sekundet. :p

 

Hvis maks antall spillere spiller en vanlig lang runde vil programmet fort vekk bruke over 5000 objekter, og kanskje nærmere 100mb minne. Jeg har funnet ut at dette er en fryktelig tungvint måte å gjøre det på, selv om det funket greit når jeg gjorde det i et tidligere single-player snake-spill jeg lagde, for da ble det ikke på langt nær så mange objekter.

 

Det jeg da lurer på er om noen har et godt forslag til måte å sjekke om en orm krasjer i en annen, uten å lagre hver eneste posisjon til en list, slik jeg gjør nå.

Lenke til kommentar
Videoannonse
Annonse

Ved så mange objekter vil det kanskje være bedre med en vanlig array.

 

For å optimize enda mer kan man kanskje bruke int istedenfor Point også.

 

int[] SnakeX = new int[MaxSize];

int[] SnakeY = new int[MaxSize];

 

 

En enklere løsning:

 

Evt, om du ikke har et alt for stort brett:

 

int[] Board = new int[1024 * 768];

og bruke denne til kolisjonstesting.

Og ha slangene dine i en vanlig List<Point> for å fjerne "pikslene" på Board.

 

Slangene må tegne en piksel på Board[X + Y * 1024] med sin "ID". Når slangen forsvinner tegner den Board[EndX + EndY * 1024] = 0;

Lenke til kommentar

ahh, såklart!

Det vil vel funke å gjøre noe slikt?

bool[,] brett = new bool[800,600];

 

og hver gang en snake flytter seg setter bare f.eks.

for(int i = 0; i < snakes.Count; i++)
{
   if( brett[snakes[i].X, snakes[i].Y] == true )
       // Kode for å dø her
       // continue

   brett[snakes[i].X, snakes[i].Y] = true;

   // Mer kode for å tegne her
}

 

Slangen skal ikke ha en fast lengde slik at bakenden flytter seg etter slangen, men alltid ha bakenden på samme sted. Så hvis en slange kjører gjennom et punkt, vil det punktet alltid være "opptatt". Det må vel hvertfall være en ganske optimal løsning mtp. minne!

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...