| Autor |
Beitrag |
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mo 21.09.09 17:22
ich bekomme beim verändern der höhe einer tbitmap die meldung "nicht genügend speicher verfügbar"
ok die bitmap wird versucht auf eine höhe von 18000*2000 px zu setzen, das sind aber selbst bei 4 byte pro pixel gerade mal 200MB oder so.
taskmanager zeit an dass insgesammt 900MB belegt sind (von 2GB!)
was hat der fehler also für eine ursache?
und wie kann ich den speicherverbrauch eines programms anzeigen lassen?
den besagtes program wird im taskmanager immer konstant mit 12MB angezeigt.
kann ja nicht stimmen
|
|
PreMarT
      
Beiträge: 57
Work: Win XP ; Home: Win Vista 64-Bit
|
Verfasst: Mo 21.09.09 17:36
Das liegt nicht an deinem Ram, du musst mehr speicherplatz freigeben in Delphi selbst, aber frag mich nicht wie das geht, ich habs vergessen 
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mo 21.09.09 18:39
gibt es denn keine möglichkeit, den tatsächlichen speicherverbrauch anzeigen zu lassen?
würde z.b. mal gerne wissen, was diverse speicheroptimierungen tatsächlich bringen oder wieviel speicher meine strukturen belegen
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Mo 21.09.09 18:45
ich glaube, dieses thema hatten wir in den letzten Tagen öfters. Ich hab zwar von Speicher usw. eigentlich keine Ahnung, meine mich aber zu erinnern, dass das damit zu tun haben könnte, dass im Speicher seltenst 200mb am STÜCK frei sind. Daher ein Riesen-Bitmap am besten in mehrere kleine Zerlegen und bei Bedarf zeichnen.
(ohne Gewähr)
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 22.09.09 10:05
Korrekt: 200MB am Stück kann man eigentlich vergessen. kleinere Kacheln, ähnlich wie es z.B. GoogleMaps oder OpenStreetMap bei ihrer Karte machen, sind da um einiges besser. Bei OSM sind das wohl (bis zu) 2^18 Kacheln in X- und Y-Richtung (je 56px Kantenlänge), also 16 EiB (im höchsten Layer) ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 22.09.09 10:21
gut das macht sinn
kann mir jetzt noch jemand sagen, wie ich den tatsächlichen speicherverbrauch anzeigen lassen kann?
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Di 22.09.09 12:08
Das Problem könnte in deinem Fall auch noch ein Anderes (nicht gesetztes Pixelformat) sein. Zu mindest spricht dein Speicherverbrauch von 12 MB da dafür. Ich hatte vor knapp 2 Wochen in einer anderen Sparte zu genau dem gleichem Thema was geschrieben.
Und ja. Je größer der Speicherbereich wird desto unwahrscheinlicher, dass er in den Speicher passt. Dazu steht auch was in meinem Post. Wurde hier aber auch schon gesagt.
[edit] PS: Der Speicherverbrauch wird wohl deswegen nicht angezeigt weil du wohl Speicher deiner Grafikkarte benutzt hast. Der wird vom TaskManager nicht erfasst.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 22.09.09 13:01
ok super
problem: wenn ich das pixelformat auf was andres als pfdevice setze, kann ich bitplt nicht mehr verwenden
er macht dann einfach nichts
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Di 22.09.09 13:21
Wo zeichnest du das denn drauf? Ist das auch pfdevice oder 24/32 Bit? Normal hat das bei mir bisher immer geklappt. So weit ich mich erinnern kann. 
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Di 22.09.09 13:29
auf ein timage zeichne ich...
mit ner tpaintbox und stattdessen auf eine zwischen bitmap zu zeichnen geht es.
nur flackert da das bild 
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mi 23.09.09 09:50
Eventuell könntest du bei dem TImage ja auch ein passendes Pixelformat setzen. Wobei ich persönlich nur sehr ungern ein TImage für so etwas benutze. Am liebsten beutze ich für so etwas eine eigene Ableitung von TGraphicControl oder TPanel. Damit wäre es dann recht einfach möglich auch selber noch Tastaturevents zu bekommen. Aber das ist ein anderes Thema.
Bei einer PaintBox besteht meiner Meinung nach durchaus noch das Problem, dass zu erst immer das Form gezeichnet wird und anschließend erst die PaintBox. Selbst wenn du das Bild also in einem TBitmap zwischenspeicherst dürfte es beim Zeichnen flackern. Direkt auf die Paintbox zu zeichnen fällt auch raus, da man dann sieht wie sich das Bild aufbaut. Also ich würde so sagen, dass folgende Möglichkeiten Hast.
- Du kannst direkt im Form.OnPaint zeichnen. Damit wird es immer direkt dann gezeichnet wenn dein Form neu gezeichnet wird.
- Du kannst auch ein Panel (im Gegensatz zur PaintBox ist das ein echtes Fenster von Windows) unter die Paintbox packen. Oder andersrum. Die Paintbox hirarisch auf einem Panel.
Bei der Lösung mit einem Panel musst du mal schauen. Das Panel hat eine Eigenschaft FullRepaint. Mal testen ob das schon was bringt, wenn du diese auf false setzt. Wenn nicht kannst du von dem Panel auch mal DoubleBuffered auf true setzen. Wenn du das Bild wirklich immer komplett zeichnest könntest du auch csOpaque zum ControlStyle hinzufügen. Dadurch würde das Fenster nicht mehr gelöscht werden, wenn irgendwie etwas drübergezeichnet würde.
Aber wie gesagt. Wenn ich eine Komponente haben will auf der ich selber zeichne, dann gehe ich mittlerweile nur noch her und leite eben selber eine Komponente ab. Damit fahre ich am Besten.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mi 23.09.09 10:24
es flackert immer beim bewegen des images, also wenn ich die bitmaps neu auf der paintbox positioniere (bitblt)
durch doublebuffered wurde es besser
aber mit dem panel wieder verdammt schlecht.
trotz aller versuche mit doublebuffered und fullrepaint
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 23.09.09 10:28
WM_ERASEBACKGROUND überschreiben könnte hier einiges bringen ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mi 23.09.09 11:26
csOpaque hat den gleichen Effekt wie WS_ERASEBACKGROUND. Nur muss man dabei die Komponente nicht überscheiben.
Aber ich denke dein Problem ist ein generelles Problem der Paintbox. Ich habe im Downloadbereich meiner Webseite eine Datei namens AdvancedPanel.zip. Dort ist eine Unit mit einem erweiterten Panel enthalten. Das Panel reicht ein bereits vorhandenes Canvas nach außen und bietet das Ereignis OnPaint an. Außerdem wird WM_ERASEBKGND abgefangen und es ist in der Lage einen Fokus zu bekommen und Cursortasten zu empfangen. Das hatte ich irgendwann mal für OpenGL geschrieben aber sollte auch in der GDI seinen Zweck erfüllen.
Wichtig ist, dass du innerhalb von OnPaint zeichnest und ein Neuzeichnen von Außen durch Repaint anstößt. Dadurch hast du auch nur eine Stelle an der du Zeichnest. Auch wichtig ist, dass du innerhalb von OnPaint immer den kompletten Bereich es Panels malst, da andere Stellen sonst den Inhalt behalten würden. Also zum Beispiel ein darüber gezogenes Fenster bleibt an den Stellen erhalten. Und ach ja. Das würde ich komplett anstelle deiner PaintBox bzw dem eventuellen Panel benutzen. Dann solltest du keine Probleme mehr haben.
PS: Wenn du keine Tabs haben willst, dann TabStop auf False und eventuell die Methoden Click und CreateParams auskommentieren. Also Deklaration und Implementation.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mi 23.09.09 11:59
ok ich gucks mir mal an...
hab grade mal die bitmaps von pfDevice auf pf32Bit umgestellt und maximal vergrößert: 1GB speicherverbrauch...
kein wunder das meine 512MB graka überfordert war
habs auf pf8Bit da gehn die 256MB speicher
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mi 23.09.09 12:02
Flamefire hat folgendes geschrieben : | hab grade mal die bitmaps von pfDevice auf pf32Bit umgestellt und maximal vergrößert: 1GB speicherverbrauch...
kein wunder das meine 512MB graka überfordert war |
Das kommt wohl auch noch hinzu. Aber je nach Grafikkarte kann es sein, dass da bei 3000x3000 Pixeln schluss ist. Also die Größe der Einzelbilder ist bei den geräteabhängigen Bitmaps beschränkt. Selbst wenn genügend Speicher vorhanden ist.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mi 23.09.09 12:33
ich hatte es ja in kleinere bmps unterteilt
mit dem advancedpanel habe ich das gleiche problem. beim verschieben flickert es immer noch. aber nur bei ner kleinen zoomstufe (also viele kacheln anzeigen)
habs versucht mit 2 bitmaps: eine auf der die bmps zusammengesetzt werden und eine auf die das resultat am ende kopiert wird und von der aus dann auf die painbox gezeichnet wird
keine veränderung
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mi 23.09.09 15:34
Flamefire hat folgendes geschrieben : | | ... auf die das resultat am ende kopiert wird und von der aus dann auf die painbox gezeichnet wird |
Paintbox? Ich hatte ja gesagt, dass ich die Paintbox generell dafür verantwortlich mache. Entsprechend meinte ich ja auch, dass du direkt auf das Canvas des Panels (innerhalb von OnPaint des Panels) zeichnen solltest.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Flamefire 
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mi 23.09.09 16:06
hatte ja beides ausprobiert
was ich hatte:
im onpaint mit bitblt von BM1 auf das canvas des panels bzw der paintbox malen
beim verschieben das neue bild auf BM2 aus den kacheln zusammensetzen und nach fertigstellung auf BM1 kopieren (um zu vermeiden das u.U. n halbfertiges bild gemalt wird)
aber immer noch leichtes flickern
aber egal..ist nicht so wichtig, wäre es was einfaches gewesen, hätte ich es noch gemacht. aber so wirds langsam den aufwand nicht wert
|
|