Seite 1 von 2

Fräsengine

Verfasst: 14.05.2006 00:07
von unix
Servus erst ma!

Ich habe das Problem das wenn ich eine Fräsengine entwickle und "Span abnehme", dass man das in der engine sehen soll. (Frässpuren)

Ich hatte mir gedacht das ich mein Frässcreen in einen 2 dimensinolen Array baue und es auf den Screen rendere

Ich habe das Problem das DrawingBuffer() doch recht langsam ist um den gesamden screen zu rendern!

ich wollte deshalb fragen wie man den directen Pointer zum Grafik-back-buffer findet um es direct zu rendern ohne Befehle ahnlich:

Code: Alles auswählen

For y = 0 To 599
Repeat
ClearScreen(0)
 For x = o To 799  
  *GrafikBackBuffer + y*Pitch + x*4 = $FF00FF
 Next
Next
FlipBuffers()
ForEver

Verfasst: 14.05.2006 13:46
von Zaphod
ööh... der DrawingBuffer *ist* der Backbuffer. Das sollte ziemlich flott gehen. Vieleicht machst du ja irgendwas falsch.

Verfasst: 14.05.2006 14:33
von unix
ich hab nei schleife in etwa so:

Code: Alles auswählen

for y = 0 to 599
 for x = 0 to 799
  *DBuffer.LONG = drawingbuffer()
  *DBuffer + y*Pitch + x*4
  *DBuffer\l = Color
 next
next
oder recht es nur einmal Drawingbuffer zu verwenden?

Ich Prob

Verfasst: 14.05.2006 15:02
von unix
Ok es geht ein bishen schneller aber ruckelt immer noch!

Bsp.: (PB 4.0)

Code: Alles auswählen

InitSprite()
InitKeyboard()
InitMouse()

Global r.l=128, g.l=0, b.l=255, sx.l=0, sy.l=0, *DrawingBufferPointer.LONG

OpenScreen(800,600,32,"DBuffer Test")

StartDrawing(ScreenOutput())
 Pitch = DrawingBufferPitch()
 PixelFormat = DrawingBufferPixelFormat()
StopDrawing()
 
Repeat
 ExamineKeyboard() : ExamineMouse()
 
 ClearScreen(0)
  
 StartDrawing(ScreenOutput())
  *DrawingBufferPointer.LONG = DrawingBuffer() 
  For y = 0 To 599
   For x = 0 To 799
    *DrawingBuffer.LONG = *DrawingBufferPointer
    *DrawingBuffer + (Pitch*y)+(x*4) 
    *DrawingBuffer\l = RGB(r,g,b)   
   Next
  Next 
  For x = -5 To 5
   *DrawingBuffer.LONG = *DrawingBufferPointer
   *DrawingBuffer + (Pitch*MouseY())+((MouseX()+x)*4) 
   *DrawingBuffer\l = $FF0000
  Next
  For y = -5 To 5
   *DrawingBuffer.LONG = *DrawingBufferPointer
   *DrawingBuffer + (Pitch*(MouseY()+y))+(MouseX()*4) 
   *DrawingBuffer\l = RGB(r,g,b)
   *DrawingBuffer\l = $FF0000
  Next
  For y = -3 To 3
   For x = -3 To 3
    *DrawingBuffer.LONG = *DrawingBufferPointer
    *DrawingBuffer + (Pitch*(y+sy))+((x+sx)*4) 
    *DrawingBuffer\l = $00FF00  
   Next
  Next
  
  
  
 StopDrawing()
 
 FlipBuffers()
 
 sx+1
 sy+1
 r+1
 g+1
 b+1
 
 If r > 255 : r = 0 : EndIf
 If g > 255 : g = 0 : EndIf
 If b > 255 : b = 0 : EndIf
 
