JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=7bd52d702ab6951d1d94e8ecdde12e03Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

MultiThreading in Spielen
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 30.06.2006, 21:06    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
Wo ich das allerdings evbtl. irgendwann mal benutzen würde, wäre um im Hintergrund das nächste Level zu laden, so wie es in Morrowind (AFAIK) passiert.


Knapp daneben ist auch vorbei, Wink
in Morrowind gab's noch Ladebildschirme und in Oblivion wird es dann im Hintergrund geladen.
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 30.06.2006, 21:27    Titel: Antworten mit Zitat

Oblivion ist der Nebenname, Morrowind der Hauptname Wink Jonathan hat schon recht, auch wenn er es nicht eindeutig sagte.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 30.06.2006, 21:32    Titel: Antworten mit Zitat

hm, heißt die Reihe nicht "The Elders Scrolls" oder so?
Ist ja auch egal, ich hatte die Illusion irgendwo gehört zu haben, der würde in nem seperaten Thread laden, aber wenn man zu schnell ist muss der halt doch manchmal Pause mache, also Ladebildschirm anzeigen.
Keine Ahnung, ist ja auch egal, auf jeden Fall scheint das eine elegante Lösung zu sein. Achja, Dungeon Siege benutzt das dann doch garantiert auch, die haben doch früher damit Werbung gemacht, dass man durch das ganze Spiel laufen kann, ohne einen einzigen Ladebildschirm zu sehen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 30.06.2006, 21:37    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
Ist ja auch egal, ich hatte die Illusion irgendwo gehört zu haben, der würde in nem seperaten Thread laden, aber wenn man zu schnell ist muss der halt doch manchmal Pause mache, also Ladebildschirm anzeigen.


mmh ... das kann auch sein
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 30.06.2006, 21:45    Titel: Antworten mit Zitat

Das Konzept dahinter kann ja auch eigentlich gar nicht so komplex sein.

zB denkt man sich die Welt besteht aus Quadranten (oder Kuben) am Anfang werden einfach alle 8 Quadranten um den Spielerquadrant herum geladen, bewegt sich der Spieler auf einen anderen Quadranten so wird im Hintergrund begonnen die neuen Angrenzenden Quadranten zu laden (max 5).

Solange das im Hintergrund geschieht und keine Teleports stattfinedn (min 2 Quadranten) so entsteht der Eindruck alles besteht aus einen Guss.

Sowas merkt man evtl recht gut an Gothic (2) benutzt man zB einen der teleportersteine später im Spiel wird die Welt um den neuen Spielerpunkt herum langsam wieder aufgebaut, man kann förmlich dabei zusehen wie die Texturen zugewiesen werden, nach dem "Ladeprozess" fängt das Spiel erst wieder an flüssig zu laufen.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 30.06.2006, 21:51    Titel: Antworten mit Zitat

FarCry ist afaik auch ein schönes Beispiel für Multithreading, in dem Game muss der Performancezuwachs auf entsprechenden CPUs sogar richtig merklich gewesen sein.

Fallen:
Jupp, sowas Ähnliches habe ich mir auch mal überlegt. Man "tilet" quasi die die Tilemap nocheinmal.

Btw.: Multithreading soll soweit ich weiß fest mit in den Standard aufgenommen werden, es ist also damit zurechnen, dass sich da in Zukunft noch viel tun wird, bzw. die Nutzung einfacher wird.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 30.06.2006, 21:58    Titel: Antworten mit Zitat

War FarCry nicht das Paradebeispiel für 64Bit? In der die GrafikkartenHersteller sowie die ProzessorHersteller gemeinsam den Code optimierten mit Crytek?

Was ist denn an Threads erstellen bisher so schwer?

Erstellen, ausführen, evtl "locken" und am ende beenden.

Fand das bisher schön simpel und vor allem funktionierend, oder hast du da etwas anderes im Sinn?
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 30.06.2006, 22:35    Titel: Antworten mit Zitat

Ja, aber wenn du bisher auf externe Libs verzichten willst, die dir das Leben in der Hinsicht vereinfachen, dann bist du gezwungen direkt auf der jeweiligen Plattform-API zu arbeiten, was natürlich besonders unschön ist, wenn du nach Möglichkeit portabel bleiben und auf plattformspezifische Libs wie die WinAPI verzichten willst und nicht gerade Lust hast, dir den ganzen Mist für jede Plattform zu wrappen. Noch dazu würde das vielleicht helfen, dem (ungerechtfertigt) "schlechten Ruf" (z.B. schwierig in der Nutzung, unsicher, blabla...) entgegen zu wirken und Threads endlich "massentauglich" zu bekommen. Von daher, und weil es so wie ich es aufgefasst habe, keine direkte Sprachneuerung sein wird, stehe ich dem Ganzen optimistisch gegenüber.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 30.06.2006, 22:51    Titel: Antworten mit Zitat

