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,7 +3,7 @@
#include <fstream>
#include "core/jail/jfile.hpp"
#include "core/system/director.hpp"
#include "core/system/fiber.hpp"
#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-but-set-variable"
@@ -165,7 +165,14 @@ void JD8_Flip() {
pixel_data[x + (y * 320)] = color;
}
}
Director::get()->publishFrame(pixel_data);
// Cedeix el control al Director. Quan Director::run() ens torne a fer
// resume(), continuarem just ací i el joc continuarà amb la següent
// iteració del seu loop sense bloquejos de mutex/cv.
GameFiber::yield();
}
Uint32* JD8_GetFramebuffer() {
return pixel_data;
}
void JD8_FreeSurface(JD8_Surface surface) {

View File

@@ -40,8 +40,16 @@ void JD8_BlitCKScroll(int y, JD8_Surface surface, int sx, int sy, int sh, Uint8
void JD8_BlitCKToSurface(int x, int y, JD8_Surface surface, int sx, int sy, int sw, int sh, JD8_Surface dest, Uint8 colorkey);
// Converteix la pantalla indexada a ARGB i cedeix el control al Director
// (GameFiber::yield). El Director llegirà el framebuffer convertit via
// JD8_GetFramebuffer() i tornarà a cridar Fiber::resume() quan toque el
// pròxim frame.
void JD8_Flip();
// Accés al framebuffer ARGB de 320x200 actualitzat per l'última crida a
// JD8_Flip(). Propietat de jdraw8 — el caller no ha de lliberar-lo.
Uint32* JD8_GetFramebuffer();
void JD8_FreeSurface(JD8_Surface surface);
Uint8 JD8_GetPixel(JD8_Surface surface, int x, int y);

View File

@@ -1,5 +1,7 @@
#include "core/jail/jgame.hpp"
#include "core/system/fiber.hpp"
namespace {
bool quitting = false;
@@ -39,6 +41,12 @@ bool JG_ShouldUpdate() {
cycle_counter++;
return true;
}
// Encara no toca update: cedim el control al Director per a que puga
// processar events, animar l'overlay i mantindre l'àudio viu. Sense
// aquest yield, els spin-waits típics de les cinemàtiques
// (`while (!JG_ShouldUpdate()) { JI_Update(); ... }`) congelarien
// tot el main loop — el fiber no cediria mai.
GameFiber::yield();
return false;
}