Zu langsame Spiele

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

Tennisball

BeitragDi, Aug 06, 2013 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Es war wohl gemeint "Du verwendest Frame-abhängige Programmierung", Erklärung dazu steht ja schon oben.

Wir wollen dich übrigens nicht als ein "Nichts" abstempeln. Auch wenn du findest, dass der Ton nicht ganz stimmt, bleibt die Grundaussage: Arbeite erstmal Tutorials durch, bevor du dich an eigene Projekte wagst. Dazu ist vor allem auch dieses Tutorial zu empfehlen. Learning by doing ist ja auch nicht falsch, aber genau das tust du ja eigentlich auch, wenn du das Tutorial wirklich bearbeitest, und dort lernst du die Dinge, die du in deinen eigenen Projekten auf jeden Fall brauchen wirst.

Gruß,
Tennisball
 

Blond Panda

BeitragDi, Aug 06, 2013 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, das du mir erklärt hast, was abhängige Programmierung bedeutet. Very Happy

Genau das war mein Problem. Ich wusste damit nichts anzufangen.

Na ja. Trotz vieler lieber hilfen (das meine ich ernst.)
Ich programmiere weiter an dem Programm, wie es mir passt Smile
Trotzdem danke.

@count doku:
Vielen dank. Ich habe das mit images collide zur kenntnis genommen. Kannst du mir glauben.
Ich andworte ab jetzt nicht mehr. Ihr könnt also mit diesem Thema machen, was ihr wollt Very Happy

Xeres

Moderator

BeitragDi, Aug 06, 2013 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
@Pummelie:
Wir sind hier im Beginners-Corner. Entsprechend wäre ein bisschen Zurückhaltung deinerseits Angebracht. Wenn du nicht helfen willst, ignoriere den Thread.

Anfänger werden sowieso nicht innerhalb von 2 Stunden all ihre Fehler einsehen...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Pummelie

BeitragDi, Aug 06, 2013 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres, ich bin keinen Schritt weiter an den Anfänger heran getreten als er an mich, was du bemerkst wenn du meinen Post auf den du dich sicher beziehst mal mit seinem vergleichst.

Hilfe gegeben habe ich jedes mal, auch wenn es nur ein Hinweiß auf einen Fehler war oder ein allgemeiner Vorschlag zur Güte.


Aber der ganze Thread ist ja nun hinfällig da unser hoch geschätzter Anfänger zugibt, unsere Ratschläge zu ignorieren, und sich weiterhin einer unvorteilhafen Programmierweise hin zu geben.
It's done when it's done.

Spark Fountain

BeitragMi, Aug 07, 2013 0:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Huiuiui. Schon bemerkenswert, wie sich so ein banaler Sachverhalt zum Streit entwickeln kann... Und ich werde mich hüten, hier irgendwem Schuldzuweisungen auszusprechen, dass es dazu gekommen ist. Aber nochmal zurück zum Thema:

@Blond Panda: Vielleicht schaust du ja später nochmal in den Thread, wenn sich deine Laune wieder gebessert hat. Deshalb hier noch eine Frage von mir: Kann es sein, dass dein Betriebssystem Windows 8 ist, und das von deinem Bruder ein anderes? Ich hatte nämlich bis vor zwei Wochen auch Windows 8 auf meinem Rechner, und hab das festgestellt, dass im Vollbildmodus die FPS auf sage und schreibe 20(!) weggebrochen sind. Da konnte ich irgendwie auch nix dran optimieren; deshalb habe ich auf Windows 7 gewechselt und da klappt alles wieder. Paradoxerweise hatte ich im Fenstermodus unter Win8 trotzdem volle 60 FPS (also das Maximum, was ich haben wollte).
Gewinner der MiniBCC's #11, #13 und #28

Pummelie

BeitragMi, Aug 07, 2013 11:26
Antworten mit Zitat
Benutzer-Profile anzeigen
@Spark Fountain, habe diese Probleme mit einem Windows Server 2012 System ebenfalls gehabt.
Ist wohl irrgendein Problem mit der Energiesteuerung, nachdem ich das Profil Höchstleistung ausgewählt hatte lief alles super.
It's done when it's done.

DAK

BeitragMi, Aug 07, 2013 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, man kann doch auch von einem Anfänger erwarten, dass er in dem Forum in dem er postet die Stickys durchprobiert, bevor er einen Roman postet und Leute anbellt, weil sie ihm die Lösung geben, ihm aber die Lösung nicht passt.

