Draw3D2 Speicherproblem [ERLEDIGT]

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Elendil

Betreff: Draw3D2 Speicherproblem [ERLEDIGT]

BeitragDo, Nov 17, 2011 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo allerseits,
hab mich jetzt endlich mal überwunden von der alten Draw3D auf die 2er umzusteigen. Bin auch echt begeistert davon -> klasse hectic Wink. Lediglich ein Problem habe ich noch, weiß aber nicht ob das im code oder vor dem monitor ist Wink.
Wenn ich folgenden Code ausführe und zwischen den SGGs wechsle, steigt der benutzte Arbeitsspeicher der blitzcc.exe mit jedem Ändern der ausgewählten SGG um 10-20mb (wahrs. je nachdem wie groß die Bilddatei der SGG ist).

BlitzBasic: [AUSKLAPPEN]
Graphics3D 1200,800,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(58)
Local Camera=CreateCamera()
CameraClsColor Camera,140,150,160

Include "..\Includes\Draw3D2.bb"
Include "..\Includes\DrawSGG.bb"
DrawInit3D(Camera)
Origin3D(1200,800)

Global Pivot=CreatePivot3D(0, 160,0,600, 0,0,0, 1)
Local Main=CreateSGG(-420,0,180,240,"..\SGG\FlatMilianFull.sgg",0,-1)
Local List=AddingSGG(Main,SGGROSTER,-56,0,"",0,100)
Local Turn=AddingSGG(Main,SGGBUTTON,116,+32,"Turn",1,40)
Local Zero=AddingSGG(Main,SGGBUTTON,116,-32,"Zero",1,40)
InviteSGG(List,"sgg",1,"..\SGG")
DeleteSGG(List,0)
SetSelectSGG(List,0)

