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

Aktuelle Zeit: Sa Jul 19, 2025 21:12

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Aug 10, 2005 17:12 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 21, 2003 17:36
Beiträge: 141
Hi!
Ich beschäftige mich zur Zeit mit dem Umstieg auf SDL und bin bisher schon recht überrascht, wie einfach das eigentlich war ;)
Beim näheren Blick fällt mir allerdings auf, dass ich ja um die Anwendung auch auf anderen Platformen starten zu können, auf einige von Windows gelieferte Units und damit auf viele Funktionen verzichten muss (Ich schätze mal SysUtils ist ne Windows Unit!?).
Da wären u.a. folgende Dinge die mir ins Auge fallen:
1. In der SysUtils gab es einen TFileStream. Aber wie soll ich das jetzt meine Dateien laden, ohne den?
2. Ich bräuchte den Pfad der ausführenden Datei. Wie bekommt man den ohne dass ich eine Form habe?
3. Die Maustasten kann ich zwar alle wunderbar abfangen, aber wie geht das mit dem Mausrad?

Danke für die Antworten :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 10, 2005 18:10 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
1) Für Sysutils gibt's auch eine Linux Version
2) ParamStr(0)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 11, 2005 07:08 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Die Units SysUtils, Classes und ContNrs kann ich unter Windows und Linux verwenden. Mein SDL - Beispiel läuft unter beiden Welten ohne Quellcode - Änderung, habe aber nicht jede Klasse geprüft.

Gruß
Thomas

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 11, 2005 14:04 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Die ganzen Delphi-Units sind erstmal von Borland. Von denen gibt es ein paar, die plattformspezifischen Code enthalten. Du merkst das daran, dass du beim Kompilieren unten eine Warnung stehen hast, dass die Unit 'FileCtrl' z.B. nicht Cross-Platform ist.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Zuletzt geändert von Frase am Fr Okt 21, 2005 15:18, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Aug 11, 2005 14:57 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Mr.Fletcher hat geschrieben:
3. Die Maustasten kann ich zwar alle wunderbar abfangen, aber wie geht das mit dem Mausrad?

Mausrad wird als Tastendruck interpretiert. Müsste 4 und 5 sein, bin mir da aber nicht sicher.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 14, 2005 15:48 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 21, 2003 17:36
Beiträge: 141
Hallo nochmal,
Ich habe jetzt ein neues Projekt angefangen, und dementsprechend noch nicht viel Performanceraubendes eingebaut, also noch läuft die ganze Sache recht schnell. Allerdings ist das SDL_GetTicks dafür ziemlich ungenau, da es zumindest beim timebased movement schon ein Unterschied ist, ob ein Frame 1, 2, 3, 4 oder mehr Millisekunden gebraucht hat. Später fällt das bei ~100 fps natürlich nicht mehr so auf, aber zur Zeit ist es schon ziemlich nervig, wenn das auf einmal doppelt so schnell läuft wie noch vor zwei Sekunden. Kennt jemand vielleicht eine elegantere Lösung als die Framerate zu begrenzen?
Danke :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 14, 2005 16:25 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Schau dir das Spiele-Tutorial von Sascha an.
Dort behandelt er ausführlich Timebasedmovement.
Funktioniert so wie ich es verstanden habe aber nur unter Windows :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 14, 2005 16:30 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 21, 2003 17:36
Beiträge: 141
Ja, das kenn ich schon, da war der Zähler auch genau genug. Aber ich bin ja auch auf SDL umgestiegen wegen der Platformunabhängigkeit :-/ Dafür noch ne Windowsfunktion zu benutzen wär Blödsinn :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 14, 2005 16:34 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Habe gerade mal die Source von SDL heruntergeladen und geschaut:
In der todo steht:
* Use RDTSC for timer resolution on x86 hardware

Müsstest also bis 1.3 warten.

Alternativ habe ich noch den C-Code gefunden:
Code:
  1. void ReadTSCLow( unsigned int& runLow )
  2. {
  3.     __asm cpuid
  4.     __asm rdtsc
  5.     __asm mov runLow,eax
  6. }


Aufruf:
Code:
  1. #define CPU_CLK   700     // CPU-Takt in MHz
  2.  
  3. unsigned int   unTSCStart, unTSCEnd, unTSCDiff;
  4.  
  5. // Start-Wert holen
  6. ReadTSCLow( unTSCStart );
  7.  
  8. // Vorgang durchführen
  9.  
  10. // End-Wert holen
  11. ReadTSCLow( unTSCEnd );
  12.  
  13. // Verstrichene Zeit in us berechen:
  14. unTSCDiff=( unTSCEnd-unTSCStart )/CPU_CLK;
  15.  


Quelle

Also das was später in SDL soll. Wäre nett wenn du die Procedure in Pascal übersetzen könntest und hier postest.
Mit Assembler habe ich keine Erfahrung.

PS:
In der todo steht auch das die Mousewheelteile eigene Events werden sollen ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 14, 2005 16:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Aus der EasySDL Unit von der DGLSDK_Linux:
Code:
  1.  
  2.  TEasySDL  = class
  3.   {...}
  4.   TimeAtLastUpdate: Uint32;
  5.   {...}
  6.    procedure UpdateWorld(Seconds: TGLFloat); virtual;
  7.    {...}
  8. end;
  9.  
  10. procedure TEasySDL.Loop;
  11. var
  12.   TimeNow:Uint32;
  13. begin
  14.   WriteLn('.:. Genesis-Loop .:.');
  15.  
  16.   TimeAtLastUpdate := SDL_GetTicks();
  17.   while ( Done <> -1 ) do
  18.   begin
  19.     handleEvents;
  20.     TimeNow := SDL_GetTicks();
  21.  
  22.     if TimeNow >= TimeAtLastUpdate then
  23.     begin
  24.       UpdateWorld((TimeNow - TimeAtLastUpdate)/1000);
  25.     end
  26.     else
  27.     begin
  28.       // This code will only be only executed after about 32 days runtime
  29.       UpdateWorld(((high(Uint32) - TimeNow) + TimeAtLastUpdate)/1000);
  30.     end;
  31.     TimeAtLastUpdate := TimeNow;
  32.     DrawScene;
  33.     Render;
  34.   end;
  35. end;
  36.  

Wenn man dann EasySDL benutzt braucht man UpdateWorld nur noch überschreiben.

Sample3.pas :
Code:
  1.  
  2. program sample3;
  3. {$MODE DELPHI}
  4.  
  5. uses
  6.   dglOpenGL,
  7.   easySDL,SDL;
  8.  
  9. type
  10.   TMyProgram=class(TEasySDL)
  11.     tx:Single;
  12.     procedure DrawScene;override;
  13.     procedure UpdateWorld(Seconds:TGLFloat); override;
  14.   end;
  15.  
  16. var
  17.   MyProgram :TMyProgram;
  18.  
  19. procedure TMyProgram.UpdateWorld(Seconds:TGLFloat);
  20. begin
  21.   if KeyDown[SDLK_RIGHT] then
  22.     tx := tx + 0.8*Seconds;
  23.  
  24.   if KeyDown[SDLK_LEFT] then
  25.     tx := tx - 0.8*Seconds;
  26.  
  27.   if tx > 1.7 then tx := -1.7
  28.   else
  29.     if tx < -1.7 then tx := 1.7 ;
  30. end;
  31.  
  32. procedure TMyProgram.DrawScene;
  33. begin
  34.   // Screen- und Tiefenbuffer bereinigen
  35.   glClear( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT );
  36.  
  37.   glLoadIdentity;
  38.   glTranslatef(tx,0,-2);
  39.   glBegin(GL_QUADS);
  40.     glColor3f(0,0,1);   glVertex3f(-0.5,-0.5,0.0);
  41.     glColor3f(1,0,0);   glVertex3f( 0.5,-0.5,0.0);
  42.     glColor3f(1,1,0);   glVertex3f( 0.5, 0.5,0.0);
  43.     glColor3f(0,1,0);   glVertex3f(-0.5, 0.5,0.0);
  44.   glEnd();
  45. end;
  46.  
  47. begin
  48.   MyProgram := TMyProgram.Create;
  49.  
  50.   MyProgram.Start;
  51.   MyProgram.Loop;
  52.   MyProgram.Stop;
  53. end.
  54.  


