Speicher läuft voll :-( bei DrawPixmap ?
Übersicht

![]() |
Markus2Betreff: Speicher läuft voll :-( bei DrawPixmap ? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kann es sein das bei DrawPixmap der Speicher voll läuft ???
V1.10 |
||
![]() |
Suco-XBetreff: ....... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi
Läuft bei diesem Beispiel dein Speicher voll? Code: [AUSKLAPPEN] Strict Graphics 800,600,0 Cls SetColor 255,0,0 DrawOval 0,0,256,256 Local testpixmap = GrabPixmap(0,0,256,256) Repeat Cls DrawPixmap testpixmap,100,100 DrawText "Mem Alloced: "+MemAlloced(), 10,10 Flip FlushMem() Until KeyHit(KEY_ESCAPE) Oder hast du eher Flushmem vergessen. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Suco-X
Mit FlushMem nicht !? Aber wieso muß ich FlushMem benutzen wenn ich nur eine Pixmap anzeige ??? Code: [AUSKLAPPEN] Strict Graphics 800,600,0 Cls SetColor 255,0,0 DrawOval 0,0,256,256 Local testpixmap = GrabPixmap(0,0,256,256) Repeat Cls DrawPixmap testpixmap,100,100 DrawText "Mem Alloced: "+MemAlloced(), 10,10 Flip 'FlushMem() Until KeyHit(KEY_ESCAPE) |
||
![]() |
Suco-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi
Weil intern wohl Speicher verwendet wird..Ist bei jeder Kleinigkeit so. Aber was solls, Flushmem stört doch nicht, benutz es einfach. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mich stört sowas weil ich nicht weiß welche Befehle
den Speicher nicht wieder frei geben . Wenn ich ein Objekt selber auf NULL setzte und später FlushMem benutze ist es OK . Ich poste es mal im Blitz Forum . |
||
![]() |
Suco-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kein Befehl gibt den Speicher wieder frei.
Mark sagte doch schon, die Spielschleife in Bmax sollte deswegen immer so Code: [AUSKLAPPEN] repeat cls flip [b]flushmem()[/b] until .. aussehen. Ich denke einmalig pro Schleifendurchlauf Flushmem aufrufen ist etwas besser als wenn 200 Befehle den Speicher immer extra freigeben. Selbst DrawText würde deinen Speicher vollmüllen wenn du nicht selbst Flushmem aufrufst. Es ist also nichtmal ein Pixmap Spezifisches Problem. Ich erkenne immernoch nicht dein Problem und den Eintrag im Englischen Bug Forum kann ich absolut nicht verstehen. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Warum es den Speicher "vollmüllt": Bei DrawImage / DrawPixmap oder sonst irgend einem befehl werden, wie für richtiges OO typisch, kopien deines Objektes für die Operation verwendet. Ohne Flushmem jedoch werden diese Kopien nicht mehr aus dem System entfernt, denn wie die Hilfe ja schreibt, ist Flushmem dazu da, unbenutzten Speicher freizugeben. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Suco-X
Oh,wuste nicht das fast alles den Speicher zu müllt . Ist aber sehr untypisch und den Sinn versteh ich dabei nicht ! |
||
Nemesis |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
bei drawpixmap wird meines wissens intern in ein image konvertiert und deshalb wird speicher benötigt. | ||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Dreamora
Trotzdem sollte die Speicherverwaltung aufgeteilt werden finde ich . Wenn Mark meint das er extra Speicher reservieren muß dann soll er ihn auch direkt wieder frei geben . Wenn ich Speicher reserviere muß ich mich selber drum kümmern wann ich ihn frei gebe und wenn ich das Programm beende sollte BlitzMax das für mich tun falls ich es vergessen habe . So war es ja in Blitz3D auch . In VB6 ist es auch so (außer bei APIs) . Wie es jetzt ist finde ich es doof . >denn wie die Hilfe ja schreibt, ist Flushmem dazu da, unbenutzten Speicher freizugeben. Hatte ich gelesen aber dachte es wäre dann zu gebrauchen wenn man selber Objekte auf NULL setzt . |
||
![]() |
regaa |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mir ist das Thema zwar nicht neu (Grüße an Dreamora ![]() |
||
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@regaa
vieleicht kann du es Mark mal auf englisch erklären was wir davon halten . |
||
![]() |
regaa |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, ich versuch es:
flushmem() is bullshit! Ist das gutes Englisch? Ist es nun so oder nicht, das andere Sprachen den GarbageCollector automatisch verwalten? |
||
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net |
![]() |
Suco-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ah, das Speichermanagement ist gut durchdacht und es gibt daran nichts auszusetzen. Als nächstes wollt ihr noch die tollen OO Features loswerden? ![]() Ja ne, aber bitte überdenkt das "Feature" mit dem Speichermanagement nochmal und blamiert die Deutschen da drüben nicht mit irgendwelchen veralteten ansichten von Speicherverwaltung. EDIT: @Regaa: Blitz Max ist keine andere Sprache und du gehst hier wegen einem Befehl auf die Barikaden. Lächerlich find ich. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
regaa |
![]() Antworten mit Zitat ![]() |
---|---|---|
regaa hat Folgendes geschrieben: Mir ist das Thema zwar nicht neu (Grüße an Dreamora
![]() Da oben LESEN. Ausserdem hab nicht ich, sondern Markus den Thread gestartet. |
||
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
"Warum Image nicht von selbst freigegeben wird nach DrawPixmap": Es wird nicht konvertiert. Es wird "direkt" gezeichnet (so direkt wie es halt in OpenGL möglich ist). Allerdings werden dabei lokale Variablen genutzt um den Zeichenstate von "vor dem DrawPixmap" wieder herstellen zu können, da Pixmap zb den BlendMode ignorieren.
Warum man den Befehl "FlushMem" selbst benutzen muss: Da BM nicht eventbasierend ist, kann man nicht dynamisch auf die Auslastung eingehen. Insofern ist es für den Normalfall die einfachste Variante. Und so schwer ist es nicht prinzipiell in die Hauptschleife ein Flushmem einzubauen. Denn an einem anderen Ebene ausser der "Grundebene" darf der Befehl ohnehin nicht sein. Alternativen Freigabemöglichkeiten: Direkt: Würde vielleicht gehen. Aber wär langsam und würde den Sinn eines managed Systems aushebeln. Darüber hinaus wäre es extrem langsam und ineffizient. Manuell: So läuft es aktuell. Dadurch könnt ihr selbst bestimmen, wann es geschehen soll. zB nach dem freigeben flushmem aufrufen oder bei jedem Schleifendurchlauf oder wenn eine gewisse Menge an Speicher alloziert ist, was durchaus auch eine Möglichkeit wäre, die wahrscheinlich noch kaum jemand nutzt bisher. Automatisch: Da der GarbageCollector nicht Gott und/oder allwissend ist, gibt es speziell im Multimediabereich einige Fälle wo so eine Automatik tödlich ist (ich denke da nur an 3D Terrain wie das von B3D wo zigfach pro Sekunde Vertices und Triangles freigegeben werden und neue dazu kommen). Deshalb wäre das definitiv keine sinnvolle Idee wenn man sie als "einzige" Möglichkeit nutzt. Allerdings wäre eine Implementation wie in Eiffel und so denkbar und ich würde sie auch bevorzugen. Dort ist das GarbageCollecting normalerweise automatisch, aber der Collector ist als Objekt im System definiert, so das man ihn auf Wunsch manuell kontrollieren kann (zum Beispiel zwingend notwendig wenn man mit unmanaged externen Libraries wie SDL bindet) EDIT: C# und VB.NET haben vielleicht diesen Befehl nicht. Aber vielleicht ist dir aufgefallen das dort jahrelang mehrere duzend Programmierer dran gearbeitet haben, damit das System einigermassen läuft. Und selbst jetzt ist es noch nicht so gut, dass man C# wirklich brauchen könnte, denn erst VS.NET 2005 bietet in C# die Möglichkeit zu generic programming, was das A und O von OOP ist. Auch der GarbageCollector hat mitunter noch so seine Maken ... (.NET 1.0 war so ziemlich der horror ... erst 1.1 also VS.NET 2003, wurde "akzeptabel") |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
- Zuletzt bearbeitet von Dreamora am So, Jun 26, 2005 21:07, insgesamt einmal bearbeitet
![]() |
Suco-XBetreff: ..... |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Regaa : Ja, ich habs gelesen. Für dich war auch der Editierte Satz gedacht.
Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
regaa |
![]() Antworten mit Zitat ![]() |
---|---|---|
Na gut, habt gewonnen. | ||
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Dreamora
>Direkt: Würde vielleicht gehen. Aber wär langsam und würde den Sinn >eines managed Systems aushebeln. Darüber hinaus wäre es extrem >langsam und ineffizient. Hi, erkläre mir mal bitte warum das langsamer sein soll . Wenn man 10x Speicher reserviert und den mit FlushMem wieder frei gibt wird der doch auch 10x freigegeben weil das einzelne Blöcke sind oder !? Außerdem habe ich nicht das Gefühl das BMax den Speicher recycelt(wieder benutzt) wenn die Größe gleich bleibt und man den gleichen Befehl öffters auf ruft . |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Doch tut es. Kannst du über MemUsage () ja mal austesten.
Und warum es langsamer wäre: Weil dann der GarbageCollector nach jedem Befehl überprüfen müsste, ob in der Liste ALLER existierende Objekte eines freigegeben werden müsste. Das gibt bei mehreren hundert bis tausend "Überprüfungsevents" das sagenhafte Resultat, dass der GC ausser überprüfen garnix mehr tut, sprich du noch 2 FPS hast wenn du irgendwie aktiv mit Objekten arbeitest deren Referencecounter sich verändern. Das Problem würde sich mit Root-Reference Counter nochmal drastisch verschärfen (diese hat es aktuell ?noch? nicht, deshalb kanns zu toten Objekten und Datenmüll kommen wenn man zyklische Listen an ihrem Startpunkt abkoppelt und meint die würden dann freigegeben) Das war auch eines der Probleme der ersten managed Sprachen, die an genau diesem Problem gescheitert sind, dass sie zuviel Zeit ins managen steckten und so keinen wirklichen Vorteil mehr daraus ziehen konnten. Ein anderes Problem habe ich ja oben mit dem fehlenden Root Reference genannt, von dem ich erhoffe / erwarte, dass Mark es baldmöglichst einbaut ... denn sonst werden wir wohl bald gezwungen sein, das selbst einzubauen, da ich auf dauer nicht lust habe, den GC mit zusatzstrukturen zu überwachen um massiven Leaks vorzubeugen, nur weil dieser Counter fehlt. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group