Wie Arbeitet Drawimage

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Hahninator

Betreff: Wie Arbeitet Drawimage

BeitragMi, Jan 16, 2008 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, ich bin mal wieder da und habe eine Frage zu Drawimage. Also ich habe mir eine Funktion geschrieben die 24bit-BMP Bilder auslesen kann und naja sie ist scheiße langsam.

Code: [AUSKLAPPEN]

Graphics 800,600
SetBuffer BackBuffer()
 Gegner_Bilder = CreateBank(0)
 Bild2 = LoadImage("planet1.bmp")
 Bild = ReadFile("planet1.bmp")
 SeekFile Bild, 18
 X = ReadInt(Bild)
 Y = ReadInt(Bild)
 Volumen = Volumen + 8 + X*Y*3
 ResizeBank(Gegner_Bilder, Volumen)
 PokeInt Gegner_Bilder, Volumen - 8 - (X*Y) * 3,X
 PokeInt Gegner_Bilder, Volumen - 4 - (X*Y) * 3,Y
 SeekFile Bild, 51
 For J = Y To 1 Step -1
  For I = X To 1 Step -1
   PokeByte Gegner_Bilder, (Volumen-((X*Y)*3)) + (X*(J-1)+I)*3 - 1, ReadByte(Bild)
   PokeByte Gegner_Bilder, (Volumen-((X*Y)*3)) + (X*(J-1)+I)*3 - 2, ReadByte(Bild)
   PokeByte Gegner_Bilder, (Volumen-((X*Y)*3)) + (X*(J-1)+I)*3 - 3, ReadByte(Bild) 
  Next
 Next

Repeat
Zeit = MilliSecs()
Z= Z + 1
;For I = 0 To X-1
; For J = 0 To Y-1
;  Color PeekByte(Gegner_Bilder, 8 + ((X*J+I)*3)),  PeekByte(Gegner_bilder, 9 + (X*J+I)*3),  PeekByte(Gegner_bilder, 10 + ((X*J+I)*3))
;  Plot I + Z,J
; Next
;Next
DrawImage Bild2,Z,0
Color 255,255,0
Text 0,0, MilliSecs()-Zeit
Flip
Cls
Until KeyHit(1)


naja und hier meine Frage, wie arbeite Drawimage, damit meine Funktion in etwa genauso schnell wird? Dies hat den Sinn, das ich Maskimage etwas aufwerten will.
 

Dreamora

BeitragMi, Jan 16, 2008 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
deine Funktion wird nie so schnell, egal was du machst.

DrawImage nimmt DirectDraw zum zeichnen des Bildes.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Abrexxes

BeitragMi, Jan 16, 2008 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Was er damit sagen will ist, bei DirectDraw muss die CPU alles machen da die Graka damit nichts zu tun hat, und das ist langsam.
 

ChristianK

BeitragMi, Jan 16, 2008 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Das stimmt nicht. DirectDraw nutzt so viel von der Grafik-Hardware, wie möglich. Windows GDI nutzt ausschließlich die CPU.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Hahninator

BeitragMi, Jan 16, 2008 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn ich das jetzt richtig verstehe, muss ich denn text so umschreiben das er die BMP direkt verändert, damit dies net wären des Spiels anfängt zu Ruckeln?
 

ChristianK

BeitragMi, Jan 16, 2008 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau, du erstellt ein Bild und schreibst die Pixeldaten in den Buffer. Deine Methode ist so langsam, weil du "Plot" verwendest.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Hahninator

BeitragMi, Jan 16, 2008 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
also wenn ich wirtepixel bzw writepixelfast nehmen würde, gänge es schneller?
 

ChristianK

BeitragMi, Jan 16, 2008 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur wenn du in den ImageBuffer zeichnest. Im Moment zeichnest du das Bild Pixel für Pixel in dem BackBuffer. Der bessere Weg ist, die Pixel in einen ImageBuffer zu schreiben und das Zeichnen DirectDraw zu überlassen. Du machst sozusagen in jedem Frame das, was vor der Hauptschleife einmal ausreichen würde.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Hahninator

BeitragMi, Jan 16, 2008 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
naja da ist schon wieder ein problem, Wenn ich es richtig in Erinnerung habe, kann ich mit dem Imagebuffer nur ein Bild laden und eigentlich hatte ich vor mehrere Bilder zu laden........oder irre ich mich?
 

ChristianK

BeitragMi, Jan 16, 2008 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Speicher die Bilder doch in einem Array. Dann ist es auch noch einfacher zu benutzen als die Methode mit den Banks.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Hahninator

BeitragMi, Jan 16, 2008 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
jo ich schreibe mal mein text um^^

hier mal ein kleiner auszug. meiner meinung nach habe ich mich selbst übertroffen^^

Code: [AUSKLAPPEN]

Function Hintergrund()
 For Hinter.Hintergrund = Each Hintergrund
  For Bilder.Bild_Infos = Each Bild_Infos
   If Bilder\Nummer = Hinter\Bild Then
    If Hinter\scrollen = 0 Then
     DrawImage Hinter\Bild, Hinter\X, Hinter\Y
    EndIf
    If Hinter\scrollen > 0 Then
     If Instr(Hinter\scrollen/2,".5") > 0 Then
      For I = -1 To 800/ Bilder\Breite
       For J = -1 To 600/ Bilder\Hoehe     
        DrawImage Bilder\Name, Hinter\X + I * Bilder\hoehe, Hinter\Y + (J * Bilder\Breite)
       Next
      Next
      Hinter\Y = Hinter\Y + Ceil(Hinter\scrollen/2)
      If hinter\Y > Bilder\hoehe Then Hinter\Y = Hinter\Y - Bilder\hoehe
      If hinter\Y < -1*Bilder\hoehe Then Hinter\Y = Hinter\Y + Bilder\hoehe
     EndIf
    EndIf
    If Instr(Hinter\scrollen/2,".5") = 0 Then
     For I = -1 To 800/ Bilder\Breite
      For J = -1 To 600/ Bilder\Hoehe
       DrawImage Bilder\Name, Hinter\X + I * Bilder\breite, Hinter\Y + J* Bilder\hoehe
      Next
     Next
     Hinter\X = Hinter\X + Ceil(Hinter\scrollen/2)
     If Hinter\X > Bilder\Breite Then Hinter\X = Hinter\X - Bilder\Breite
     If Hinter\X < -1 * Bilder\Breite Then Hinter\X =  Hinter\X + Bilder\Breite
    EndIf
   EndIf
  Next
 Next
End Function


naja scrollen in 4 richtungen mit einer Zahl möglich^^

Hip Teen

BeitragDo, Jan 17, 2008 10:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
naja da ist schon wieder ein problem, Wenn ich es richtig in Erinnerung habe, kann ich mit dem Imagebuffer nur ein Bild laden und eigentlich hatte ich vor mehrere Bilder zu laden........oder irre ich mich?

Kann sein dass ich dich falsch verstehe, aber mit CreateImage kann man eigentlich beliebig viele Bilder erstellen und in diese reinzeichnen.
Spruch der Woche: "Ahh, ein neues Gesicht?!" - "Nein, das hab ich schon länger"

FireballFlame

BeitragDo, Jan 17, 2008 12:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja. Mit SetBuffer ImageBuffer(variable_vom_gewuenschten_bild) kannst du jederzeit ein beliebiges Bild bearbeiten. Jedes Bild hat seinen "eigenen" ImageBuffer.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group