Hier im Beginners-Corner gibt es ganz oben einen Thread namens "BlitzFAQ". Bei dem Thema hätte auch der werte Herr Blond Panda sich denken können, dass es in der zwölfjährigen Geschichte von Blitz3D schon mal aufgekommen sein könnte. Lustigerweise ist seine Frage GENAU DER ERSTE LINK in dem BlitzFAQ. Die Antwort darauf ist zwar kein bändelanges Werk, aber zusammen mit Google ergibt es alles was man braucht.

Auch die Bordsuche nach dem Thema ergibt so geniale Werke zu dem Thema wie dieses hier: Hurra, 100 % Auslastung

Dazu kamen gut 15 Antworten, die die Frage extensiv und gut beantworten. Alle von Blond Pandas Antworten waren im Stil von "Das problem liegt nicht am code.", "Das Problem ist die Geschwindigkeit. Nicht die FPS." und herummocke, weil er meint, das Wort Frame-Unabhängig macht keinen Sinn.

Also, noch mal an dich, Blond Panda, von Anfang an: Das hier ist ein Programmierer-Forum, wo andere Programmierer gerne Anfängern helfen, das Programmieren zu lernen. Wir sind kein Supportforum und wir kriegen auch kein Geld dafür, dir zu helfen. Wir haben keinerlei Verpflichtung dir zu helfen. Wir tun das, weil es uns freut zu sehen, wie jemand weiter kommt und etwas lernt. Was wir nicht mögen, ist, wenn wir jemandem jeden Mist, der schon dutzende Male hier beantwortet wurde, nochmal zu erklären.

Hier noch mal zum Mitschreiben, was man tut, wenn man als Programmierer ein Problem hat:
1) Dokumentation lesen. Die BlitzBasic-Dokumentation findest du im Forum ganz oben unter dem Banner unter Hilfe.
2) Die Bordsuche bemühen. Suche nach allen Stichwörtern, die dir zu dem Thema einfallen. Fast alles, was du im Beginners Corner fragen würdest (oder du im Laufe des nächsten Jahres fragen wirst), wurde schon mehrfach beantwortet. Damit sparst du dir und uns viel Zeit.
3) Google bemühen. Da du ja so ein astrein-perfektes Englisch kannst, steht dir auch das englische BlitzBasic-Forum (unter www.blitzbasic.com) zur Verfügung. Dort gibt es sogar noch weitaus mehr Beiträge als hier.
4) Wenn du Wörter nicht kennst, oder sie dir keinen Sinn machen (viele Wörter, die Programmierer verwenden, haben eine andere Bedeutung als außerhalb des Programmierens. Ein Frame ist so nicht ein Bilderrahmen, sondern ein Hauptschleifendurchlauf, vor allem einer, in dem ein Bild gerendert wird), dann gib sie in Wikipedia (auch dem englischen Wikipedia) oder Google ein.


Diese Schritte kann und tut man auch von einem Anfänger erwarten. Du bist hier nicht in der Schule, selbstständiges Arbeiten und Lernen ist absolut essenziell, wenn du mal was als Programmierer reißen willst.


Außerdem musst du auch noch ein paar grundlegende Sachen verstehen:
1) Wenn dein Programm Probleme macht (vor allem, wenn es noch weniger als zwei oder drei Jahre programmierst), dann bist DU und DEIN Code daran schuld, nicht Blitz oder Windows oder sonst was.
2) Wenn jemand dir eine Frage beantwortet, und du sie nicht verstehst (vor allem, wenn dir mehrere Leute eine Frage beantworten, und du sie alle nicht verstehst), dann solltest du dir noch mal die Basics anschauen. Wir beantworten hier schon seit Jahren Anfängerfragen. Wir haben schon hunderten Anfängern geholfen. Wir sind darin geübt, wir können das. Wenn dir unsere Antworten zu kompliziert sind, dann fehlt dir so viel Basiswissen, dass du wirklich noch einiges aufzuholen hast. Zurück zu den Tutorials.
3) Wenn du Leute, die dir Fragen beantworten, angehst, und sie öffentlich für blöd hällst, dann wirst du bald keine Antworten mehr bekommen. Mach Leute sauer, und es gibt keine Hilfe. Statt auf eine Antwort, die du nicht verstehst, mit "Du bist ja doof" zu antworten, solltest du mal ALLEN ihrer Links folgen, und versuchen, zu verstehen, was sie meinen. Falls das nichts bringt, kannst du HÖFLICHST nachfragen, und dabei schauen, dass du ihnen auf keinen Fall auf die Zehen trittst.
4) Wenn Leute dir Links geben, dann sind das keine Quellenverweise wie in Wikipedia, die man getrost ignorieren kann, sondern DIE ANTWORTEN. Diese Fragen wurden schon dutzende Male beantwortet, also warum noch mal schreiben?
5) Die anderen wissen mehr als du, sie sind nicht die, die lächerlich da stehen, wenn du so abgehst, wie vorhin.

Zu aller Letzt, lies dir BladeRunners Tipps für Neueinsteiger durch. Das ist Pflicht.

Man kann auch von einem Beginner erwarten, dass er lesen kann, und das auch tut, vor allem, wenn er eh so toll ist in Sprachen.
Gewinner der 6. und der 68. BlitzCodeCompo

TimBo

BeitragDo, Aug 08, 2013 3:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Also der Code ist jetzt nicht so umfangreich. Das heißt, man könnte ihn relativ schnell komplett neu und sauber schreiben. Was des öfteren auch bei eingefleischten Codern passiert. Ist zwar immer ein wenig ärgerlich, aber so ist das beim Programmieren nunmal Wink


Flip(1) <- das Programm wartet auf ein Signal, dass der Bildschirm bereit ist.
Flip(0) <- wartet nicht - daher ist ein Timer WaitTimer CreateTimer von Nöten.
Edit: sry war schon spät Embarassed- danke Pummelie

Es ist von Vorteil - für den Programmierer auch wie für das Programm - jede Tasteneingabe bzw. Mausstates genau einmal in jedem Frame anzufragen.

Heißt:
mh1 = MouseHit(1)
mh2 = MouseHit(2)
md1 = MouseDown(1)
KeyEscapeH = KeyHit(1)
KeyEscapeD = KeyDown(1)
und so weiter und so fort für alle Statements, die du in einem Schleifendurchgang benötigst.

Der Vorteil liegt darin:
wenn KeyHit oder MouseHit zwei mal in einer Schleife abgefragt wird, dann ist das mit sehr viel Glück verbunden bei welchen der beiden die Abfrage true zurück gibt.

If KeyHit(28) then print("hallo welt")
If KeyHit(28) then print("Test")

man erwartet, dass hallo Welt und Test ausgegeben wird. Aber es wird immer nur eine der beiden Aktionen ausgelöst.



Mit dem Wissen solltest du evtl. das Programm neu schreiben oder umschreiben, denn sonst kannst du das projekt früher oder später leider echt vergessen Confused
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.
  • Zuletzt bearbeitet von TimBo am Do, Aug 08, 2013 14:16, insgesamt einmal bearbeitet

Pummelie

BeitragDo, Aug 08, 2013 7:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Nette Zusammenfassung einiger Probleme des Codes TimBo, jedoch hast du bei dem Flip was verwechselt Wink
It's done when it's done.

BladeRunner

Moderator

BeitragDo, Aug 08, 2013 8:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Da der Threadersteller sich ja angekündigt zurückgezogen hat ist jedwede weitere Diskussion über sein Programm müßig. Er will es auf seine Tour, soll er es so haben.
Das Grenzgetrolle können wir uns hier doch sparen.
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
 

Blond Panda

BeitragMo, Aug 26, 2013 13:05
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, ok. is doch gut. Ich habe mich wieder gefangen.

Ich verwende Win7
Mein Bruder auch.
Flip befehl verändert.
Zack! Das Spiel läuft rasend schnell. (zu schnell natürlich)
Create Timer sollte funzen.
Sehe ich mir mal an.
 

PhillipK

BeitragDi, Aug 27, 2013 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Huch oO
Da liest man mal nicht mit.. Jungs jungs jungs.

Mal ein wenig konstruktivie kritik:

Dein mainloop ist... intressant Smile
In deinem eigenen intresse solltest du wirklich die If-abfragen etwas ausbessern. Ich steig jedenfalls nicht durch. Aber das macht auch nichts weiter - da passiert nichts, was deine speedprobleme verursacht.

Da du Flip 0 reingehaun hast, musst du auf jedenfall einen timer einbauen.

Grundlegendes wurde schon erklärt (flip 1 = vertikale sync usw.) aber bedenke auch:
Timer (CreateTimer und WaitTimer nutzen!) geben die kontrolle des programmes ab. DH dein programm frisst auch nur wirklich soviel cpu wie es braucht - ist es durch, wird der kern anderweitig genutzt.
Würde mich nicht wundern, wenn die paar befehle mehr als 0.01% cpu leistung futtern Smile

Frameabhängige programmierung ist tricky.
Kleines beispiel: Bewegung.
Hat man ein spiel, welches ein viereck von links nach rechts bewegt, pro frame durchgang um exakt 2 einheiten, ist es bei 30fps nur halb so schnell wie bei 60fps.

