Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Apr 18, 2024 19:26

Foren-Übersicht » Sonstiges » Community-Projekte
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Aug 14, 2006 11:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Hi...
Beim anschauen von ein paar Artikeln aus dem Wiki ist mir der Timebased Movement Artikel aufgefallen...

Wäre es nicht eigentlich Zeit ihn mal zu überarbeiten?
Zum einen finde ich das der Code nicht unbedingt das Gelbe vom Ei ist (insbesondere als Anfänger der von Flashs Tutorial auf den Artikel kommt, ist man wahrscheinlich danach verwirrt), zum anderen wäre es vielleicht an der Zeit zu klären ob eine absolute Genauigkeit per Hardware jetzt immer möglich ist, oder nicht, denn das ist nicht gerade vertrauenserweckend:
Wiki hat geschrieben:
Es kann jedoch theoretisch sein(auch jetzt noch?), dass diese nicht zur verfügung steht.


Außerdem meinte Magellan ja in diesem Topic das man von eienr Lösung mit GetTickCount absehen sollte, während das Wiki ja genau diese Möglichkeit vorschlägt.

cya,
Deathball


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 18, 2006 11:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Ich für meinen Teil würde den Code aus dem Wiki folgendermaßen ersetzen:
Code:
  1.  
  2. var
  3.  [...]
  4.  Freq, StartCount, EndCount: Int64;
  5.  Speedfactor: Extended;
  6.  
  7. const
  8.  Scalefactor = 100;       //Der Scalefactor ist ein beliebiger Wert um den Speedfactor zu beeinflussen
  9.  
  10. [...]
  11.  
  12. procedure TForm1.FormCreate(Sender: TObject);
  13. begin
  14.  QueryPerformanceFrequency(Freq); //Frequenz des Rechners ermitteln
  15.  [...]
  16. end;
  17.  
  18. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  19. begin
  20.  QueryPerformanceCounter(StartCount); //Zeit0
  21.  Form1.Render;
  22.  QueryPerformanceCounter(EndCount); //Zeit1
  23.  
  24.  Speedfactor := ((EndCount - StartCount) / Freq) * Scalefactor //(Zeit1 - Zeit0) / Frequenz
  25. [...]
  26. end;
  27.  


Dann würde ich noch hinzufügen das man den Speedfactor mit sämtlichen Bewegungen/Bewegungsvektoren multipliziert.



Das ist imho eine verständlichere Variante, die eigentlich auch Anfänger die sich von Flashs Tutorial dorthin geklickt haben verstehen.
Interessieren würde mich jetzt allerdings ob ihr das genauso seht oder anderer Meinung seid...

cya,
Deathball


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 18, 2006 15:02 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Sieht soweit gut aus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 18, 2006 18:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Habe den Artikel überarbeitet. Werde evt. noch mehr machen. Aber nur zu, es ist ein Wiki bei dem jeder etwas ändern darf der möchte.

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 18, 2006 22:56 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
Ist es unter umständen nicht gescheiter mit timern (zb den sdl timern) oder eben anderen treads zu arbeiten, anstatt das ganze über rechnungen zu machen?

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 18, 2006 23:10 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Die Auflösung von Timern ist auch beschränkt, Threads sind nominell besser, denoch existiert dann das Problem der Synchronisierung.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 18, 2006 23:13 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
wie meinst du das problem der synchronisierung?

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 18, 2006 23:25 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Wenn wir als Beispiel das Sonnensystem nehmen, dann hat die Erde ja einen Winkel.
Bei dem Code aus dem Wiki macht man einfach bei jedem Rendern:
Code:
  1.  winkel+=1*Speedfactor


Bei Threads hättest du einen Thread der ungefähr so aussieht:
Code:
  1. begin
  2.   while not end do
  3.   begin
  4.     winkel+=winkel;
  5.     sleep(100);
  6.   end;
  7. end;

Das Problem tritt bei dem Beispiel und der 32-Bit-Zahl weniger auf, aber spätestens bei grösseren Sachen besteht die Gefahr. Und zwar folgende:
Der Thread hat ein Teil des Winkel aktualliert, z.B. die ersten 16-Bit, die restlichen 16 sind noch alt. Dann unterbricht das OS und gibt die Zeit an den zweiten Thread bzw. deinem Rendercode, der dann aus Winkel absoluten Müll ausliest, weil absoluter Müll drinnen steht. Und genau das ist das Syncronisationsproblem.
Genaueres steht im Tutorial_Multithreading.

Auch ist mir beim Schreiben des Beispielcodes aufgefallen, dass der Code so immer noch Schwachsinn ist und man denoch bei sleep nen Zeitfaktor einbauen muss.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 19, 2006 00:19 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
ahh ich weiss was du meinst, aber wenn das zeug 25-40 frames /s hat, dann sollte das kein problem mehr sein, zb bei partikeleffekten, denn ab 25 frames siehst du keinen unterschied mehr ob noch was geändert wurde oder nicht. ab dann läuft das spiel flüssig.

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 21, 2006 16:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Da bisher noch keiner was gegen meinen Code gesagt hat und Flo mich ermutigt hat werde ich demnächst den Code bei dem entsprechenden Abschnitt abändern...


der eigentliche Grund für den Post hat sich erledigt


cya,
Deathball


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Sonstiges » Community-Projekte


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.059s | 17 Queries | GZIP : On ]