fase 4+5: fibers cooperatius substitueixen el game thread, sense mutex ni cv

This commit is contained in:
2026-04-15 18:50:43 +02:00
parent 801a8ad1bd
commit 1507a1c740
9 changed files with 313 additions and 141 deletions

View File

@@ -3,15 +3,14 @@
#include <SDL3/SDL.h>
#include <atomic>
#include <condition_variable>
#include <cstdint>
#include <mutex>
#include <thread>
// El Director és el thread principal que controla la presentació i els inputs.
// Executa el joc en un thread secundari (game thread) com si fos una "fibra emulada":
// el joc produeix un frame, es bloqueja a JD8_Flip(), i el director el presenta
// abans de donar-li via per produir el següent.
// El codi del joc s'executa dins d'un *fiber* cooperatiu (veure fiber.hpp):
// el joc produeix un frame, crida JD8_Flip() que internament fa yield al
// Director, i el Director el presenta abans de tornar-lo a reprendre amb
// GameFiber::resume(). Tot ocorre en un únic thread — sense mutex, sense
// condition_variable, compatible amb el futur port a SDL_AppIterate.
class Director {
public:
static void init();
@@ -21,10 +20,6 @@ class Director {
// Bucle principal del director. Crida des de main().
void run();
// Invocat pel game thread des de JD8_Flip(). Bloqueja fins que el director
// consumeix el frame i dona via per produir el següent.
void publishFrame(Uint32* pixels);
// Demana l'eixida (ex: segona pulsació d'ESC o SDL_QUIT)
void requestQuit();
@@ -34,7 +29,8 @@ class Director {
// Indica si ESC està bloquejada (el joc no l'ha de veure)
auto isEscBlocked() const -> bool { return esc_blocked_ || esc_swallow_until_release_; }
// Pausa: bloqueja el consum de frames del game thread + pausa la música
// Pausa: mentre està activa, Director no fa resume() del fiber del joc,
// així que el joc queda congelat al seu últim JD8_Flip.
void togglePause();
auto isPaused() const -> bool { return paused_; }
@@ -44,20 +40,9 @@ class Director {
static Director* instance_;
void gameThreadFunc();
void handleEvents();
std::thread game_thread_;
std::mutex mutex_;
std::condition_variable frame_produced_cv_;
std::condition_variable frame_consumed_cv_;
Uint32* latest_frame_{nullptr};
bool frame_ready_{false};
bool frame_consumed_{true};
std::atomic<bool> quit_requested_{false};
std::atomic<bool> game_thread_done_{false};
std::atomic<bool> key_pressed_{false};
std::atomic<bool> esc_blocked_{false};
std::atomic<bool> paused_{false};