D
@Finnegan sagte in monotonic_buffer_resource sorgt für DMA Interrupt Error:
Ich versuche halt, dein Heap-Fragmentierungs-Problem zu verstehen. Das sollte sich eigentlich dadurch äußern, dass Allokationen ab einer gewissen Größe fehlschlagen, obwohl in der Summe noch genug Speicher frei wäre. Ist das korrekt?
Ja und nein, als ich noch nicht mit monotonic buffer resource gearbeitet habe, ist es zwischendurch einfach mit sdt::bad_alloc krachen gegangen. Obwohl noch 10 MB frei sein sollten. Ein Charakter hat zwei Texturatlaten beide zusammen ca 1MB.
Das ist so das größte was ich zur Laufzeit des Spieles lade.
Das laden von Texturen zu Laufzeit hat sich aber als schlecht erwiesen, weil das immer leichte Laderuckler verursacht hat.
Nun lade nun via Ladebildschirm alle Texturen in den RAM.
Weil aber die Luft hinten raus ganz schön dünn wird habe ich allen anderen kleinen Objekten die via new hinzugekommen, eine monotonic buffer resource verpasst.
Die buffer resource läuft bei CPU Core zugriffen perfekt. Aber sobald man da Sachen ablegt die man via DMA verschickt knallt es irgendwann.
Aus Komfort gründen habe ich aber für die map's eine unsynchronized_pool_resource beaufschlagt.
@Finnegan sagte in monotonic_buffer_resource sorgt für DMA Interrupt Error:
Das mit dem VIF FIFO verstehe ich a nicht so ganz.
Also... Es gibt drei wege Grafiken aus zu geben (drei DMA Channel) bei der PS2, Path 1, Path 2, Path 3.
Diese sind Priorisiert. Path 1 hat die höchste Priorität, dann Path 2 und dann Path 3
Path 1 wird von der Vector Unit 1 losgelassen und schreibt aus dem eignen VU Mem.
Path 2 befeuert entweder den Graik chip oder die VU1 mit Daten.
Bei mir befeuert Path 2 die VU1.
Path 3 läuft bei mir im Chain Mode und lädt die Texturen in den VRAM.
Das Passiert Permanent Textur->VU1->xgkick(Path 1)
Damit das Sprite aber gezeichnet werden kann muss ich zuvor auf meine Textur warten. Ich bremse also die VU1 noch aus. Dadurch läuft der VIF1 FIFO voll.
VIF = vector interface 1
Man kann einen Textur Transfer starten und parallel dazu VU1 Daten an das GIF Schicken.
Aber wenn die Textur vom GIF noch nicht verarbeitet wurde, kommt es zu Textur glitchen
Das ist jetzt in meinem Fall so, weil die Animation bei mir in der VU 1 berechnet werden aber die Textur muss vorher im Gif angekommen sein
Wenn man ein 2D Spiel alla Street FIghter oder Tekken programmiert, könnte man die Texturatlanten beider Spielfiguren einmalig in den VRAM kopieren und dann die Animation via VU 1 hintereinander berechnen.
Aber bei meinem Spiel habe ich 20 verschneide Spielfiguren. Es muss also dafür gesorgt werden das innerhalb der 30 fps alle Figuren gegenzeichnet wurden.
Und das funktioniert.
Laut Datenblatt ist der VIF FIFO 16 Qwörter groß also 256 Byte.
Wo die liegen K.A.
Man kann auch eine Textur im ganzen, also die gesamte Bitmap an das GIF schicken, aber das ist ineffizient. Das Geschieht via VIF 1 Direkt Transfer. Du hast dann eben ein 1Mb großes DMA Paket. Vorteil ist die Textur muss erst im GIF ankommen, ehe man Daten zur VU1 senden kann.
@Finnegan sagte in monotonic_buffer_resource sorgt für DMA Interrupt Error:
Beim groben Überfliegen hab ich auch was von "newlib" gesehen.
Ja das ist korrekt, das SDk wurde irgendwann mal auf newlib Portiert.
Einige alte Sachen lassen sich dadurch auch nicht mehr Compilern.
z.b der Mincraft Port oder Quake2