Local Show=LoadSGG("..\SGG\"+GetStringSGG(List)+".sgg")




While Not KeyHit(1)

SGGKey3D=GetKey()

If DrawSGG(Main)=2 Then

If SGGHit3D=List Then
FreeSGG(Show)
Show=LoadSGG("..\SGG\"+GetStringSGG(List)+".sgg")
End If

If SGGDown3D=Turn Then
RotateEntity Pivot,Sin(MilliSecs()*0.2)*10,0,MilliSecs()*0.02
End If

If SGGDown3D=Zero Then
SetPivot3D(Pivot, 160,0,600, 0,0,0, 1)
End If

End If

DrawSGG(Show,0,0)

WaitTimer Timer
RenderWorld
Clear3D()
Flip 0
Wend
End




Function LoadSGG(FFile$)

Local ISize=80
Local IDist=120
Local IShow

Select FFile
Case "..\SGG\BlackBold.sgg": ISize=50: IDist=106
Case "..\SGG\Bombastic.sgg": ISize=30: IDist=65
Case "..\SGG\FlatMalistic.sgg": ISize=18: IDist=43
Case "..\SGG\FlatMilianFull.sgg": ISize=64: IDist=116
Case "..\SGG\FlatMilianLine.sgg": ISize=64: IDist=116
Case "..\SGG\GallantBold.sgg": ISize=80: IDist=182
Case "..\SGG\ProTracker.sgg": ISize=28: IDist=58
Case "..\SGG\Standard.sgg": ISize=32: IDist=60
End Select

IShow=CreateSGG(0,0,5*ISize,4*ISize,FFile,Pivot,-1)
AddingSGG(IShow,SGGROSTER,0,+IDist,"Easy|Normal|Hard",0,2*ISize)
AddingSGG(IShow,SGGBUTTON,0,+0.5*ISize,"Button",0,2*ISize)

AddingSGG(IShow,SGGBUTTON,0,-0.5*ISize,"Switch <#0f0>ON|Switch <#f00>OFF",0,2*ISize)
AddingSGG(IShow,SGGINTAKE,0,-1.5*ISize,"Enter",0,3*ISize)
AddingSGG(IShow,SGGSLIDER,0,-2.5*ISize,"",0,3*ISize,128)

Return IShow

End Function



[der Code ist als Standartbeispiel beim Download der Draw3D2 dabei]

Es scheint also so, als ob die vorherig geladen SGG nicht mehr gefreed wird, obwohl FreeSGG(show) aufgerufen wird.
Ist das ein Problem der Draw3D2 oder liegt das Problem woanders?
Hoffe ihr könnt mir helfen Smile
Liebe Grüße, Elendil
  • Zuletzt bearbeitet von Elendil am So, Nov 20, 2011 15:07, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Nov 20, 2011 11:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab deine PN erhalten, antworte aber hier, da es vielleicht auch andere interessieren könnte.

Der immer größer werdende Speicherverbrauch von B3D kommt daher, dass immer ''neue'' Bilder geladen werden (das macht CreateSGG auch). Ich habe das Verhalten schon früher bemerkt und keine Lösung dazu gefunden. Ist kein Draw3D2 oder SGG -Problem, sondern ein Verhalten von B3D. Es ist allerdings auch nicht schlimm, denn nach einem Versuch den ich durchführte, unmengen an gespeicherten und übergroße Texturen zu laden und wieder zu löschen steigt der Speicherverbrauch nur so lange an, bis dieser es eine gewisse Obergrenze erreicht hat. Danach werden die zuvor belegten und wieder freigemachte Speicherbereiche benutzt. Es kommt zu keinen Überlauf. Natürlich vorrausgesetzt, man löscht ausreichend Texturen wieder.

Ist vielleicht am besten mit dem Unterschied WinXP und Vista zu vergleichen. Wärend WinXP immer versucht nicht mehr benutzte Speicherbereiche frei zu machen, sammelt Vista immer fleissig die von langsamen Datenträgern (wie Festplatten) im schnellem RAM, bis dieser tatsächlich knapp wird. Der Vorteil: Lädt man eine Datei die zuvor frei gemacht wurde erneut, kann ggf. diese direkt aus dem RAM geholt werden, was die Sache beschleunigt. Ob das nun Absicht von B3D ist, oder doch nur ein Fehlverhalten, konnte ich mit meinen Methoden nicht feststellen da dieser Test dann doch zu umständlich gewesen wäre.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Elendil

BeitragSo, Nov 20, 2011 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
okey, danke für deine ausführliche antwort Smile
 

okeppelm

BeitragDo, Dez 03, 2015 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
kann dieses problem mit dem obigen beschriebenen zusammenhängen?

https://www.blitzforum.de/foru...918#415918

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 03, 2015 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube nicht. Wenn Objekte einfach verschwinden, dann hast du eventuell zu viele davon. Singlesurface wäre hier eine mögliche Lösung zum Problem. Und wie in deinem Anfagspost beschrieben, sollte man Graphics3D nicht zum löschen des Bilrschirmes nutzen (siehe Beitrag von Holzchopf). Dieser Befehl gehört nur 1x (und eventuell ein weiteres mal, wenn der Nutzer in den Optionen die Auflösung ändert, ausgeführt). Besser ist jedoch, man setzt ein Vorabscreen im Fenstermodus mit den Einstellungen und erst wenn die Auflösung bestimmt wurde das Spiel gestartet wird. Danach sollte sich am besten die Auflösung gar nicht mehr ändern lassen. Es besteht durchaus ein Grund dafür, dass selbst sogenannte AAA-Spiele es nur selten zulassen die Auflösung während des Spieles zu ändern. Hinzu kommt, dass bestimmte Befehle einfach eine Zeit brauchen, bis diese komplett durchgelaufen sind (siehe: "garbage collection").

Ansonsten stelle dir eine Testumgebung zurecht in der genau die ganzen Sachen gemacht werden. Also Texturen und Objekte in großen Mengen laden und darstellen. Schalte dabei den Debugger ein. Habe ich zu meinem Thema auch gemacht und eben den Erkenntnisgewinn erreicht.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

okeppelm

BeitragDo, Dez 03, 2015 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
ok danke hectic! ist dir dieser effekt noch nie begegnet?

single surfaces verwende ich schon, irgendwie trifft das ganze eher die großen texturen (2048x2048), komisch ist ja dass nach 1-2 minuten die texturen wieder erscheinen. es lassen sich ca. 4-5 graphics3d befehle durchführen, dann tritt es auf. dann werd' ich jetzt mal versuchen graphics3d weg zu lassen, clearworld dürfte dann wohl hoffentlich den job erledigen ohne jedes einzelne image mit freetexture zu löschen...
 

okeppelm

BeitragDo, Dez 03, 2015 23:27
Antworten mit Zitat
Benutzer-Profile anzeigen
nö das wars irgendwie nicht. scheint so als ob das programm im hintergrund irgendwie den speicher (vram oder ram?) auffüllt und dann am oberen ende an die grenzen stößt, der befehl renderworld dtl. langsamer (ca. -50%) ausgeführt wird, dann plötzlich ein paar große texturen verschwinden bevor es wieder beschleunigt. nach einiger zeit kommen diese texturen und gehen sie wieder...
 

Eisbaer

BeitragMo, Dez 07, 2015 10:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin gerade am überlegen ob es nicht interessant wäre der blitzcc.exe einen Debug Code im entsprechenden Quellcode Bereich zu verpassen um das Direct auf BB ebene zu betrachten.
Eigene Webseite:

http://www.eisbaer-studios.de

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group