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
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
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
Wenn das Programm fertig ist stelle ich ne Demo zur verfügung!