Threading mit C++
-
Kann mir jemand ein paar Links zu guten Dokus posten, in denen threading etwas beschrieben wird. Ich find einfach nichts gescheites.
Ich hoffe das bei c++ mit der SDL Lib threading möglich ist ?
Danke
Tom
-
Nö, isses nicht, ist Betriebssystemabhängig. Welches OS verwendest du?
Ach ja: sie heisst STL
-
Ich mein die SDL Grafik Library, den Simple direct Media Layer.
Ich verwende Windows als OS.
-
Oh, die kenn ich garnicht, sorry
Verwendest du die MFC? Die VCL? Oder die reine WinAPI?
-
Ich hoffe das bei c++ mit der SDL Lib threading möglich ist ?
Standard-C++ kennt keine Threads, aber die SDL hat doch eine schöne HP: http://www.libsdl.org/index.php
Wenn's möglichst portabel sein soll, schau dir mal boost::thread an:
http://www.boost.org/libs/thread/doc/index.htmlWenn du mehr brauchst, gibt's ja auch noch die pthreads-Lib. Da gibt's auch ein gutes Buch von Bradford Nichols mit dem Titel "Pthreads Programming. A POSIX Standard for Better Multiprocessing." zu.
Auch die ACE-Bibliothek bietet portable Threds-Klassen:
http://www.cs.wustl.edu/~schmidt/ACE.html
-
Das dürfte die ganz normale WinApi sein.
Ich beschreib mal mein Problemchen. Mit dieser Lib kann man einfach Grafiksachen programmieren. jetzt hab ich mal zur Einführung begonnen ein Spiel zu schreiben (PONG). Das dumme is, das man gleichzeitig die Steuerung der Paddles und die Steuerung des Balles abfragen muss. Dadurch wird dann die Steuerung ziemlich träge, bzw der Ball wird langsamer wenn ein Spieler sein Paddle steuert. Ich dachte das man dabei mit Multithreading weiterkommen könnte.
Bis jetzt fang ich alles in der Ereignisschleife ab, aber eben schön nacheinander. Das bremst eben.
-
was??? Da ist Multithreading eher ein Hindernis.
Wie machst du denn die Abfrage der Tastatur? Zeig mal etwas Code.
-
Hm,
ich denke die Frage ist im Spiele-/Grafikforum besser aufgehoben.
-
Ich schreib so ungefähr so
while(!done) { while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: done = true; break; } } key = SDL_KEY(NULL) //WEI? den genauen Befhelgrad nicht aber ihr wisst sicher // Was ich meine ! if (key = SDL_KEY[UP]) movepaddleup(); // Paddle bewegen if (key = SDL_KEY[DOWN]) movepaddledown(); moveball(); // Hier wird der Ball bewegt }
Die Befehle sind jetzt nicht 100 % korrekt, hab das listing grad nicht hier. Aber die Abfrage und das bewegen mach ich genau hier in dieser schleife.
Das Problem ist jetzt wenn ich einen Knopf drücke, verzweigt das programm ins Paddlemove unterprogramm bewegt das Paddle und springt zurück. Während dieser Zeit läuft der Ball langsamer.
-
Warum reicht dir SDL_Thread nicht? Ist doch dabei und portabel
-
Seid ihr sicher das er einen Extra-Thread dafür brauch
-
Nein - ein extra Thread währe Overhead. Besonders für solche Kleinigkeiten.
Und die 2 Abfragen, die du jetzt hast - sind echt ein Kinkerlitzchen, zur Physik, KI usw.
Hab ja nur gefragt, ob SDL_Thread nicht reicht.
-
Is ja schön das dass ein Kinkerlitzchen ist aber leider bremsen die anderen Sprites ab, sobald man eine Navigationstaste drückt und das sollte nicht sein. Ich hab einen 2,5 GHZ Prozessor also dürfts an dem ja wohl nicht liegen.
Wie fragt ihr den die Steuerung ab, bei euren Games ?
-
while(SDL_PollEvent(&event))
hier wartest du auf ein ereigniss, das macht die ganze sache langsamer. oder nicht ?
ich mache es so
ich warte nicht auf ein ereigniss sondern hole nur das letzte ab, ist vielleicht auch nicht die beste lösung.while(!m_bDone) { //// INPUT //// if(m_pInput->Update()) { if(m_pInput->GetKeyDown(SDLK_ESCAPE)) m_bDone = true; if(m_pInput->GetKeyDown(SDLK_F12)) Screenshot(); if(m_pInput->GetKeyDown(SDLK_TAB)) m_pConsole->m_bActive = !m_pConsole->IsActive(); } // RENDERN } SDL_GL_SwapBuffers(); } /////////////////////////////////////// bool Input::Update() { bool bEvent = true; SDL_Event event; SDL_PollEvent(&event); switch(event.type) { case SDL_KEYDOWN: m_keys[event.key.keysym.sym] = true; break; case SDL_KEYUP: m_keys[event.key.keysym.sym] = false; break; case SDL_MOUSEMOTION: m_MouseX = event.motion.x; m_MouseY = event.motion.y; break; default: bEvent = false; break; } return bEvent; }
-
Ich werds mal ausprobieren, danke für den tipp.
-
if (key = SDL_KEY[UP])
movepaddleup(); // Paddle bewegenif (key = SDL_KEY[DOWN])
movepaddledown();moveball(); // Hier wird der Ball bewegt
Du solltest hier statt dem zweiten "if" ein "else if" oder gleich ne switch anweisung machen. Das macht den Code auch etwas schneller.
i.d.S