Until KeyboardPushed(#PB_Key_Escape)
End
gehts noch schneller?

Verfasst: 14.05.2006 15:08
von Zaphod
Die Drawingbuffer adresse ändert sich nicht vor einem FlipBuffers also pro bild nur ein einziges mal auslesen, das war also schonmal eine optimierung.

MouseX/Y() sollte sich auch nicht wärend des zeichnens ändern, also auch nur einmal am anfang auslesen.

Die Farbe scheint sich ja auch nicht zu ändern, also könntest du die auch nur einmal in einen longwert speichern und damit arbeiten.

Verfasst: 14.05.2006 15:23
von unix
minimal besser

Code: Alles auswählen

InitSprite()
InitKeyboard()
InitMouse()

Global r.l=128, g.l=0, b.l=255, sx.l=0, sy.l=0, *DrawingBufferPointer.LONG

OpenScreen(800,600,32,"DBuffer Test")

StartDrawing(ScreenOutput())
 Pitch = DrawingBufferPitch()
 PixelFormat = DrawingBufferPixelFormat()
StopDrawing()
 
Repeat
 ExamineKeyboard() : ExamineMouse()
 
 mx = MouseX()
 my = MouseY()
 
 ClearScreen(0)
  
 StartDrawing(ScreenOutput())
  *DrawingBufferPointer.LONG = DrawingBuffer() 
  For y = 0 To 599
   For x = 0 To 799
    *DrawingBuffer.LONG = *DrawingBufferPointer
    *DrawingBuffer + (Pitch*y)+(x*4) 
    *DrawingBuffer\l = RGB(r,g,b)   
   Next
  Next 
  For x = -5 To 5
   *DrawingBuffer.LONG = *DrawingBufferPointer
   *DrawingBuffer + (Pitch*my)+((mx+x)*4) 
   *DrawingBuffer\l = $FF0000
  Next
  For y = -5 To 5
   *DrawingBuffer.LONG = *DrawingBufferPointer
   *DrawingBuffer + (Pitch*(my+y))+(mx*4)    
   *DrawingBuffer\l = $FF0000
  Next
  For y = -3 To 3
   For x = -3 To 3
    *DrawingBuffer.LONG = *DrawingBufferPointer
    *DrawingBuffer + (Pitch*(y+sy))+((x+sx)*4) 
    *DrawingBuffer\l = $00FF00  
   Next
  Next
  
  
  
 StopDrawing()
 
 FlipBuffers()
 
 sx+1
 sy+1
 r+1
 g+1
 b+1
 
 If r > 255 : r = 0 : EndIf
 If g > 255 : g = 0 : EndIf
 If b > 255 : b = 0 : EndIf
 
Until KeyboardPushed(#PB_Key_Escape)
End
:allright:

noch ne Idee?

Verfasst: 14.05.2006 16:29
von Zaphod
So sollte es eigentlich nicht mehr ruckeln auf einem einigermaßen aktuellem system >= 500Mhz.

Vieleicht ist es ja ein refreshproblem. Versuch mal verschiedene Refresh-frequenzen, vieleicht bringt das was.

Versuch vieleicht auch mal FlipBuffers vor das StartDrawing zu setzen, so dass immer am anfang eines durchlaufs geflippt wird. Das hat bei mir schonmal geholfen.

Verfasst: 14.05.2006 16:46
von unix
Sry habs fertig und mal ohne Debuger kompiliert.

WOW ist das schnell

was der Debugger alles ausmacht ist der Pure Wahnsinn 4x so schnell

mein Bsp. Programm:

Code: Alles auswählen

InitSprite()
InitKeyboard()
InitMouse()

Global Dim Ws.b (500,400), Dim F.b (10,10), Quit.b

Global fx.l, fy.l

OpenScreen(800,600,32,"DBuffer Test")

StartDrawing(ScreenOutput())
 Pitch = DrawingBufferPitch()
 PixelFormat = DrawingBufferPixelFormat()
StopDrawing()

CreateSprite(0,10,10)
StartDrawing(SpriteOutput(0))
 Circle(5,5,5,$0000FF)
 For y = 0 To 9
  For x = 0 To 9
   If Point(x,y) = $0000FF
    F(x,y)=1
   EndIf
  Next
 Next
StopDrawing()

For y = 0 To 399
 For x = 0 To 499
  Ws(x,y) = 1
 Next
Next

Repeat

 ExamineKeyboard()
 
 ClearScreen(0)
  
 StartDrawing(ScreenOutput())
  *DrawingBufferPointer.LONG = DrawingBuffer() 
  For y = 0 To 399
   For x = 0 To 499
    *DrawingBuffer.LONG = *DrawingBufferPointer
    *DrawingBuffer + (Pitch*(y+100))+((x+150)*4)     
    If Ws(x,y) = 1
     *DrawingBuffer\l = $00FF00
    ElseIf Ws(x,y) = 2
     *DrawingBuffer\l = $0000FF
    EndIf
   Next
  Next  
 StopDrawing() 
 DisplayTransparentSprite(0,fx,fy) 
 FlipBuffers()
 
 If fx>140 And fx<650 And fy>90 And fy<500 
  For y = 0 To 9
   For x = 0 To 9
    If F(x,y) = 1
     If fx+x>149 And fx+x<650 And fy+y>99 And fy+y<500
      Ws(fx+x-150,fy+y-100) = 2
     EndIf 
    EndIf
   Next
  Next
 EndIf
 
 If KeyboardPushed(#PB_Key_Up)
  fy-2
 EndIf
 If KeyboardPushed(#PB_Key_Down)
  fy+2
 EndIf
 If KeyboardPushed(#PB_Key_Right)
  fx+2
 EndIf
 If KeyboardPushed(#PB_Key_Left)
  fx-2
 EndIf
 
 If KeyboardPushed(#PB_Key_Escape)
  Quit = 1
 EndIf
  
Until Quit = 1 
End
So kannste Fräsen mit Cursortasten das fetzt

:D :D


Und was sagste????

Verfasst: 14.05.2006 18:11
von Zaphod
Naja, sorry da brauchs scho' a bisserl mehr um mich vom hocker zu hauen ;)

Verfasst: 14.05.2006 18:37
von unix
ja ist ja erst ma eine art engine

mein ziel ist es eine NC Simulation durchzuführen nicht CNC

für unsere Kunzmann Fräse auf der Arbeit

Da es für diese Programmiersparche kein Simulationsprogramm gibt

Ausbilder wird sich freuen :D


Wenn das Programm fertig ist stelle ich ne Demo zur verfügung!