Was ist daran nicht "ökologisch"? Wenn du pro Schleifendurchlauf ein Delay(1) einbaust, dann frisst das Programm auch nicht die ganze CPU-Leistung (ohne den Delay hättest du allerdings eine Auslastung von 100%). Der Umstand das CPU und Grafikkarte dennoch ständig was zu tun haben stört auch nicht weiter, denn wenn dein Programm im Vordergrund läuft benötigt eh kein anderes Programm die Grafikkarte.
Wenn du etwas zeitgesteuert machen willst brauchst du so oder so einen Timer.
/edit: Hier mal ein Beispiel mit Doublebuffering und Zeitsteuerung. Ich habe zwar statt Sprites einfache Rechtecke per Box() ausgegeben, aber das Prinzip dürfte klar sein.
Code: Alles auswählen
#app = "Doublebuffering Beispiel"
InitSprite()
InitKeyboard()
ExamineDesktops()
OpenScreen(DesktopWidth(0),DesktopHeight(0),DesktopDepth(0),#app)
Define quit.l = #False
LoadFont(0,"Courier New",12)
Structure sprite_daten
x.l
y.l
width.l
height.l
color.l
EndStructure
Define sprites_gezeichnet.l = -1
Define sprite_delay.l = 2000
Define sprite_timer.l = ElapsedMilliseconds() + sprite_delay
Dim sprites.sprite_daten(3)
sprites(0)\x = 55
sprites(0)\y = 85
sprites(0)\width = 30
sprites(0)\height = 10
sprites(0)\color = RGB(255,0,0)
sprites(1)\x = 90
sprites(1)\y = 90
sprites(1)\width = 40
sprites(1)\height = 50
sprites(1)\color = RGB(0,255,0)
sprites(2)\x = 155
sprites(2)\y = 105
sprites(2)\width = 25
sprites(2)\height = 90
sprites(2)\color = RGB(0,0,255)
sprites(3)\x = 200
sprites(3)\y = 120
sprites(3)\width = 40
sprites(3)\height = 50
sprites(3)\color = RGB(0,0,0)
Repeat
Delay(1) ;wg. CPU-Auslastung
FlipBuffers()
ClearScreen(RGB(127,127,127))
;Fenster zeichnen
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Default)
Box(50,50,500,300,RGB(100,100,100))
DrawingMode(#PB_2DDrawing_Outlined)
Box(50,50,500,300,RGB(0,0,0))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(0))
DrawText(55,55,#app,RGB(255,255,255))
;Fensterinhalte zeichnen
For i = 0 To sprites_gezeichnet - 1
Box(sprites(i)\x,sprites(i)\y,sprites(i)\width,sprites(i)\height,sprites(i)\color)
Next i
If ElapsedMilliseconds() >= sprite_timer And sprites_gezeichnet <= ArraySize(sprites(),1)
sprites_gezeichnet+1
sprite_timer = ElapsedMilliseconds() + sprite_delay
EndIf
StopDrawing()
;Benutzereingaben verarbeiten
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
quit = #True
EndIf
Until quit = #True