Um dem abhilfe zu schaffen, lohnt es sich, ein wenig zu rechnen. Ich verwende gerne ein Type den ich mir mal geschrieben habe (allerdings blitzmax, da werde ich dir den code nicht posten, überfordert dich wahrscheinlich als anfänger)
Vielmehr fasse ich die logik zusammen:

1) Man legt 3 globale variablen an. - Alte Millisekunden und Neue Millisekunden. Im idealfall mit dem hier: Hilfe: Millisecs() sowie eine "delta" variable (oder AppSpeed oder sonstwas.. ein skalierfaktor den man später nutzen will!)
2) Man merkt sich die wunsch-fps als float zahl. Als beispiel 60.0 (ich nenne es im folgenden hertz!)
3) Man geht jeden schleifendurchgang einmal eine funktion ab (oder schreibts direkt in den mainloop:)

alte_millisekunden = neue_millisekudnen
neue_millisekunden = Millisecs()

delta = ( ( neue_ms - alte_ms ) * (hertz / 1000.0))

4) Tada!

Erklärung:
Dadurch, das man in jedem schleifendurchgang die dauer des letzten schleifendurchganges ermitteln kann (nämlich mit neu - alt) können wir den wert in einem faktor umrechnen.
wenn der alte frame zb 16 ms gebraucht hat und die hertz zahl auf 60 eingestellt ist, ist der wert "delta" ziemlich nah an 1.0 dranne. Exakt geht leider nicht, da Millisecs() auf integer beschränkt ist und man nur ganze 1millisekudnen schritte messen kann.
Aber das macht nix Smile

Wenn wir nun unser Viereck mit diesem deltawert bewegen: position = position + 2 *delta
Wir es sich auf jedem rechner gleich schnell bewegen. Egal, ob es mit 1 fps oder mit 1000fps rennt. Der deltawert wird dementsprechend errechnet und skaliert die +2 entweder hoch (+4 bei 30fps laufleistung zb) oder runter (+1 bei 120fps laufleistung). Das nennt sich dann "frameunabhängig".

Mein tipp: Wenn du eine solche rechnung verstanden hast und sie nutzen willst, arbeite immer mit flip(0) und einem timer. Zusammen mit diesem skalierwert wird sich jedes deiner projekte auf allen pcs gleich schnell verhalten und die cpu schonen.
Einzig das alter von Blitz3d kann da noch probleme machen :-/

------------------

So nun weiter im kontext:

grundaufbau einer hauptschleife.

Du wirst schnell feststellen, das es ein graus ist, wenn man einfach drauf los programmiert und hinterher so sachen wie ein Hauptmenü oder ein Optionsmenü einzubauen.

Hier sollte man sich direkt von anfang an mit dem grundaufbau befassen.

Als beispiel:
Nutze funktionen, um deine Programmteile zu gliedern.
Rendern(), GameUpdate(), MouseUpdate() undsoweiter undsofort.
Danach rufst du in deiner hauptschleife nacheinander nurnoch die passenden befehle auf.

Ausserdem bindest du das ganze an einen wert - zb GameState = 0 ist das hauptmenü.
Dh deine hauptschleife sieht wie folgt aus:
1) MouseUpdate()
2) Abfrage: Welchen gamestate habe ich?
2.1) Hauptmenü? -> MenuUpdate() und MenuRender()
2.2) Spiel an sich? -> GameUpdate() und Rendern()

undsoweiter Smile

Das ganze hat 2 vorteile:
1) Es lässt sich leichter erweitern, als den passenden punkt in der hauptschleife zu suchen und irwo dazwischen was einzubringen.
2) Du zwingst dich selbst dazu, deine Teilprobleme zu kapseln.

Kapseln heißt zb, das du die Mausdaten (Wie oben bereits mal beschrieben) gesondert einliest. Es kommt nämlich irgendwann der zeitpunkt, wo du MouseHit() verwendest und das direkt 2x Wink Und dann ist die sucherrei groß: Das erste MouseHit() gibt vielleicht TRUE zurück, wärend das 2te niemals eintritt. Grund? Hit abfragen setzen den status der dahinter steht direkt zurück.

Durch das kapseln wirst du globale variablen nutzen um die daten zwischenzuspeichern um sie in anderen Programmteilen zu ntuzen. Das schränkt das fehlerpotenzial ein.

Ausserdem sieht die hauptschleife übersichtlicher aus.

Pfew, ich wieder mit meinem redeschwall.. hoffe ich hab geholfen Smile

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group