Linux: Delay 100% CPU Last. Fehler beheben. BM < V1.12

Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Neue Antwort erstellen

rema

Betreff: Linux: Delay 100% CPU Last. Fehler beheben. BM < V1.12

BeitragSo, Okt 16, 2005 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie hat sich Mark wohl sich nicht mit Linux so beschäftigt. Den wen man folgenden Code probiert hat man immer 100% CPU Last.

Code: [AUSKLAPPEN]
Graphics 800,600,0


While Not KeyHit(KEY_ESCAPE)

   DrawRect Rnd(0,800),Rnd(0,600),10,10

   
   Flip

   Delay 1000

Wend


Das liegt an der Datei: ../mod/brl.mod/system.mod/system.linux.c

Dort ist Delay mit einer While-Schleife erstellt worden. Sehr unpofessionel.

Code: [AUSKLAPPEN]
void bbSystemDelay( int millis ){
   int      t;
   t=brl_system_MilliSecs();
   while (brl_system_MilliSecs()-t<millis) {}
//   usleep( millis/1000 );
}


Nun muss man folgendes tun um den Fehler zu beheben:

1. Man füge in dieser "system.linux.c" Datei oben im Header folgende Zeile hinzu:

#include <unistd.h>

2. Man wandle die Funktion bbSystemDelay() so um:

Code: [AUSKLAPPEN]
void bbSystemDelay( unsigned long millis ) {
   usleep( millis * 1000 );
}


(Die Funktion usleep suspendiert den laufenden Prozess (in microsekunden), darum muss man das ganze mit 1000 multiplizieren um an Millisekunden zu kommen)

3. Nun der letzte Akt: im BlitzMax Editor wählt man program/build modules

Und schon kommt man in dem Genuss vom echten Delay und auch Flip ohne 100%ige Prozessorlast, wie halt unter Windows und MacOS. Man kann gleich mal den obigen Programmcode testen.
  • Zuletzt bearbeitet von rema am Mo, Nov 21, 2005 23:29, insgesamt 2-mal bearbeitet

TheShadow

Moderator

BeitragSo, Okt 16, 2005 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen
sowas wie delay sollte man ehe nicht benutzen...

wenn man vollbild macht, dann läuft die CPU bei 100% (das ist auch OK so - für spiele braucht man volle leistung)

wenn man debug-fenster macht, dann sollte es nicht 100% anzeigen...

zumindest hab ich es so gelesen...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

rema

BeitragSo, Okt 16, 2005 12:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau mal in der Funktion nach, wo Flip gebildet wird nach! Da wird Delay für alle 3 Systeme verwendet!

Darum war es unter Linux auch komisch, da ein Programm das ab und zu was zeichnete oder 1000sende Sachen zeichnete immer auf 100% Systemleistung lief.
Jetzt ist eben das Problem auch behoben.

Code: [AUSKLAPPEN]
Function Flip()
   If Not displayGraphics Return
   If soft_sync
      Local t=MilliSecs()-sync_time
      sync_frame:+1000
      Local n=sync_frame/graphics_hertz-t
      If n>0 And n<1000
         Delay n   '<------------------ hier
      Else
         sync_frame=t*graphics_hertz
      EndIf
   EndIf
   max2dGraphics._graphics.EndPaint
   max2dGraphics._graphics.BeginPaint
End Function
 

Nemesis

BeitragSo, Okt 16, 2005 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
solltest du vielleicht im englischen forum ( bug oder modul tweaks ) posten.

rema

BeitragSo, Okt 16, 2005 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Schon gemacht.

rema

BeitragDi, Okt 18, 2005 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe eine neue Version, da usleep anscheinend nicht sehr genau ist:

Habe Delay jetzt mit nanosleep realisiert, und jetzt ist Delay sehr genau!

Editiere in: ../mod/brl.mod/system.mod/system.linux.c
Code: [AUSKLAPPEN]
void bbSystemDelay( long millis ){

   struct timeval timeout;
   
   timeout.tv_sec  = millis / 1000000L;
   timeout.tv_usec = millis % 1000000L;
   
   select(0, NULL, NULL, NULL, &timeout);

}


Und auch hier: ../mod/brl.mod/system.mod/system.linux.bmx
Code: [AUSKLAPPEN]
Type TLinuxSystemDriver Extends TSystemDriver

   ...

   Method Delay( millis )
      bbSystemDelay( millis * 1000 )
   End Method

   ...

End Type


Und nicht vergessen: im BlitzMax Editor wählt man program/build modules

SonGoku

BeitragDi, Okt 18, 2005 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
nice ^^ danke.
Aber es wäre super, wenn du deine änderung auch im englischen Forum
reinschreiben würdest, damit der Support Team das sehen kann und
den Mark bescheid sagen können Wink


MfG
Goku
Projekt "BlitzPong" --> 100%

BRL Account mit Blitz3D und BlitzMax für nur 67€!!!
Das Buch "Spiele programmieren mit Blitz Basic" für nur 15€!!!

rema

BeitragMi, Okt 19, 2005 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Schon längstens erledigt, da ich mit User aus dem eng. Forum korespondiere.

rema

BeitragDo, Nov 17, 2005 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Seit BlitzMax Version 1.12 ist dieser Fehler unter Linux behoben!!!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group