Threading with SDL
Salih Dincer
salihdb at hotmail.com
Tue Nov 19 13:18:28 UTC 2024
On Tuesday, 19 November 2024 at 09:08:46 UTC, Adrian Preuß wrote:
>
> I have the following project structure:
> ```
> - main.d (Booting)
> - client.d
> - Renderer.d
> - Manager
> - SDL2.d
> - GLFW.d
> - RenderingTargets
> - DirectX.d
> - Vulkan.d
> - OpenGL.d
> ```
```d
module game.main;
import core.thread;
import core.sync.semaphore;
import std.stdio;
import std.concurrency;
// Renderer interface
abstract class Renderer {
private bool isRunning = true;
protected Tid mainThreadId;
this(Tid mainThreadId) {
this.mainThreadId = mainThreadId;
}
void initialize() {
// Initialization logic
}
void run() {
while (isRunning) {
// Rendering loop
renderFrame();
}
}
protected void renderFrame() {
// Implement rendering logic
}
void stop() {
isRunning = false;
}
}
// SDL2 Specific Renderer
class SDL2Renderer : Renderer {
this(Tid mainThreadId) {
super(mainThreadId);
}
override void initialize() {
// SDL2 specific initialization
import derelict.sdl2.sdl;
DerelictSDL2.load();
SDL_Init(SDL_INIT_VIDEO);
// Create window, context, etc.
}
override protected void renderFrame() {
import derelict.sdl2.sdl;
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
send(mainThreadId, "renderer_stopped");
stop();
break;
default:
break;
}
}
// Actual rendering logic
// SDL_GL_SwapWindow(), etc.
}
}
// Game Client
class GameClient {
private Renderer renderer;
private Tid rendererThread;
this() {
// Create a thread for rendering
rendererThread = spawn(&rendererLoop, thisTid);
}
private void rendererLoop() {
// Initialize renderer on its own thread
auto sdlRenderer = new SDL2Renderer(thisTid);
sdlRenderer.initialize();
sdlRenderer.run();
}
void run() {
// Main game loop
while (true) {
// Non-blocking game logic
updateGameState();
// Check for renderer messages
receiveTimeout(
dur!"msecs"(10),
(string msg) {
if (msg == "renderer_stopped") {
break;
}
}
);
}
}
private void updateGameState() {
// Game state update logic
// This runs independently of rendering
}
void shutdown() {
// Send stop signal to renderer thread
send(rendererThread, "stop");
}
}
// Main entry point
void main() {
auto game = new GameClient();
game.run();
}
```
SDB at 79
More information about the Digitalmars-d-learn
mailing list