Memory access violation bei großen Bitmaps

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Travis

Betreff: Memory access violation bei großen Bitmaps

BeitragDi, Aug 24, 2004 23:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Es mag schwer sein, auf meine Frage eine Antwort zu finden, aber vielleicht kann mir ja irgendjemand einen guten Rat geben.

Ich habe jetzt schon bei zwei Projekten ein Problem mit der Kollisionsabfrage mit Imagescollide bei relativ großen Bildern (ab 1600x1200).

Ich benutze ein Hintergrund als Spielwelt und prüfe an diesem Bild auch die Kollision. Das mache ich aus dem Grunde, weil es wohl schneller geht ein einziges großes Bild zu zeichnen, als 1000 einzelne Tiles.

Mein Programm bricht aber genau bei der Kollisionsabfrage mit dem Bild mit "Memory access violation" ab. Und der Horror an der ganzen Sache ist, dass sich der Fehler nicht reproduzieren lässt. Es kann sein, dass das Programm 10 minuten stabil läuft, es kann aber auch passieren, dass der Fehler bereits nach 15 Sekunden auftritt.

EDIT: Und dann tritt der Fehler auch nur bei einem Bild auf. Direkt davor ist eine Kollisionsabfrage, mit einem anderen Layer (gleiche Größe) und die funzt prima.

Ich habe nicht so die große Lust die ganzen Kollisionsabfragen manuell mit Arrays für jedes Bild durchzuführen.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Xenon

BeitragMi, Aug 25, 2004 11:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Nimm lieber Tiles, die sind doch schneller! Immerhin kannst du nur die zeichnen, die aktuell auf dem Bildschirm sind und ob man jetzt das aufteilt oder nicht macht nicht wirklich einen Unterschied! Und das beste dabei: Der "Bug" dürfte wegsein Wink

DivineDominion

BeitragMi, Aug 25, 2004 12:54
Antworten mit Zitat
Benutzer-Profile anzeigen
1600x1200 als Spielwelt, okay. Aber wie hilfe da ImagesCollide?!
An deiner Stelle würde ich mir einen Editor basteln in dem ich Kollisionsboxen setzen kann, als Types natürlich. Dann Kollision im Spiel mit den Boxen prüfen, und zwar durch vergleichen der Koordinaten, wie sich das gehört Smile
christian.tietze@gmail.com - https://christiantietze.de
macOS

Bms

BeitragMi, Aug 25, 2004 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
teil doch das 1600x1200 bild in mehrere teile. dann musste auch nich das fette picture anzeign, sondern nur ein paar teilstückschn.

Suco-X

Betreff: .....

BeitragMi, Aug 25, 2004 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
@Bms : Das wäre dann übliches Tiling Wink
@Travis: Ich denke du zeichnest einfach "alle" Tiles einer map bei jedem schleifendurchgang. Das macht das ganze natürlich sehr langsam so ab 100x100 tiles. Brauchst aber jeweils nur die Tiles die sich im Screen Zentrum befinden mit DrawImage zu zeichnen. Das gibt dann kaum Speed abnahme.
Die Map als großes bild zu machen ist jedenfalls nie gut.
bye
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Travis

BeitragMi, Aug 25, 2004 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
@ DivineDominion
Ich habe für die Kollisionsabfragen extra verschiedene Bilder angelegt. Bei der Kollision mit einem Bild, soll der Spieler verlangsamt werden und bei Kollision mit einem anderen will ich ihn komplett anhalten.

Und anzeigen lasse ich diese Bilder sowieso nicht. Man kann die Kollisionsabfrage ja auch mit unsichtbaren Bildern machen.

Sie dienen nur für die Kollisionsabfrage. Im Editor habe ich alles mit einzelnen Tiles unterschiedlicher größe zusammengesetzt. Dann zeichne ich alle Objekte, die den Spieler abblocken sollen in ein Bild und alle Objekte, die den Spieler verlangsamen in ein anderes. Für die Anzeige mache ich dann noch ein drittes Bild, in dem ich alles einzeichne.

Vielleicht werde ich wirklich mal versuchen, die Bilder für die Kollisionsabfragen in kleinere Einzelbilder aufzuteilen. Vielleicht bin ich dann auch das Problem los, dass ich beim erstmaligem Aufruf der Kollisionsabfrage immer 3-5 Sekunden warten muss.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

DivineDominion

