Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

1

07.04.2021, 10:49

[C#] 2-dimensionales Array speichern

Hi,

ich suche eine möglichst performate Lösung für mein Problem.
Ich benötigt eine Möglichkeit, ein 2-dimensionals Array aus short-Werten zu speichern.

Dabei ist die Größe und die Start- und Endwerte der Keys nicht bekannt. (können auch negativ sein)
Genauer gesagt will ich eine 2D Tilemap speichern, die prozedual mit der Spieler-Bewegung generiert wird.

Das Ganze soll in C# (Unity) implementiert werden.


Ich hatte eine kleine Klasse gefunden, die das mit einem Dictionary macht, weis aber nicht wie performant das ist, wenn da einige tausend Werte drin gespeichert werden.
Hier die Klasse:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Matrix2D<T>
{    
    private Dictionary<string, T> Data = new Dictionary<string, T>();
    public T this[int x, int y]
    {
        get
        {
            string key = this.GetKey(x, y);
            return Data.ContainsKey(key) ? Data[key] : default(T);
        }
        set
        {
            string key = this.GetKey(x, y);
            if (value == null)
                Data.Remove(key);
            else
                Data[key] = value;
        }
    }

    private string GetKey(int x, int y)
    {
        return String.Join(",", new[] { x, y });
    }
}


Gibt es eine bessere Lösung?



Gruß

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

07.04.2021, 13:07

Also einen String als Key zu benutzen ist gar nicht gut. Wenn du schon ein Dictionary nutzt, dann baue die beiden int-Werte (x und y) doch einfach zu einem long zusammen, den du dann als Key benutzt: ((long)x << 32) | (long)y.
Probier es mal damit, und wenn es Performance-Probleme gibt (Profiler nutzen!), dann schauen wir weiter.

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

3

07.04.2021, 13:08

Hi,

stimmt, das ist eine gute Idee, darauf bin ich garnicht gekommen.
Ich probier es aus, vielen Dank



Gruß

Werbeanzeige