Memory läuft voll

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Nox

Betreff: Memory läuft voll

BeitragMo, Mai 03, 2004 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi.

Folgendes Problem:
Hab nen kleines Partikelmodul gebaut, welches Rauch simuliert.
Bei jedem Aufruf, Rauch zu erstellen, wird das Sprite in den Type geladen (ich weiß, hirnrissig gelöst, wird auch noch optimiert). Ist die Lifetime des Rauches abgelaufen, free ich die Ressourcen mit FreeTexture sowie FreeEntity und delete dann den Type-Eintrag. Normal sollte doch nun alles, was Speicher gefressen hat, entfernt sein, oder?

Ist aber nicht so: Halte ich mal länger die TAste für meinen Rauchwerfer Wink gedrückt, so geht die FPS langsam aber sicher in den Keller, bis ca. 25-30 von 70 runter.

Hab ich da vergessen, etwas noch frei zu machen?

Markus2

BeitragMo, Mai 03, 2004 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Types werden immer global in einer Sammlung abgelegt .
Also wenn du in einer Funk. local bla.blaType=new blaType benutzt
hast mußt du es dort auch wieder löschen !
Ist sehr fieß und ich bin auch drüber gestolpert ...


Wenn du allerdings zu viele Partikel darstellt können natürlich
auch die FPS runter gehen , aber danach wenn die sich auflösen
mußte wieder 70 haben ...

General Alex

BeitragMo, Mai 03, 2004 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Schick einmal deine Programmcode hierher, falls er nicht zu lange ist. Dann können wir es besser analysieren.
 

Nox

BeitragMo, Mai 03, 2004 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Also die Partikel werden in ner Collection verwaltet, nicht über Arrays. Und nach deren Verschwinden auch wieder mit delete entfernt.

Nunja, hier mal der Code:

Code: [AUSKLAPPEN]
Function PTLUpdateSmoke(ptl.TPARTICLE)

   If ptl\lifetime% <= MilliSecs() And ptl\alpha# <= 0.1 Then
      ; Smoke expired, remove
      FreeTexture ptl\sprite
      FreeEntity ptl\sprite
      Delete ptl

      Return

(...*schnipp schnapp*...)


Wenn ihr mehr braucht, sagt Bescheid. ^^[/code]

BladeRunner

Moderator

BeitragMo, Mai 03, 2004 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Das deine FPS in den Keller gehen liegt wohl schlichterdings an der zunehmenden Zahl an partikeln. Nicht nur speicherfressend ist wichtig (wenn du wirklich die Textur für deinen Partikel jedesmal neu lädst- einmal reicht vollkommen, und jedes laden braucht auch Zeit), sondern auch die Zahl der Prozesse.
Ab wieviel Partikeln brechen deine FPS denn ein ?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Nox

BeitragMo, Mai 03, 2004 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist das Witzige. Die Partikel bleiben ca. für 2-3 Sekunden da und werden wieder gelöscht. Ist nen durchgehender Rauch-Strahl, also schon ne Menge Partikel (pro Frame +1 Partikel).
Aber die FPS brechen erst nach ca. 10-15 Sekunden ein, wenn der Strahl schon lange da ist.
Auch, wenn keine mehr erstellt werden, sprich der Strahl deaktiviert ist, steigen die FPS nicht wieder an.
 

Nox

BeitragMo, Mai 03, 2004 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
...wer das mal in Aktion sehen möchte: http://m59.ath.cx/scifi.rar (ca. 810KB)

Und hier mal ein Screen: user posted image (59KB)[/img]
 

Dreamora

BeitragMo, Mai 03, 2004 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn ich deinen Text richtig verstanden habe lädst du für jeden sprite ne eigene Textur??? ( rein wegen freetexture )

sollte dem so sein musst du das dringend ändern
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Nox

BeitragMo, Mai 03, 2004 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, wie gesagt, ist überhaupt nicht sinnvoll gelöst. Aber nungut, da die Texturen ja nach deren Benutzung entfernt werden, dürfte der Speicher nach Deaktivierung des Rauches wieder frei werden.
Aber okay, probiere ich das erstmal aus.
 

Nox

BeitragMo, Mai 03, 2004 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, es scheint aber so, dass ich wirklich für jedes Sprite eine eigene Textur laden muss, oder der Fehler liegt woanders.
Ich habe nun einen Array für Sprite-Texturen erstellt, der bei Programmstart per LoadTexture mit den gewünschten Sprite-Texturen gefüllt wird.

Wird dann ein Sprite erstellt, wird ihm per EntityTexture die Textur zugewiesen. Sieht so aus, als könne man eine Textur nur ein einziges Mal zuweisen, was natürlich sehr schlecht ist und ich wieder auf das alte Prinzip zurückgreifen müsste.

Jemand einen Rat?
 

INpac

BeitragMo, Mai 03, 2004 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, warum lädst du nicht vor den Realtimeprozessen bzw. vor den Schleifen ein main_rauchsprite:

global main_rauch = loadsprite("rauch.bmp")

beim erstellen neuer partikel wendest du copyentity() an:

p.part = new part
p\particle = copyentity(main_rauch)
 

Edlothiol

BeitragMo, Mai 03, 2004 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich müsste man doch einfach dem nächsten Entity wieder mit EntityTexture die gleiche Textur zuweisen können?
Schonmal AvailVidMem und TotalVidMem versucht, um zu testen obs wirklich an Speicherüberlastung liegt? Liegts wahrscheinlich schon, aber nen Versuch wärs wert Idea
 

Nox

BeitragMo, Mai 03, 2004 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich schätze, dass es dasselbe Resultat ist, als wenn ich einfach ein neues Sprite erstelle. Ob die Textur kopiert oder neu erstellt wird, dürfte ja eigentlich keine Rolle spielen.
 

Edlothiol

BeitragMo, Mai 03, 2004 20:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, kopieren von einem Speicherbereich in den anderen und Laden von der Festplatte dürfte schon einen Unterschied ausmachen...
 

Nox

BeitragMo, Mai 03, 2004 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Das is allerdings wahr. Mal probieren.
 

Dreamora

BeitragMo, Mai 03, 2004 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Also nochmal

Die Textur braucht nur 1 mal geladen werden!!!

lade deine Texturen in deinen Texturen array und danach einfach

;vorher
TexturArray(wanted_index) = loadtexture( "irgendeinetextur.png" )


; beim particle erstellen
Sprite = createsprite()
entitytexture Sprite, TexturArray(wanted_index)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Nox

BeitragMo, Mai 03, 2004 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Exakt so hatte ich es gelöst.
Resultat:
ALLE Sprites, außer das letzte, welches erstellt wurde (nach Loslassen der Strg-Taste), sind schwarz. Confused
 

Dreamora

BeitragMo, Mai 03, 2004 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann nicht sein

dann musst du sonst etwas falsch gemacht haben
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

INpac

BeitragMo, Mai 03, 2004 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
o_O
ich versteh nur bahnhof
hab ich da jetzt was überlesen, oder warum benutzt du nicht einfach blitz-sprites?

sofern es kein mordsspeed à la singlesurface sein soll geht das doch?! Neutral
 

Nox

BeitragMo, Mai 03, 2004 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich benutze sie ja. Smile Aber ne Möglichkeit is, dass durch das ganze ununterbrochene Laden von Sprites von der Platte das Prog total zulaggt. Smile

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group