Speicher läuft voll :-( bei DrawPixmap ?

Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Markus2

Betreff: Speicher läuft voll :-( bei DrawPixmap ?

BeitragFr, Jun 24, 2005 23:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann es sein das bei DrawPixmap der Speicher voll läuft ???
V1.10

Suco-X

Betreff: .......

BeitragSa, Jun 25, 2005 7:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jun 25, 2005 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
@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-X

Betreff: ......

BeitragSa, Jun 25, 2005 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jun 25, 2005 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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-X

Betreff: ......

BeitragSa, Jun 25, 2005 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 26, 2005 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jun 26, 2005 13:01
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragSo, Jun 26, 2005 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
bei drawpixmap wird meines wissens intern in ein image konvertiert und deshalb wird speicher benötigt.

Markus2

BeitragSo, Jun 26, 2005 13:17
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragSo, Jun 26, 2005 14:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir ist das Thema zwar nicht neu (Grüße an Dreamora Wink), aber ich finde es auch irgendwie dämlich das man den Befehl in die Mainloop reinsetzen muss. Warum nicht automatisch? Da wo keine Referenz zum Objekt gibt, einfach das Objekt automatisch vom Speicher entfernen. Gut, das ist zwar jetzt nicht Die Mühe diesen einen Befehl reinzuschreiben, aber das kann ruhig dem User im verborgenem bleiben. Oder habt ihr was von nem flushmem() Befehl in C# oder VB.Net gehört?
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net

Markus2

BeitragSo, Jun 26, 2005 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
@regaa
vieleicht kann du es Mark mal auf englisch erklären was wir davon halten .

regaa

BeitragSo, Jun 26, 2005 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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-X

Betreff: ......

BeitragSo, Jun 26, 2005 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, das Speichermanagement ist gut durchdacht und es gibt daran nichts auszusetzen. Als nächstes wollt ihr noch die tollen OO Features loswerden? Laughing
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

BeitragSo, Jun 26, 2005 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
regaa hat Folgendes geschrieben:
Mir ist das Thema zwar nicht neu (Grüße an Dreamora Wink), aber ich finde es auch irgendwie dämlich das man den Befehl in die Mainloop reinsetzen muss. Warum nicht automatisch? Da wo keine Referenz zum Objekt gibt, einfach das Objekt automatisch vom Speicher entfernen. Gut, das ist zwar jetzt nicht Die Mühe diesen einen Befehl reinzuschreiben, aber das kann ruhig dem User im verborgenem bleiben. Oder habt ihr was von nem flushmem() Befehl in C# oder VB.Net gehört?


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

BeitragSo, Jun 26, 2005 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
"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-X

Betreff: .....

BeitragSo, Jun 26, 2005 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragSo, Jun 26, 2005 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jun 27, 2005 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragMo, Jun 27, 2005 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group