Memory läuft voll
Übersicht

NoxBetreff: Memory läuft voll |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Hab ich da vergessen, etwas noch frei zu machen? |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schick einmal deine Programmcode hierher, falls er nicht zu lange ist. Dann können wir es besser analysieren. | ||
Nox |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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] |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
...wer das mal in Aktion sehen möchte: http://m59.ath.cx/scifi.rar (ca. 810KB)
Und hier mal ein Screen: ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Nox |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Naja, kopieren von einem Speicherbereich in den anderen und Laden von der Festplatte dürfte schon einen Unterschied ausmachen... | ||
Nox |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das is allerdings wahr. Mal probieren. | ||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Exakt so hatte ich es gelöst.
Resultat: ALLE Sprites, außer das letzte, welches erstellt wurde (nach Loslassen der Strg-Taste), sind schwarz. ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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?! ![]() |
||
Nox |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich benutze sie ja. ![]() ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group