Fräsengine

Probleme beim Erstellen von 3D-Modellen und Texturen, keine Ahnung womit man Musik macht? Dies ist dein Forum.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Fräsengine

Beitrag 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
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

ööh... der DrawingBuffer *ist* der Backbuffer. Das sollte ziemlich flott gehen. Vieleicht machst du ja irgendwas falsch.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag 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
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag 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?
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag 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?
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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.
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag 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????
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Naja, sorry da brauchs scho' a bisserl mehr um mich vom hocker zu hauen ;)
Benutzeravatar
unix
Beiträge: 361
Registriert: 15.02.2005 19:25
Wohnort: Zwischen Coburg und Bamberg :-)
Kontaktdaten:

Beitrag 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!
Hier steht normalerweise die Putzfrau drin,
die hat aber Urlaub.
MfG : Unix
Antworten