[NooNooPhysics] Memory Access Violation

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

funkmaster5000

Betreff: [NooNooPhysics] Memory Access Violation

BeitragDi, Feb 02, 2016 0:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Community,

im Moment experimentiere ich ein wenig mit Physik herum und dafür ist natürlich die Lib NooNooPhysics bestens geeignet. Ich habe den Platformer auch soweit fertig. Allerdings werden zur Laufzeit Objekte erstellt und irgendwann gibt mir Blitzbasic eine Memory Access Violation aus. Ich konnte den Fehler darauf eingrenzen, dass keine weiteren Objekte mehr erstellt werden können, da der Buffer für die Physikobjekte überläuft. Dabei rufe ich nach jeden gewonnenen Level NNP_DeleteEntity auf und lösche so die Objekte.

Mir ist aufgefallen, dass trotz Aufruf die Variable EntityCount immer weiter ansteigt. Das führt schließlich zum Überlauf; bei der Initialisierung der Lib gibt man ja mit NNP_CreatePhysics(Entities,MaxEdges,MaxVertrices) die entsprechende Anzahl an. Eins oder mehrere der Felder werden irgendwann überschritten. Da dann keine neuen Entities mehr erstellt werden, generiert mir BB den Fehler, sobald ich bei dem neu erstellten Objekt die Flagge "isblock" setzen möchte. Da es nicht existiert, gibt es eine MAV.

Hier ist der Code den ich verwende, ich habe den Type TEntity der Lib um das Feld "isblock" erweitert, damit der Spieler und die Bildschirmränder nicht gelöscht werden.

Code: [AUSKLAPPEN]
For b.TEntity = Each TEntity
      If b\isblock = True Then
         NNP_DeleteEntity(b)
      End If
   Next


Diese Funktion wird wie gesagt aufgerufen, wenn das Level beendet ist. Doch irgendwann erhalte ich dann von dieser Funktion den Fehler
Code: [AUSKLAPPEN]
      If timepassed > 1000 Then
         block.TEntity = NNP_CreateBox(Rand(192,448),0,32,32,0)
         block\isblock = True
         block\rotationenabled = False
         starttime = MilliSecs()
      End If


Vielen Dank für eure Hilfe!

Tankbuster

BeitragDi, Feb 02, 2016 5:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Versuchs mal mit


BlitzBasic: [AUSKLAPPEN]
For b.TEntity = Each TEntity
If b\isblock = True Then
NNP_DeleteEntity(b)
EntityCount = EntityCount - 1
End If
Next


Anscheinend hat da jemand vergessen, die EntityCount Variable zurückzuzählen, sobald ein Entity gelöscht wird. Ist diese Variable dann irgendwann größer als der Grenzwert, wird kein neues Entity erstellt, obwohl noch reichlich Platz vorhanden wäre Wink Very Happy

Oder die elegantere Version: Du kannst es auch in der NooNooPhysics.bb in der Funktion Code: [AUSKLAPPEN]
Function NNP_DeleteEntity( Entity.TEntity )
ergänzen. Für Edges und Vertexe ist der Zähler ok, aber für Entitys nicht.

MFG,
Twitter
Download Jewel Snake!
Windows|Android
 

funkmaster5000

BeitragDi, Feb 02, 2016 9:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich dachte es mir Very Happy! Aber bevor ich daran rumfuhrwerke, waren mir weitere Meinungen wichtig; ist schließlich keine unbedeutende Variable Wink

Ich ergänze es und werde das Programmverhalten beobachten.
 

funkmaster5000

BeitragDi, Feb 02, 2016 12:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm Confused
Leider hat die Ergänzung keinerlei Verbesserung gebracht. Ich kann die MAV Meldung natürlich abwenden, indem ich einfach prüfe, ob ein TEntity Objekt existiert bevor ich den Feldern die Werte zuweise:

Code: [AUSKLAPPEN]
      If timepassed > 1000 Then
         block.TEntity = NNP_CreateBox(Rand(208,432),0,32,32,0)
         If block <> Null Then
            block\isblock = True
            block\rotationenabled = False
            block\frame = Rand(0,3)
         End If
         starttime = MilliSecs()
      End If


Das löst jedoch nicht das Grundproblem. Nach 2-5 Minuten Spielzeit werden keine neuen Blöcke mehr generiert.

Tankbuster

BeitragDi, Feb 02, 2016 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Eventuell habe ich mich vertan. Schau dir mal die globalen Variablen Code: [AUSKLAPPEN]
VertexCount
und Code: [AUSKLAPPEN]
EdgeCount
an. Diese haben meiner Meinung nach den selben Fehler, den EntityCount vorher auch hatte. Ich habe gestern Abend wohl Sand in den Augen gehabt. Hier habe ich mal 4 überarbeiteten Versionen der Funktionen:
Schau mal, ob es funktioniert, und lass dir VertexCount, EdgeCount und EntityCount anzeigen Smile

BlitzBasic: [AUSKLAPPEN]
Function NNP_DeleteVertex( Vertex.TVertex )
For i = 0 To Vertex\Parent\VertexCount - 1
If Vertex\Parent\Vertex[ i ] = Vertex Then
Vertex\Parent\Vertex[ i ] = Vertex\Parent\Vertex[ Vertex\Parent\VertexCount - 1 ]
Vertex\Parent\Vertex[ Vertex\Parent\VertexCount - 1 ] = Null

Exit
EndIf
Next

For Edge.TEdge = Each TEdge
If Edge\V1 = Vertex Or Edge\V2 = Vertex Then NNP_DeleteEdge( Edge )
Next

NNP_RemoveVertex( Vertex )
VertexCount = VertexCount - 1
Delete Vertex
End Function

Function NNP_DeleteEdge( Edge.TEdge )
For i = 0 To Edge\Parent\EdgeCount - 1
If Edge\Parent\Edge[ i ] = Edge Then
Edge\Parent\Edge[ i ] = Edge\Parent\Edge[ Edge\Parent\EdgeCount - 1 ]
Edge\Parent\Edge[ Edge\Parent\EdgeCount - 1 ] = Null

Exit
EndIf
Next

NNP_RemoveEdge( Edge )
EdgeCount = EdgeCount - 1
Delete Edge
End Function

Function NNP_DeleteEntity( Entity.TEntity )
While Entity\VertexCount
NNP_DeleteVertex Entity\Vertex[ 0 ]
Wend

While Entity\EdgeCount
NNP_DeleteEdge Entity\Edge[ i ]
Wend

FreeBank Entity\VertexBank
FreeBank Entity\EdgeBank

NNP_RemoveEntity( Entity )
EntityCount = EntityCount - 1
Delete Entity
End Function

Function NNP_ClearPhysics()
Delete Each TVertex
Delete Each TEdge
Delete Each TEntity

VertexCount = 0
EdgeCount = 0
EdgeCount = 0

NNP_DestroyPhysics()
End Function
Twitter
Download Jewel Snake!
Windows|Android
 

funkmaster5000

BeitragMi, Feb 03, 2016 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey. Scheint zu funktionieren, werde mal die Playtester fragen Wink Danke für's Erste Smile

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group