Threads sind nciht schwer, nur richtig und effektiv damit umzugehen um so mehr. Ich hab auch mal eine Thread-Klasse geschrieben. Ist nie richtig fertig geworden, weil ich die doch nicht gebrauch hatte.

CPP:
#include <windows.h>


class Thread
{
public:
   Thread();
   ~Thread();

   bool start();
   virtual int run();

private:
   HANDLE hThread;
};


CPP:
#include "thread.h"

DWORD WINAPI ThreadProc(LPVOID lpParam)
{
   Thread* thread = reinterpret_cast<Thread*>(lpParam);
   return thread->run();
}

Thread::Thread() : hThread(NULL)
{
}

Thread::~Thread()
{
   CloseHandle(hThread);
}

bool Thread::start()
{
   DWORD threadid;

   //Wenn bereits eine Instanz existieren, dann false zurückgeben
   if(hThread)
      return false;

   //Den Thread starten
   hThread = CreateThread(NULL, 0, ThreadProc, this, 0, &threadid);
   return hThread != NULL;
}

int Thread::run()
{
   return 0;
}

_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 01.07.2006, 09:38    Titel: Antworten mit Zitat

Threading kann eine verdammt nützliche Sache sein. Jedoch sollte man bedenken dass es extrem schwierig Multi Threading Anwendungen zu schreiben. Wenn man nicht speziell synchronisiert muss man davon ausgehen dass zwischen jeder Codezeile ein andere Thread Variablen ändern könnte, das macht das ganze extrem Fehleranfällig, und man muss sehr vorsichtig sein.

Zumal Fehler die auf Threading zurückzuführen sind sehr schwer zu finden sind, da sie meist nicht direkt reproduzierbar sind, sondern teilweise mehr oder weniger zufällig passieren.

Auch wenn es schwierig ist, es lohnt sich damit zu beschäftigen. Ich habe Boost.Threads bisher noch nicht ausprobiert (da ich die eingebauten Threading Funktionen der Torque Engine verwende) aber ich habe bisher nur gutes davon gehört:
http://www.boost.org/doc/html/threads.html
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 24.10.2006, 12:16    Titel: Antworten mit Zitat

Frage: Dragon hat eine "komplette" Thread-Klasse gepostet. Kann man die schon verwenden ? Und wo muss der Code rein der dann gleichzeitig mit dem Rest ausgeführt wird?

Ich möcht das auch mal ausprobieren, hab allerdings noch keine richtige Erfahrung mit Multy-Threading gemacht, nur ein bisschen mit Java, is aber schon lange her und wahrscheinlich komplett anders.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 24.10.2006, 15:27    Titel: Antworten mit Zitat

Otscho hat Folgendes geschrieben:
Und wo muss der Code rein der dann gleichzeitig mit dem Rest ausgeführt wird?


Du musst eine Subklasse mit Thread als Basisklasse erstellen.
In der Subklasse musst du dan die run methode überschreiben.
Der Code in der run methode ist der code der vom thread dann ausgeführt wird.

CPP:
class MeinThread : public Thread
{
    virtual int run(){ code; }
}


Ein paar Dinge könnte man in der Thread Klasse vielleicht noch verschönern:
- run methode abstrakt machen
- anstelle von einem rückgabewert bei der start-methode lieber exceptions oder asserts benutzen, denn rückgabewerte werden normalerweise vom benutzer ignoriert.
- run methode eventuell protected machen
_________________
Kochen ist ein NP-schweres Optimierungsproblem.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 24.10.2006, 17:31    Titel: Antworten mit Zitat

Danke für die Tipps. Weil ich totaler Anfänger bin hab ich da nur noch ne Frage.

In der main.cpp
Code:
Thread newThread();

if(newThread.start()) newThread.run();
do();


Würde dieser Code-Ausschnitt funktionieren ?
Wenn nein, wie müsste er dann eingebaut werden ?
Wenn ja, könnte das was in der run()-Funktion steht gleichzeitig mit der do()-Funktion ausgeführt werden?


Zuletzt bearbeitet von Otscho am 26.10.2006, 13:08, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 24.10.2006, 18:22    Titel: Antworten mit Zitat

Probier es einfach aus Wink

Wenn mich nicht alles täuscht, dann müsste der code aber funktionieren.
Und ja, do (und alles andere danach auch) und newThread.run werden dann "gleichzeitig" ausgeführt.


Hier noch drei links:
http://www.codeworx.org/cpp_tuts_1_5.php
http://www.codeproject.com/threads/SynchronizedThreadNoMfc.asp
http://www.flipcode.com/articles/article_multithreading.shtml
_________________
Kochen ist ein NP-schweres Optimierungsproblem.


Zuletzt bearbeitet von Kampfhund am 24.10.2006, 18:24, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 24.10.2006, 18:22    Titel: Antworten mit Zitat

Wenn du noch die Klammern dazu nimmst sollte es gehen

CPP:
Thread newThread();
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum