2017-08-30 2 views
0

Ich mache ein Spiel auf C#. Das Problem ist, dass es große Mengen an RAM für die Spiele dieser Art und Qualität verwendet.Das Spiel, das ich mache verbraucht viel zu viel Speicher

Ich werde versuchen, eine kurze, aber gut genug Beschreibung zu geben. Natürlich gebe ich keinen vollständigen Code, aber versuche zu zeigen, was ich für relevant halte.

Das Spiel hat einige Gitter, wobei jedes Gitter ein Spielzimmer darstellt, in jedem Gitter gibt es Bilder und Knöpfe. Die Bilder sind immer statische Bilder. Aber es gibt viele Bilder und Schaltflächen.

Bei meiner ersten Annäherung entschied ich, jede Bild- und Tonquelle in einer Liste oder einem Wörterbuch zu speichern, diese Listen und Wörterbücher werden beim Spielstart erstellt und nur einmal erstellt.

Wörterbücher speichern Bild oder Schaltfläche oder Grid-Name und seine ursprüngliche Quelldatei von XAML. Sie werden auch am Anfang und nur einmal geladen.

 image_path.Add("imgBloodyPodBlood", imgBloodyPodBlood.Source.ToString()); 
     image_path.Add("imgBloodyPodShardsBlood", imgBloodyPodShardsBlood.Source.ToString()); 
     image_path.Add("imgComputerConversation", imgComputerConversation.Source.ToString()); 

Danach setze ich Quelle für alle bestehenden Kontrollen auf null:

 imgBloodyPodBlood.Source = null; 
     imgBloodyPodShardsBlood.Source = null; 
     imgComputerConversation.Source = null; 

    void ShowAirlock() 
    { 
     areaAirlock.Background = new ImageBrush(new BitmapImage(new Uri(area_path[areaAirlock.Name.ToString()], UriKind.Relative))); 
     imgAirlock_Dark.Source = new BitmapImage(new Uri(image_path[imgAirlock_Dark.Name.ToString()])); 
     imgAirlock_Dark_Door.Source = new BitmapImage(new Uri(image_path[imgAirlock_Dark_Door.Name.ToString()])); 
     imgAirlock_Dark_Suit.Source = new BitmapImage(new Uri(image_path[imgAirlock_Dark_Suit.Name.ToString()])); 
     imgAirlock_Light_Door.Source = new BitmapImage(new Uri(image_path[imgAirlock_Light_Door.Name.ToString()])); 
     imgAirlock_Light_Suit.Source = new BitmapImage(new Uri(image_path[imgAirlock_Light_Suit.Name.ToString()])); 
     imgAirlockLamp.Source = new BitmapImage(new Uri(image_path[imgAirlockLamp.Name.ToString()]));    
    } 

Und wenn lade ich ein Zimmer, seine Kontrollen und nur werden sie geladen:

void ShowAirlock() 
    { 
     areaAirlock.Background = new ImageBrush(new BitmapImage(new Uri(area_path[areaAirlock.Name.ToString()], UriKind.Relative))); 
     imgAirlock_Dark.Source = new BitmapImage(new Uri(image_path[imgAirlock_Dark.Name.ToString()])); 
     imgAirlock_Dark_Door.Source = new BitmapImage(new Uri(image_path[imgAirlock_Dark_Door.Name.ToString()])); 
     imgAirlock_Dark_Suit.Source = new BitmapImage(new Uri(image_path[imgAirlock_Dark_Suit.Name.ToString()])); 
     imgAirlock_Light_Door.Source = new BitmapImage(new Uri(image_path[imgAirlock_Light_Door.Name.ToString()])); 
     imgAirlock_Light_Suit.Source = new BitmapImage(new Uri(image_path[imgAirlock_Light_Suit.Name.ToString()])); 
     imgAirlockLamp.Source = new BitmapImage(new Uri(image_path[imgAirlockLamp.Name.ToString()]));    
    } 

Wenn Ich lade den neuen Raum, annulliere alle Objekte des alten. Ich verwende den gleichen Ansatz mit Sounds, Videos und sogar Gittern - ihre Quelle wird nur geladen, wenn sie aktiv sind, und auf Null geändert, wenn sie nicht mehr verwendet werden.

Ich mache es, um zu vermeiden, alle Bilder und Sounds im RAM zu speichern.

Das Problem ist, dass das Spiel trotz all dem Spiel immer noch sehr viel Speicher verbraucht, für die Spiele dieser Komplexitätsebene.

Der Standard-Speicherverbrauch beträgt etwa 700M - und ich finde es zu viel.

Was ich vermute, dass Wörterbücher und Listen, die für Steuerelemente und nicht Zeichenfolgen sind, den gesamten Speicher verbrauchen.

Zum Beispiel, ich denke, das macht man eine Kopie jedes Raster:

Dictionary<string, Grid> ResGrids = new Dictionary<string, Grid>();

Meine Fragen:

1) Gibt es eine Möglichkeit Ansatz zu verwenden, die ich jetzt mit: Speichern aller steuert Quellen, macht sie ungültig, lädt nur die benötigten, aber verbessert sie? 2) Gibt es eine Möglichkeit, Informationen wie diese in einer Datei zu speichern, um eine Datei für jedes Wörterbuch oder eine Liste zu erstellen, und dann von ihnen Daten für die verwendeten Steuerelemente zu laden. 3) Gibt es eine bessere Möglichkeit, die Speichernutzung zu reduzieren, ohne zu drastische Änderungen vorzunehmen?

Vielen Dank im Voraus, Jewgenij

+0

Schauen Sie sich um, ich denke, das Problem ist, dass Sie [die BitmapImage] einfrieren müssen (https: //stackoverflow.com/a/802394/1270789), sonst lädt man anscheinend jedes Mal eine neue Kopie der Bitmap. Alternativ können Sie die BitmapImage nur einmal erstellen. –

+0

"Was ich vermute, [...]" Das ist wahrscheinlich dein erstes Problem - du solltest nicht vermuten, dass du es wissen solltest, bevor du versuchst, etwas zu verbessern. Visual Studio bietet Ihnen gute Tools, um die Leistung Ihrer Apps, einschließlich der Speichernutzung, in Form ihrer Diagnosetools zu messen. Das Erstellen eines Speicher-Snapshots gibt Ihnen wahrscheinlich genügend hilfreiche Informationen, um Ihr Problem zu identifizieren, falls es eines gibt. – Milster

Antwort

0

Run Performance-Tests (Alt + F2 in VS), dann wissen Sie, wo der App RAM verbraucht.

Auch Sie haben nicht viel Code geschrieben, so dass es schwer sein wird, Ihnen direkt zu helfen, aber die Aufrechterhaltung so viel Dictionaries ist wahrscheinlich keine gute Idee. Gehen Sie nach OOP und erstellen Sie spezifische Objekte für jeden Raum, der alle benötigten Daten enthält. Und das ist nur die Initialisierung, wir wissen nicht, was Sie mit diesem Code später tun, so ist es schwer zu helfen

Verwandte Themen