Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

  • »Sebastian Müller« ist der Autor dieses Themas

Beiträge: 369

Wohnort: Freilingen [Rheinland-Pfalz]

Beruf: Schüler

  • Private Nachricht senden

1

30.11.2013, 12:01

Problem mit Threads / Ein Paar Fragen an Fortgeschrittene Entwickler

Liebe Leser


Ich entwickle grade meinen ersten open World Shouter. Leider konnte ich Terrain-rendering nicht anwenden, weil die Octree/Quattree Techniken "böhmische Dörfer" für mich sind. Ich suche im Internet nach weiterführenden Berichten. Aus diesem Grund musste ich die Landschaft in AC3D modellieren. Die Spielwelt ist grafisch sehr aufwendig gestaltet. Es gibt komplexe Bäume, eine sehr gutes selbst entwickeltes Vegetationssystem (für 3D Grass). Ebenso kommt einer sehr gutes auf Pixel basierendes HLSL Beleuchtungssystem. Bei der Vegetation werden per Zufall Positionen für den Sprite gesucht.Der Sprite wird dann auf das Landschaftsmodell gelegt. Jeder Sprite stellt eine Ansammlung von Grass da. Das Generieren der Vegetation dauert ziemlich lange, weil dieser Vorgang ca 300.000 mal durchlaufen werden müssen. Meine Idee war, dass man das Landschaftsmodell lädt und dann direkt ins Spiel steigt. Während der Spieler herum laufen kann wird im zweiten Thread die Vegetation weiter initialisiert. Es gibt aber Probleme bei der Funktion CreateThread.


Hier ein Abbild von Create Thread. Die Thread-Funktion befindet sich nicht in derselben Datei. sondern ein paar Klassen weiter.


C-/C++-Quelltext

1
2
3
4
5
HANDLE H_Thread1 ,H_Thread2; 
DWORD Dw_Thread1, Dw_Therad2; 


H_Thread1 = CreateThread( NULL, 0, mp_Game->mp_Part1->RenderThread(), NULL, 0, &Dw_Thread1)





Es kommt der Fehler

Das Argument vom Typ ""DWORD"" ist mit dem Parameter vom Typ ""LPTHREAD_START_ROUTINE""


ZU MEINER FRAGE


Wie kann man es erreichen (mit ein paar Tipps), dass das Spiel weniger Power frisst, denn mein Spiel verbraucht vergleichbar viel wie Crytek's Crysis 3.


Muss man die Shader-Daten (Matrizen/ Beleuchtungswerte) wirklich in jedem Frame schicken oder reicht es sie einmal zu schicken?




Vielen Dank im Voraus

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sebastian Müller« (30.11.2013, 13:15)


2

30.11.2013, 12:09

Da kriegt man ja Kopfschmerzen beim Lesen.
Kannst du den Post bezüglich Rechtschreibung und Groß-/Kleinschreibung mal etwas bereinigen?
fka tm

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

30.11.2013, 12:28

Um mal etwas zum Inhalt zu sagen:
CreateThread erwartet eine Funktions-Adresse als Parameter. mp_Game->mp_Part1->RenderThread() ist allerdings erstens keine Funktion, sondern eine Methode. Zweitens ist das ein Aufruf, der scheinbar wohl ein DWORD zurückliefert und keine Funktions-Adresse. Das wird so also nicht funktionieren.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

  • »Sebastian Müller« ist der Autor dieses Themas

Beiträge: 369

Wohnort: Freilingen [Rheinland-Pfalz]

Beruf: Schüler

  • Private Nachricht senden

4

30.11.2013, 14:18

Also einfach eine gewöhnliche Funktion mit "DWORD WINAPI" schreiben, die dann Render aufruft.

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

Ich hoffe ich konnte deine Kopfschmerzen lindern

Ich war etwas aufgeregt als ich den Text verfasste, weil einfach nichts funktionierte.

Ansonsten hilft eine Aspirin :D

Ich werde es nun erneut versuchen.

Danke für eure Hilfe.

Wenn es nicht klappt, melde ich mich hier wieder.

  • »Sebastian Müller« ist der Autor dieses Themas

Beiträge: 369

Wohnort: Freilingen [Rheinland-Pfalz]

Beruf: Schüler

  • Private Nachricht senden

5

30.11.2013, 18:07

Ich experimentiere grade in einem kleinem Konsolenprogramm mit Threads.

Im Buch steht wenn der letzte Befehl der Thread-Funktion ausgeführt wurde wird der Thread beendet.

Jedoch wiederholt sich bei mir jedes mal die Funktion wieder. Wie die Render und Move in 3D Spielen.

Ist das Normal?

Liebe Grüße -> Sebastian

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

30.11.2013, 22:19

Dann erstellst Du entweder ständig neue Threads oder rufst rekursiv die Methode aus dem Thread heraus wieder auf. Ansonsten beendet sich ein Thread mit dem Beenden der verknüpften Funktion.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (30.11.2013, 22:36)


  • »Sebastian Müller« ist der Autor dieses Themas

Beiträge: 369

Wohnort: Freilingen [Rheinland-Pfalz]

Beruf: Schüler

  • Private Nachricht senden

7

30.11.2013, 22:30

Es war mein Fehler. Ich habe die While Schleife nicht beachtet.
Im Konsolen-programm werden beide Funktionen gleizeitig ausgeführt. Im spiel auch, jedoch bekomme ich nur Nullpointer. An
denn verschiedensten Stellen

Ich werde weiter dran arbeiten.

Vielen Dank.

8

01.12.2013, 13:25

Wenn du C++ benutzt und einen halbwegs aktuellen Compiler hast, solltest du dir das hier mal ansehen:

http://en.cppreference.com/w/cpp/thread

Allgemein dürfte es zum Thema 'C++11 Threads' ganz gute Artikel und Tutorials geben. Der Vorteil wäre halt, dass sie moderner und damit hübscher zu benutzen sind (und nicht nur unter Windows funktionieren, für die Zukunft und so).

Zitat


Wie kann man es erreichen (mit ein paar Tipps), dass das Spiel weniger Power frisst, denn mein Spiel verbraucht vergleichbar viel wie Crytek's Crysis 3.

Indem man ein Genie ist und absolut Ahnung von der Materie hat. 3D Engines sind ein kompliziertes Thema und man muss derartig viel tricksen, dass es keinen 5-Punkte Plan gibt, wie ein Spiel schneller wird.
Und denk immer daran: In der Computergrafik kommt es darauf an, zu schummeln, ohne dass es jemand merkt. Viele Dinge die beeindruckend aussehen, sind in Wirklichkeit ziemlich billig umgesetzt, aber eben mit sehr gut abgestimmten Parametern/Modellen/Texturen.
Lieber dumm fragen, als dumm bleiben!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

01.12.2013, 13:27

Mach dich auf jeden Fall mit Thread-Synchronisierung vertraut, sonst wirst du nicht weit kommen.
Am besten mal nach "C++11 Thread Synchronization" googlen.

  • »Sebastian Müller« ist der Autor dieses Themas

Beiträge: 369

Wohnort: Freilingen [Rheinland-Pfalz]

Beruf: Schüler

  • Private Nachricht senden

10

03.12.2013, 21:44

Ok. Danke für die Tipps. Ich werde es weiter versuchen.
Ich werden mir das Kapitel (Synchronisation). Speziell
die Parts "Kritische Section" und die anderen Dinge.

Ich werde mich wieder melden.

Danke für die Tipps.

Werbeanzeige