Läuft zumindest unter Linux flüssig, also die angesprochene Ungenauigkeit merkt man nicht.
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: Mi Sep 14, 2005 17:00 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
hab zum rdtsc vor einiger zeit mal ein unit geschrieben. sollte halbwegs verständlich sein, wenn sich jemand dafür interessiert.
ansonsten macht man das hier:
Code:
  1. Code:
  2. void ReadTSCLow( unsigned int& runLow )
  3. {
  4.     __asm cpuid
  5.     __asm rdtsc
  6.     __asm mov runLow,eax
  7. }

imo in pascal am besten so:
Code:
  1. Function  GetHRSCounter  :int64;
  2. asm
  3.   push ebx;
  4.   xor eax, eax;
  5.   cpuid;
  6.   rdtsc;
  7.   pop ebx;
  8. end;


wobei das cpuid nur benötigt wird, um sicherzugehen, dass die vorherlaufenden instructionen abgeschlossen sind. wenns nicht absolut genau sein muss tuts auch das hier:
Code:
  1. Function  GetHRSCounter  :int64;
  2. asm
  3.   rdtsc;
  4. end;


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 15, 2005 12:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Moment:

Zitat:
Die ganzen Delphi-Units sind erstmal von Borland. Von denen gibt es ein paar, die plattformspezifischen Code enthalten. Du merkst das daran, dass du beim Bompilieren unten eine Warnung stehen hast, dass die Unit 'FileCtrl' z.B. nicht Cross-Platform ist.


und solange da keine warnung steht, müsste mein prog auch unter linux laufen??? Ich dachte immer das währe schwieriger. (habe leider kein linux... noch nicht!)

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 15, 2005 12:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
geo hat geschrieben:
Moment:

Zitat:
Die ganzen Delphi-Units sind erstmal von Borland. Von denen gibt es ein paar, die plattformspezifischen Code enthalten. Du merkst das daran, dass du beim Bompilieren unten eine Warnung stehen hast, dass die Unit 'FileCtrl' z.B. nicht Cross-Platform ist.


und solange da keine warnung steht, müsste mein prog auch unter linux laufen??? Ich dachte immer das währe schwieriger. (habe leider kein linux... noch nicht!)

Also Delphi 5 hat mich nie davor gewarnt, warum auch? Die haben ja mit Freepascal und Lazarus nichts am Hut.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 15, 2005 16:22 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Die Platform-Abhängigkeitswarnungen kommen erst seit Delphi 6.

Geo, das bezieht sich ausschließlich auf Units. Wenn du VCL-Komponenten verwendest, die es in CLX nicht gibt, dann hast du ein Problem. Solange du aber nur standard-Komponenten der VCL verwendest oder gleich von Anfang an CLX-Komponenten dürfte das kein Problem sein.

Sprich: Um mit Delphi X-Platform zu schreiben, schreibt man eine CLX-Anwendung und verzichtet auf Windows-spezifische Units wie FileCtrl. Solange in einem CLX-Projekt keine Warnung auftritt, dass es nur unter Windows läuft, kann man es auch unter Kylix compilieren und zum laufen bringen. Cross-Platform ist gar nicht so schwer. Man muss nur auf einige Dinge verzichten.

Theoretisch sollte es auch möglich sein, VCL-Anwendungen zur LCL (Lazarus-Component Library) zu konvertieren. Deren Umfang ist aber AFAIK noch kleiner als der der CLX. ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.010s | 14 Queries | GZIP : On ]