Energiesparen am PC

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

Midimaster

Betreff: Energiesparen am PC

BeitragDo, Okt 06, 2011 3:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit diesem Tutorial möchte ich dich motivieren, schon beim Coden ein, zwei Gedanken an das energiesparende Programmieren zu denken. Dieses Tutorial ist BB, B3D und BMAX übergreifend und die Regeln lassen sich auf alle drei Systeme anwenden.

Ja? Geht denn das überhaupt?

Wenn Dein Rechner 100% CPU-Auslastung hat, gibt es zwei Gründe dafür: Entweder deine aufwändige Action braucht im Moment wirklich soviel Leistung...oder du machst etwas falsch beim Programmieren. Vor allem dann, wenn sich auf dem Bildschirm gar nix bewegt, sind 100% Perfomance-Verbrauch peinlich!


Reicht den der Timer nicht?
Also das ist schon ein erster Schritt, aber sicherlich noch nicht das Maximum. Aber sprechen wir zunächst über diesen Timer:
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600
FPS%=CreateTimer(60)
Repeat
Cls
;blabla
Flip 0
WaitTimer FPS
Until KeyHit(1)

so macht das ja inzwischen fast jeder... (Wenn nicht, dann fang gleich heute damit an.)

...Leider macht es wirklich fast jeder so!

Angenommen statt ..
BlitzBasic: [AUSKLAPPEN]
;blabla

...steht da der Code für einen Spielfeld-Editor, den du gerade schreibst ....
BlitzBasic: [AUSKLAPPEN]
For j=0 To 30
For i=0 To 30
If Map[i,j]>0
DrawImage....
EndIf
Next
Next

...Dann kannst Du davon ausgehen, dass der User auf keinen Fall mehr als 5 neue Felder mit seiner Maus pro Sekunde hinzufügt. In diesem Fall würde es genügen, einen Timer mit weniger Interrupts zu erstellen:
BlitzBasic: [AUSKLAPPEN]
FPS%=CreateTimer(10)

Mit diesem Timer, wird die Welt immer noch jede 1/10 Sekunde erneuert, aber dein Programm verbraucht 84% weniger Energie.

Du solltest also viel öfter darüber nachdenken, welcher Wert bei CreateTimer() unbedingt nötig ist.


MalenNoetig%=1

In meinen Programmen gehe ich noch einen Schritt weiter und prüfe bei jedem REPEAT-Durchgang, ob überhaupt was zu zeichnen ist:

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600
FPS%=CreateTimer(10)
Repeat
If MalenNoetig=1
MalenNoetig=0
Cls
;blabla
Flip 0
EndIf
If MouseDown(1)
;blabla
MalenNoetig=1
EndIf
WaitTimer FPS
Until KeyHit(1)

In diesem Beispiel wird der Bildschirm nur noch dann erneuert, wenn die Maus geklickt wurde. Für einen Spielfeld-Editor ausreichend. So wird es Phasen mit hunderten von Durchläufen geben, wo zwar die Maus 10x pro Sekunde gecheckt wird, aber das Malen nur noch sehr selten stattfindet, weil der User gerade gar nichts klickt. Dein Programm verbraucht so nun 1% der Energie von vorher.

Redraw wegen anderem Fenster
In so einer energiesparenden Anwendung könnte aber ein außergewöhnliches Malen nötig werden, weil ein anderes Programm Teile deines Fensters überdeckt hatte. Entweder erhältst du (in einer GUI) dann einen EVENT, der dich auffordert zu malen oder Du machst sicherheitshalber alle 500msec ein autom. Zeichnen:
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600
FPS%=CreateTimer(60)
Repeat
If (MalenNoetig=1) Or (MalenTime<MilliSecs()
MalenTime=MilliSecs()+500
MalenNoetig=0
Cls
;blabla
Flip 0
EndIf
If MouseDown(1)
;blabla
MalenNoetig=1
EndIf
WaitTimer FPS
Until KeyHit(1)

So könntest Du jetzt den FPS-Timer sogar wieder höher stellen und trotzdem bleibt der Energieverbrauch niedrig!

Noch mehr sparen?

Alle Massnahmen bis hier her sind sehr leicht umzusetzen und bedürfen nahezu keinerlei Änderungen im eigentlichen Spielcode. Dort würdest Du allerdings bei jeder Spieler- oder Gegner-Bewegung oder immer wenn sich etwas ändert, die Variable MalenNoetig sicherheitshalber auf 1 setzen und so wird in jedem Durchlauf das Malen nötig. Der Spareffekt geht also während des Games verloren. Erst wenn der User wieder zum Menü geht, oder Pause drückt, oder eine Anleitung liest ergibt sich erneut ein Effekt.

Aber auch im Hauptgame lässt sich sparen. Doch das erfordert Prüfungen, ob eine Änderungen von Parametern wirklich auch eine sichtbare Änderung am Bildschirm erzeugt. Zu fragen wäre also immer: "sieht man das?". z.b. ein Schuss wird DELETEt, weil er den Bildschirm längst verlassen hat -> kein MalenNoetig. Oder die Aktion war sowieso außerhalb des Bildschirms, oder hatte gar nichts mit Darstellung zu tun, oder die Aktion ist so geringfügig, das es genügt sie beim nächsten MalenTime-Durchgang zeichnen zu lassen (z.b. neuer Highscore-Wert)


Weniger Zeichnen spart auch

Im "weniger Zeichnen" liegt nochmal viel Potential fürs Sparen. Hierdurch könntest Du aber auch deine FPS steigern, wenn die wegen zuviel Spielaction sowieso schon einbrechen. Die Idee: Wenn Du wüsstest in welchem Bereich des Bildschirms Änderungen eingetreten sind, bräuchtest Du nur diesen Teil neu zeichnen und das spart.

Ein typisches und leicht zu verstehendes Beispiel ist der Rand eines Map[]-Spielfeldes. Er besteht oft aus Mauern, die während des Spiels sowieso nicht von den Akteuren betreten werden können. Also könnte man diesen"Rand" einmal zeichnen und dann nie wieder:

statt:
BlitzBasic: [AUSKLAPPEN]
For j=0 To 30
For i=0 To 30
If Map[i,j]>0
DrawImage....
EndIf
Next
Next

schreibst du nun:
BlitzBasic: [AUSKLAPPEN]
For j=1 To 29
For i=1 To 29
If Map[i,j]>0
DrawImage....
EndIf
Next
Next

so werden 120 Felder weniger gemalt. 15% Ersparnis!

Oder Du malst nur die Felder rund um den Spieler neu:
BlitzBasic: [AUSKLAPPEN]
For j=-2 To 2
For i=-2 To 2
x=SpielerX-i
y=SpielerY-j
If x>0 And y>0 And X<30 And y<30
If Map[x,y]>0
DrawImage....
EndIf
EndIf
Next
Next

so werden nur 25 Felder statt 900 gemalt! 97% Ersparnis! Allerdings musst du dies nun auch rund um alle Gegner machen. Ab mehr als 10 Spielakteuren wird der Nutzen fraglich!

Vielleicht fallen Euch ja noch weitere Sparmöglichkeiten ein. Bitte Kritik und Ergänzung!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
  • Zuletzt bearbeitet von Midimaster am Do, Okt 06, 2011 13:17, insgesamt einmal bearbeitet

Eingeproggt

BeitragDo, Okt 06, 2011 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hoffe mal dass einer von uns beiden irgendwas auf den Augen hat weil sonst kann ich mir nicht erklären wieso ausgerechnet du WaitTimer vergisst? Shocked

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Midimaster

BeitragDo, Okt 06, 2011 13:16
Antworten mit Zitat
Benutzer-Profile anzeigen
oh wie peinlich! Embarassed Danke Eingeproggt! Ich werde es gleich ändern. Vielleicht war es heute Nacht doch schon sehr spät... Embarassed
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

ozzi789

BeitragFr, Okt 14, 2011 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Da mehr und mehr auf Mobiledevices läuft, sicherlich gut sich das anzugewöhnen Wink
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group