BeitragMi, Aug 25, 2004 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Darf ich mal "Ach du Scheiße! Was soll der Brainfuck denn?!" anmerken? Wieso, zum Teufel, speicherst du verlangsamungen etc. als Bitmap? Liest du die auch noch mit ReadPixelFast aus? Ach nein, du nimmst ja ImagesCollide Shocked Wieso plot'test du nicht gleich den ganzen Screen?
Ich meine, was ist in dich gefahren so was komisches der einfachen Methode der Positionsabfrage vorzuziehen?
Hast du da die wirrsten Formen drin?! Vielleicht wären Screenshots derm 3 Ebenen - in kleiner! - gar nicht mal unangebracht...
christian.tietze@gmail.com - https://christiantietze.de
macOS

Travis

BeitragMi, Aug 25, 2004 16:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Positionsabfrage?? Rolling Eyes

Das ist natürlich nicht so praktisch, wenn man zwei Objekt mit einer freien Form hat und eine Pixelgenaue Kollisionsabfrage braucht...

Es handelt sich bei meinem Projekt um eine Art von Rennspiel. Da muss der Spieler natürlich langsamer werden, wenn er die Strecke verlässt. Unnötig zu sagen, dass die Strecke nicht aus rechteckigen Tiles besteht.

Ich könnte die einzelnen Bilder natürlich auch in Arrays umwandeln, wo jeder Pixel gekennzeichnet ist, der für die Kollision berücksichtigt werden soll. Das ist aber ziemlich aufwendig. Dann müsste ich das Bild in der Tat einmal mit ReadPixelFast auslesen.

Genau für soetwas gibt es doch Imagescollide. Das ist doch die einfachste Methode eine Kollision zu erkennen.

Code: [AUSKLAPPEN]

 If Not ImagesCollide(Spieler(s\winkel), s\x, s\y, 0, RoadMap, 0,0,0) Then
  s\speed = s\speed * .95
 Else
  s\speed = s\speed * .99
 EndIf
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
  • Zuletzt bearbeitet von Travis am Mi, Aug 25, 2004 16:57, insgesamt einmal bearbeitet

DivineDominion

BeitragMi, Aug 25, 2004 16:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Readpixelfast würde ich dir empfehlen. Einfach mal um den Mittelpunkt der KArre herum ein paar Pixel auslesen, in deinem Hitnergrundbild da, und schauen ob es die entsprechende Farbe hat. Kannst dann auch 2 Farben nehmen, einmal für Langsamer und einmal für Kollision. Dann sparst du VRAM Smile So in der Art hatte ich es mal bei nek ganz speziellen Jump and Run. Totaler schwachsinn war das, aber trotzdem Smile
christian.tietze@gmail.com - https://christiantietze.de
macOS

Travis

BeitragMi, Aug 25, 2004 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
*lol* das wäre auch noch mal 'ne Methode Very Happy. Sowas ähnliches habe ich früher mal in einem QuickBasic Projekt gemacht.

Mal sehen, jetzt habe ich ja einige neue Ideen. Vielleicht bekomme ich's ja noch hin.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Markus2

BeitragMi, Aug 25, 2004 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder versuche es mal mit 1600x1216 .
Könnte auch sein das Windows sich blöd anstellt wenn man
Bitmaps größer als dem Desktop erstellt .

Travis

BeitragMi, Aug 25, 2004 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab's jetzt mal ganz anders angestellt. Ich habe zum Anzeigen ein einziges großes Bild von 1600x1600 Pixeln genommen. Die Kollisionsabfragen habe ich aber mit jedem einzelnen Tile gemacht. Die Koordinaten habe ich ja noch in den Types und die Einzelbilder sind ja auch noch geladen. Das sind zwar über 1000 Einzelbilder, die ich prüfen muss, aber von der Performance geht's genauso schnell, wie mit einem Einzelbild. Vielleicht läuft es ja jetzt endlich stabil.

Heute ist der Fehler sowieso erst 4-5 mal aufgetreten. Da hatte ich mal 'nen Waittimer reingemacht um die Geschwindigkeit auf 60 FPS zu begrenzen. Das hat ihm dann aber gar nicht gefallen. Als die Bremse wieder draussen war, wars' wieder gut...
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Markus2

BeitragMi, Aug 25, 2004 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut gut , aber du benutzt hoffentlich zuerst RectsOverlap statt jedes mal Imagescollide oder ?

Travis

BeitragDo, Aug 26, 2004 0:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wäre wohl noch einmal ein bisschen schneller, daran hatte ich natürlich mal wieder nicht gedacht Embarassed

Für heute werde ich meine Arbeiten daran aber erstmal einstellen. Wer hat schon um Mitternacht noch lust, seine Kollisionsabfragen zu ändern Very Happy
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group