Ogre Mesh Speicherverteilung

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Ogre Mesh Speicherverteilung

Beitrag von man-in-black »

Moin moin,

weis einer von euch, wie Ogre (in PB5.11) die Meshs im Speicher hinterlegt?

Angenommen ich habe die eine Datei "baum.mesh" (und "baum.material") und erstelle daraus 2 meshs (2x loadmesh(#PB_any,...)),
sagt mir der Debugger, dass beide auf getrennte Speicherbereiche gelegt wurden (2 unterschiedliche Addressen).
Danach kann ich ohne Probleme Entitys erzeugen und wild rumspielen.
Lösche ich aber beide, kommt es manchmal beim Löschen des zweiten zu einem IMA.
Der Witz, wenn ich vorher isMesh abfrage, existiert das zweite noch. Ergo kann gelöscht werden?!
Das lässt mich jetzt vermuten, dass sich beide Meshs in Wahrheit doch einige Informationen teilen (Material,...)?

Bevor jetzt einer nach einem abgespeckten Code fragt: Nein, damit kann ich nicht dienen. Den Originalcode reinzustellen, wäre auch zu viel des Guten.
Außerdem geht es mir auch weniger um den Fehler in meinem Code, sondern um die Arbeitsweise von Ogre...

Wär cool, wenn mir das mal einer erklären könnte ;)
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Ogre Mesh Speicherverteilung

Beitrag von PMV »

Wenn du wissen willst, wie OGRE arbeitet, sollteste dir
den Quellcode runter laden und nachschauen. :D

Ich glaub aber kaum, dass da was besonderes gemacht
wird. Ein mal Mesh laden ist ein Mesh im speicher. Ein
zweites Mesh laden ist das auch im Speicher. Ein duzend
Entities erstellen, verweise auf das Mesh im Speicher mit
ein paar Zusatzdaten und verweis auf ein Material.

Ein IMA sollte es in keinem Fall geben, so lange du
nur sachen löschst, die vorher erstellt wurden. Das ist
dann kein Fehler im Code, sondern ein Fehler von PB. :wink:
-> Bugreport

Meshes von denen noch Entities existieren und genutzt
werden sollte allerdings nicht gelöscht werden, das
ist das einzige Szenario, wo ich mir ein "berechtigten"
IMA vorstellen kann.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Ogre Mesh Speicherverteilung

Beitrag von man-in-black »

Hi,

die Idee mit dem OgreSource war nicht übel. (Wusste gar nicht, dass der offen ist - im Nachhinein ziemlich dämlich :lol: )


[ Ogre 1.8.1 | PB5.11 ]
Nach ein bisschen Wühlen meine ich fündig geworden zu sein. Wenn ich es richtig sehe,
soll der ResourceManager ("OgreResourceManager.cpp") den Speicher optimal ausnutzen (ergo nur das Nötigste).
Jedes Mal wenn ich zB ein Mesh lade, wird mit ".createOrRetrieve()" zunächst überprüft,
ob schon ein Mesh mit dem selben Namen im Speicher liegt und sofern vorhanden der alte Pointer übergeben.

PureBasic scheint da nur sonne Art "Header" vorzusetzen. Logisch, dass dann beim Löschen von einem "baum"
der erste "Header" + Mesh verschwinden und nur der zweite (tote) "Header" übrig bleibt. Wenn ich jetzt mit isMesh()
nach dem zweiten Mesh suche, wird nur geguckt, ob der "Header 2" ok ist ... --> IMA

Möglich, dass man das schon als Bug einstufen kann. Schließlich müsste sich der 2. "Header" aktualisieren ODER bei gleichen
Quelldateien ein komplett neues Mesh erzeugt werden!

Provisorium:
Selbst mitschneiden, was geladen wurde. Wenn man wirklich zwei getrennte Meshs haben will, sollte man CopyMesh verwenden.
Ogre bastelt dann wirklich 2 Meshs aus einem.

Wenn ich mich irgendwie vertan haben sollte, melden ;)
mib
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Ogre Mesh Speicherverteilung

Beitrag von PMV »

man-in-black hat geschrieben:Jedes Mal wenn ich zB ein Mesh lade, wird mit ".createOrRetrieve()" zunächst überprüft,
ob schon ein Mesh mit dem selben Namen im Speicher liegt und sofern vorhanden der alte Pointer übergeben.

PureBasic scheint da nur sonne Art "Header" vorzusetzen. Logisch, dass dann beim Löschen von einem "baum"
der erste "Header" + Mesh verschwinden und nur der zweite (tote) "Header" übrig bleibt. Wenn ich jetzt mit isMesh()
nach dem zweiten Mesh suche, wird nur geguckt, ob der "Header 2" ok ist ... --> IMA
Das wäre eine fehlerhafte Implementation seites PB.
Bug-Report im englischen Forum und in einer der
nächsten Version wird das dann sicherlich gefixed.

Es wäre schon ziemlich unsauber, wenn das so
gelassen werden würde, zumal man dann
praktisch das System von OGRE selber
noch mal programmieren müsste, damit es
kein IMA gibt. :wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Ogre Mesh Speicherverteilung

Beitrag von PMV »

Ich hab nicht mit bekommen, das du einen erstellt hast, also hab
ich das nun gemacht.

Bugreport: http://www.purebasic.fr/english/viewtop ... =4&t=55452

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten