Hohe CPU-Auslastung und einiges mehr

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

BlitzGrünschnabel

Betreff: Hohe CPU-Auslastung und einiges mehr

BeitragDo, Aug 06, 2015 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich hoffe man kann mir weiterhelfen und ein paar Tipps geben.


Hohe CPU-Auslastung:
Ohne jetzt direkt auf meinen Programmiercode einzugehen eine allgemeine Frage. Ich habe eine while-Schleife die überprüft, ob ein Gegenstand im Menü angeklickt wird oder nicht. Im Prinzip ist es einfach nur eine If-Abfrage in einer while-Schleife und so wie ich es mir vorstellen würde läuft es vermutlich auch ab. Es wird permanent in einem hohen Tempo abgefragt, ob die Gegenstände angeklickt wurden, was dazu führt, dass die CPU-Leistung bei mir auf um die 50% ansteigt.

Vermutlich kann man dies beheben in dem man wait-Befehele oder ähnliches einbaut, aber dadurch würde ich doch unter Umständen zu einem Delay beitragen, oder gar verhindern, dass der Klick erkannt wird.

In meinen Augen also auch keine optimale Lösung. Ich glaube also das mir etwas sehr wichtiges entgangen ist und hoffe man kann mich aufklären und erklären wie man's richtig macht.
In C++ kommt man beispielsweise ohne wait-Befehle aus und anscheinend wird die while-Schleife dort nicht in einem ,,Affenzahn" durchlaufen. Aus diesem Grund wollte ich eigentlich in C programmieren aber ich finde es nicht so gut wie Blitz3D.

Auslagerung des Programmcodes:

Wenn ich einen Programmcode in einer seperaten Datei include, so kann ich dies seltsamerweise nur einmal tun. Versuche ich es in einem anderen Teil des Programmcodes erneut zu includen, so tut sich nichts. Gibt es eine Möglichkeit wie es dennoch geht oder mache ich es einfach nur falsch (morgen poste ich den Programmcode).

Gibt es zudem die Möglichkeit Dateien zu erstellen, die einen Programmcode enthalten sich aber nicht erneut mit Blitz3D bearbeiten lassen?
 

Lador

BeitragDo, Aug 06, 2015 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo und willkommen im Forum!

Soweit ich weiß, "reserviert" ein Blitz3D-Programm solange es läuft einen CPU-Kern für sich (ich nehme an, dass du einen Dual-Core hast, wenn das Programm 50% Auslastung kostet?), ganz egal, was dein Programm macht. Willst du die Auslastung reduzieren, dann schau dir mal (wie von dir gedacht) die Befehle CreateTimer und WaitTimer an.

Es wäre auch mit Delay möglich, jedoch sollte man diesen Befehl vermeiden, weil er eben einen "Delay", also eine Verzögerung (in jedem Fall!) verursacht. Mit der Verwendung von WaitTimer wird eigentlich sichergestellt, dass so etwas nicht geschieht, also wenn der Prozessor mal kurz viel arbeiten muss, wird durch WaitTimer keine zusätzliche Verzögerung erzeugt, mit Delay dagegen schon.


http://www.blitzbasic.com/bpdo...ref=2d_a-z

Zitat:
Note that each .bb file can only be included once.

In der Regel macht es auch wenig Sinn, den Code mehr als einmal zu includen, weil man sich einfach eine Funktion definieren könnte, die den Code beinhaltet, und diese kann man dann öfters aufrufen.
Wenn du darauf überhaupt nicht verzichten kannst, müsstest du auf BlitzMax umsteigen.


BlitzGrünschnabel hat Folgendes geschrieben:
Gibt es zudem die Möglichkeit Dateien zu erstellen, die einen Programmcode enthalten sich aber nicht erneut mit Blitz3D bearbeiten lassen?

Das verstehe ich irgendwie nicht so ganz. Mit der Blitz3D-IDE kannst du doch alle Dateien (egal welchen Dateityps) öffnen. Du müsstest die Datei also irgendwie (durch dein Betriebssystem) vor einem Öffnen schützen oder so, nur ich glaube, dass du solche Rechte zwar für bestimmte Benutzer bzw. Benutzergruppen vergeben kannst, jedoch nicht für einzelne Programme.
Kann es sein, dass du nur nicht willst, dass jemand, dem du dein Programm schickst, den Code ansehen kann? Dann erstelle einfach eine .EXE und schick ihm nur diese Datei (ohne den Code).


Vor allem das erste Thema wurde auch schon öfter hier behandelt. Eventuell findest du mit der Forensuche eine detailliertere Antwort auf deine Frage.

MFG Lador
Mein aktuelles Projekt:
2D-Rollenspiel "Iliran"
Screenshot | Worklog
Fortschritt: ca. 70%

BladeRunner

Moderator

BeitragDo, Aug 06, 2015 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu deiner ersten Frage: Benütze CreateTimer.
Diese lassen dein Programm nur alle xy ms durchlaufen und schonen damit die CPU. Solange es nicht um wirklich zeitkritische Dinge geht ist das Mittel der Wahl (Und Blitz speichert erkannte Mausklicke intern, dir geht da also nichts verloren, keine Angst). Auch unter C wirst Du um ein Timing Management nicht herum kommen, da dir sonst der Code willenlos losrennt.
Zu deiner zweiten Frage: Ein Include ist dazu gedacht Teile deiner Funktionalität auszulagern. Mehrfaches Inkludieren ist nicht vorgesehen,es reicht die in den inkludierten Dateien enthaltenen Functions einmal einzubinden, damit sie überall im Code zur Verfügung stehen. Include ist NICHT dazu gedacht redundanten Code mehrfach einzupasten. Wenn Du solchen hast, lagere ihn in eine Function aus Wink
Zu deiner dritten Frage:
Klar, wenn Du die Datei kompilierst wird daraus eine .exe, und die kann nicht wieder eingelesen werden. Allerdings kannst Du auch keine .exe inkludieren, falls Du das vorhattest.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Thunder

BeitragFr, Aug 07, 2015 0:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke auch, dass eine C++ while schleife nicht langsamer ist als eine Blitz-While-Schleife Very Happy

Include bedeutet im Prinzip (für den Compiler) nur "bevor du in die nächste Zeile springst, kopiere den Quelltext dieser Datei herein und kompiliere den". Das ist völlig statisch zur Compilezeit. Im erstellten Programm/Maschinencode kommt sowas wie Include gar nicht vor.

BlitzGrünschnabel hat Folgendes geschrieben:
Gibt es zudem die Möglichkeit Dateien zu erstellen, die einen Programmcode enthalten sich aber nicht erneut mit Blitz3D bearbeiten lassen?


Wie BladeRunner sagte, wenn du dir ne exe kompilierst. Aber ich wollte hinzufügen: Falls du das in einem modularen Sinn meinst. Also, dass du dein Hauptprogramm hast und nebenbei Teile, die man austauschen, aber nicht verändern können soll, dann solltest du dir aus C/C++ eine DLL bauen und die in Blitz einbinden.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Silver_Knee

BeitragFr, Aug 07, 2015 3:18
Antworten mit Zitat
Benutzer-Profile anzeigen
zu blade: https://www.blitzforum.de/foru...hp?t=25242

DAK

BeitragSo, Aug 09, 2015 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzGrünschnabel hat Folgendes geschrieben:
Vermutlich kann man dies beheben in dem man wait-Befehele oder ähnliches einbaut, aber dadurch würde ich doch unter Umständen zu einem Delay beitragen, oder gar verhindern, dass der Klick erkannt wird.


Du hast hier einen ganz grundlegenden Denkfehler. Wenn du das Programm ungedrosselt rennen lässt, dann rennt es auf einem Prozessorkern auf Vollgas. Selbst auf einem langsamen PC rennt so eine simple Schleife wohl einige zehntausend Male die Sekunde.

Jetzt kann ein Mensch nur so rund 20-25 Bilder die Sekunde sehen, also sollte das Feedback von der Eingabe zumindest innerhalb von 40 ms zurück kommen (25x pro Sekunde). Nach Shannon Nyquist sollte man mindestens die doppelte Frequenz anzeigen, die man sieht. Deswegen rennen übliche Bildschirme auf 60 Hertz, also 60 Bilder die Sekunde. Was schnelleres als 60 Hertz ist nicht anzeigbar. Da es allerdings zwischen dem Rendern und Anzeigen der Bilder noch eine Schicht gibt, kann man hier Shannon Nyquist noch mal anwenden und kommt somit auf 120 FPS maximum. 120 FPS entspricht 8.3 ms pro Bild oder Hauptschleifendurchlauf. Alles was du mehr machst als das ist absolut verschwendet.

TLDR: Auf Vollgas hast du ein paar Tausend FPS bei so einer simplen Schleife. Du brauchst maximal 120, alles was da drüber ist ist reine Verschwendung und macht nichts besser. Aber auch 60 sind völlig ausreichend.

@Klick erkennen:
Dafür verwendet man KeyHit. Wenn der User eine Taste drückt, dann wird Keyhit auf 1 gesetzt, bis du es ausliest. Da geht nichts verloren, auch wenn du erst Minuten später abfragst.
Gewinner der 6. und der 68. BlitzCodeCompo

Cykid

BeitragMo, Aug 10, 2015 10:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Macht es eigentlich Sinn die Schleifen doch schneller durchlaufen zulassen um damit gegebenfalls genauere Berechnungen zu erreichen?

EDIT: Okay, das ist völliger Quatsch Very Happy

TimBo

BeitragMo, Aug 10, 2015 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Cykid,

Das ist eigentlich gar nicht mal so ein Quatsch wie du denkst.
Bei Computer Spielen werden z.T. auch die Physik mit 100Hz und die Renderings mit 60Hz durchlaufen.

Man muss halt auch aufpassen, dass es nicht zu aliasing kommt.


Habe ich eben auf die schnelle gefunden
http://gameprogrammingpatterns.com/game-loop.html

In Blitz macht das allerdings wenig Sinn, da man eh nur im Render-Thread ist.
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

DAK

BeitragMi, Aug 12, 2015 13:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier kommt wieder das Shannon-Nyquist-Abtasttheorem rein. Der ist ganz wichtig bei sowas.

Das besagt, wenn man ein Signal der Frequenz f richtig abtasten möchte, dann muss man mindestens mit 2*f abtasten.

Das heißt, wenn der Bildschirm für jedes Bild das die Augen sehen ein schön passendes Bild liefern will, dann muss er doppelt so schnell Bilder liefern, wie das Auge sehen kann. Bei 20-25 Hz der Augen heißt das, mindestes 50 Hz für den Bildschirm. Normalerweise macht man 60 Hz.

Wenn die Physik für jedes dieser Bildschirmbilder eine passende Physik liefern will, dann muss das wieder doppelt so schnell laufen, also wieder so 120 Hz.

Das macht allerdings nur dann wieder Sinn, wenn die Physik unabhängig vom Rendern läuft, also in einem eigenen Thread.

In Blitz gibt es nur einen Thread, also kann die Physik ruhig synchron mit der Renderfrequenz laufen, da Shannon Nyquist hier nicht greift.

Schneller bringt also nichts, ist rein verschwendet.
Ein mal auf, es bringt nichts, eine riesige Autobahn zu bauen, wenn sie nur zwei kleine Dörfer verbindet.
Gewinner der 6. und der 68. BlitzCodeCompo

Cykid

BeitragMi, Aug 12, 2015 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
DAK hat Folgendes geschrieben:
Hier kommt wieder das Shannon-Nyquist-Abtasttheorem rein. Der ist ganz wichtig bei sowas.[..]


[..]
In Blitz gibt es nur einen Thread, also kann die Physik ruhig synchron mit der Renderfrequenz laufen, da Shannon Nyquist hier nicht greift.

Schneller bringt also nichts, ist rein verschwendet.
Ein mal auf, es bringt nichts, eine riesige Autobahn zu bauen, wenn sie nur zwei kleine Dörfer verbindet.


Genau das is mir dann auch eingefallen ^^
Gut in Alternativen Sprachen macht es vlt. Sinn.
Aber ich persönlich bin da noch nie an die Grenzen gestoßen.

BladeRunner

Moderator

BeitragMi, Aug 12, 2015 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein wenig Feedback vom Threadstarter wäre nett...
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

BlitzGrünschnabel

BeitragDo, Aug 20, 2015 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Tut mir leid hatte leider einen blöden Motocross-Unfall wodurch ich völlig aus dem Konzept gewurfen wurde und mich deshalb zunächst um anderes kümmern musste. Geht zwar nun bisschen besser, aber das soll nicht Thema sein und nun back to topic!

@Lador & BladeRunner:
CreateTimer war genau der Befehl den ich gesucht habe vielen DANK! Hat soweit funktioniert meine CPU-Leistung ist von 28% auf 0,7% gesunken, ich denke das ist völlig in Ordnung oder? Da selbst mein Browser beim schauen von Videos usw. mit 4% zu Buche schlägt.

@Lador & Thunder:
Zum Auslagern der Datein:
Ich habe noch nicht so viel Ahnung vom Programmieren und möchte mich rantasten und ein Spiel für mich und meine Freunde entwickeln, vlt. auch veröffentlichen wenn es gut werden sollte. Ich habe daran gedacht Beispielsweise eine Datei für Items zu erstellen und sollte ich dann in Zukunft neue hinzufügen wollen, so müsste ich meinen Freunden nur die eine Datei senden, die sie ersetzen sollen. Im Prinzip sowas wie ein Patch. Nun möchte ich aber, dass niemand die Datei öffnen kann und herumschrauben kann um sich Vorteile zu verschaffen. Wenn ich eine .bb Datei include dann kann es ja jeder der das Programm hat einfach bearbeiten. Im Prinzip geht es mir um Schutz vor der Bearbeitung.
Müsste ich also wie Thunder vorgeschlagen hat beispielsweise mit C++ Datein schreiben?

@DAK:
Vielen Dank für die Erklärung dahinter ~ macht schon Sinn und nun weiß ich bescheid!

Vielen vielen Dank auch an die anderen eine wirklich tolle Community! Ich bin leider nicht sehr geduldig und
habe deshalb den Thread was ein Anfänger vermeiden sollte nicht wirklich beachtet ich glaub da stand auch was zum CreateTimer drin, deshalb und für meine Verzögerung der Antwort möchte ich mich nochmals entschuldigen!
____________________________________________________________________________________

Zu einer neuen Frage, wenn das nicht ausartet aber ich zerbreche mir wirklich den Kopf wie ich das am
einfachsten umsetzen kann:

Im Prinzip ist es ein Slider Inventar mit 5 Fächern die sich durch draufdrücken switchen lassen. Es werden immer 13 Items zur Zeit angezeigt (zunächst einfach eine Nummerrierung um die Items kümmer ich mich noch es geht einfach nur ums Prinzip). So nun möchte ich mit einem Button schön nach unten oder oben scrollen aber mein Problem ist, dass ich den Button in der Festen größe haben möchte und die 5 Fächer unterschiedlich viele Items fassen können. Also im Prinzip drückt man auf den Button und zieht ihn hoch oder runter und je nachdem wie viele Items das Fach hat, umso schneller oder langsamer lässt sich der Button ziehen, was bei den Fächern aber kaum zu spüren sein sollte da sie fast die identische Anzahl an Items fassen:

Itemanzahl:
177 (Fach 1)
177 (Fach 2)
172 (Fach 3)
172 (Fach 4)
172 (Fach 5)

Bild
user posted image

Zunächst hatte ich vor einfach durchzublättern über einen Button, doch das finde ich nicht sehr elegant und komfortabel. Wenn mir jemand helfen könnte wäre ich wirklich dankbar, da ich nichts brauchbares gefunden habe und mir den Kopf zerbreche wie man das machen könnte.
 

Lador

BeitragDo, Aug 20, 2015 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nehme mal an (da du ja nicht sehr geduldig bist Wink ), dass du dir auch noch kein Tutorial oder Buch zu BlitzBasic angeschaut hast?
https://de.wikibooks.org/wiki/...y-Tutorial
Dort müsstest du so ziemlich alles wesentliche finden.

Zu deiner Frage mit den Patches sieh dir mal diese Rubrik in der Hilfe an:
https://www.blitzforum.de/help/?subcat=14
Mithilfe der dort vorgestellten Befehle kannst du deine Items (bzw. die benötigten Daten) in eine eigene Datei (Achtung: keine BlitzBasic-Quellcode-Datei, sondern eine Datei beliebigen Formats) speichern. So musst du die Items nicht "hardcoden", d.h. bei Änderungen der Items aktualisierst du diese Datei und schickst diesen Patch deinen Freunden, ohne den Quellcode zu verändern (und sparst dir damit, ihnen bei jedem Update die Exe-Datei zu schicken, weil die meistens wesentlich mehr Speicher braucht).

Das mit dem Scrollbalken möchte ich (und ich nehme an, manche anderen hier auch) dir eigentlich nicht verraten, weil es eine sehr schöne (auch relativ einfache) Übungsaufgabe ist. Wink Wenn du gar nicht mehr weiterkommst, kannst du auch die Forensuche oder Google benutzen.
Du benötigst etwas Mathematik. Überleg mal: Du brauchst die oberste (Start-)Position des Scrollbalkens, die "unterste" Position der oberen Kante (beides als y-Koordinaten) [ Arrow Anzahl der Pixel, die man den Balken bewegen kann], die Anzahl der darstellbaren Objekte (in deinem Fall 13) und die Anzahl der insgesamt enthaltenen Objekte (bei deinem Beispiel 172 oder 177). Letztes speicherst du am besten in einem Array, wobei für jedes Fach (1 bis 5) ein Platzhalter reserviert ist. Je nach Position des Balkens (bezogen auf die Ausgangsposition ganz oben) werden dann eben nur die "gewünschten" 13 Items dargestellt (direkte Proportionalität, falls du das in der Schule schon hattest).

Mir scheint, dass du dir vielleicht erst einmal das oben genannte Tutorial anschauen solltest (und die als wichtig markierten Threads hier in der Beginners-Corner), da du kaum Vorkenntnisse hast. Es bringt wenig, sich dann gleich auf ein Spiel zu stürzen, wenn man wenig Grundlagen hat. Schließlich wird man nach der Geburt auch nicht gleich in ein Büro zum Arbeiten gesetzt, sondern man muss davor erst einmal eine lange Zeit lernen. Wink

MFG Lador
Mein aktuelles Projekt:
2D-Rollenspiel "Iliran"
Screenshot | Worklog
Fortschritt: ca. 70%
 

BlitzGrünschnabel

BeitragFr, Aug 21, 2015 12:09
Antworten mit Zitat
Benutzer-Profile anzeigen
@Lador zum Auslagern:
Vielen Dank das ist genau das, was ich gesucht habe!

Und zum Slider auch da vielen Dank ich glaube ich habe dank deiner Anregung jetzt eine Idee ich versuche das mal umzusetzen! Wink
 

BlitzGrünschnabel

BeitragMi, Sep 02, 2015 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab da mal eine Frage zu folgendem Code:

If MouseZSpeed() < 0 Then
y = y + 10
Else If MouseZSpeed() > 0 Then
y = y - 10
End If

Ich möchte nämlich den Slider auch über mein Mausrad bedienen können und habe mir die entsprechende Funktion bzw. den Befehl angeguckt und mein Problem ist, dass es nicht funktioniert. Lediglich die Abfrage die vorangestellt wird, kann auch abgefragt werden. Stelle ich also MouseZSpeed() > 0 voran, so funktioniert der Befehl y = y - 10 aber MouseZSpeed() < 0 wird nicht mehr erkannt, woran liegt das?

Eingeproggt

BeitragMi, Sep 02, 2015 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wird dieser Wert oft benötigt (mehrmals während eines Schleifendurchgangs), so sollte er am Anfang in einer Variablen gespeichert werden, da immer nur die Verschiebung seit dem letzten Funktionsaufruf zurückgegeben wird.


Zitat-Quelle

Das sagt eigentlich alles. Einmal in ne Variable zwischen-speichern, dann mit der Variable arbeiten und es wird klappen.

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

BlitzGrünschnabel

BeitragDo, Sep 03, 2015 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke hat geklappt!
 

BlitzGrünschnabel

BeitragSa, Sep 05, 2015 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein weiter Frage:
Manchmal lasse ich das Programm laufen öffne ein paar andere Fenster gehe wieder zurück zum Spiel und naja, das Bild schein eingefroren. Sound läuft weiter auch der Rolloversoundeffect wird ausgeführt doch das Bild aktualisiert sich nicht. Was mache ich da falsch?

SpionAtom

Betreff: Vereinfachung

BeitragSa, Sep 05, 2015 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzGrünschnabel hat Folgendes geschrieben:
Hab da mal eine Frage zu folgendem Code:

If MouseZSpeed() < 0 Then
y = y + 10
Else If MouseZSpeed() > 0 Then
y = y - 10
End If


Oder so:

Code: [AUSKLAPPEN]
y = y + MouseZSpeed() * 10
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group