Extremer Speicherverbrauch WPF/C#

OP #3500910
Lesenswert?
• ▲
▼
Hallo,

ich entwickle zur Zeit mit Ms-VS 2012 Professional eine technische 
Software. Kurz gesagt sollen Anwender ohne spezielle Schulung in der 
Lage sein, das Programm zu bedienen. Daher habe ich möglichst viele 
Sinnbilder (ca. 30 in Resourcendatei - eingebettet- ) für komplexe 
Operation verwendet, die sogar ein Gehirnamputierter nicht 
fehlinterpretieren kann. Ein Blick in den Resourcenmonitor hat mir gerde 
den Tag versaut, denn die gesamte Anwendung verbraucht jetzt schon rund 
600 MiB an Speicherplatz. Bei der Fehlersuche ist mir dann aufgefallen, 
daß dies tatsächlich an den als Typ Resource eingebundenen Bildern 
liegt!? Wenn ich kurzer Hand alle lösche, schrumpft der 
Speicherverbrauch auf - für heutige Zeiten - vertretbare 60 MiB. Also 
fasst 10mal weniger! Hat jemand eine Erklärung dafür bzw. einen Tip wie 
ich den Speicherverbrauch der Anwendung in einen normalen Bereich 
bringe?

Viele Grüße
OP #3501040
Lesenswert?
• ▲
▼
Hallo,

nein es sind alles ausschließlich PNG/JPEG Dateien.
Ich habe den Fehler jetzt zurückverfolgt. Es liegt tatsächlich nur an 
vier Bildern, die in vier Steuerelementen vom Typ Boder als Background 
festgelegt sind. Eine Idee warum vier einzelne JPEG-Bilder rund 500 MiB 
Speicher verbrauchen?

Auch wenn in der Code-behind Datei ein einzelnes Bild manuell als Border 
Hintergrund lade, steigt sofort der Speicherverbrauch um ca. 100MiB!?

1
borderStandartNpt.Background = new ImageBrush(new BitmapImage(new Uri(@"pack://application:,,,/GCodeGenerator;component/Resources/NPTkeinEingriff.jpg")));
Gruß
Gast #3501072
Lesenswert?
• ▲
▼
K.A., aber evtl. mal so etwas (oder draran angelehnt) ausprobieren:
1
public static System.Windows.Media.Brush CreateBrushFromBitmap(Bitmap bmp)
2
{
3
  IntPtr hBitMap = bmp.GetHbitmap();
4
  ImageBrush b = new ImageBrush(Imaging.CreateBitmapSourceFromHBitmap(hBitMap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()));
5
  DeleteObject(hBitMap);
6
  return b;
7
}
Gast #3501938
Lesenswert?
• ▲
▼
Jedes MAl wenn du dein Bild instanzierst wird es NEU in den Speicher 
geladen.
Bilder kann man Freezen wenn man die wiederverwenden möchsten.

Von Microsoft gibt es für WPF recht ausführliche Performance Guidelines 
an die man sich halten kann.
OP #3502817
Lesenswert?
• ▲
▼
Hallo,

ich habe den Fehler mittlerweile gefunden. Der Fehler lag darin, daß die 
ursprünglich verwendeten Bilder knapp 500KiB groß waren. Beim erstellen 
des ImageBrush wurde durch das große Bildformat und die hohe 
Bildqualität enorm viel Speicher alloziert. Pro Bild ca. 100MiB!!

Ein neuskalieren auf kleinere Dimensionen sowie eine höhere 
Bildkompression haben das Problem dann gelöst, sodaß der Speicherbedarf 
der Anwendung jetzt "nur" noch rund 70 MiB beträgt. Die selbe Anwendung 
hatte ich vor ein paar Jahren mit Delphi 7 umgesetzt und der 
Speicherverbrauch des Programms zur Laufzeit lag bei knapp 10 MiB!

Grüße
Gast #3502829
Lesenswert?
• ▲
▼
Was sind das für Bilder?

ein PNG bild mit 1200 x 1024 ist 200kbyte groß. Machst du etwa FullHD 
Bilder auf deine Buttons?

dafür verwendet man doch maximal 200x200 Pixel und dann kommt mal auf 
weniger als 10kbyte.

Ich denke es liegt mehr an euch als ans C# das der Speicherverbrauch so 
hoch ist.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren