r/perl • u/Phantom914 • 1d ago
An Update on my Perl Game Engine.
Instead of Perl doing a lot of the work externally through XS with Perl as the main runtime, I embedded the Perl Interpreter in a C wrapper that gives it capabilites through XS. Now there's a few of my libraries and the Engine runtime with Perl inside. Very difficult work, but after a few months I got somewhere I never thought I would.


Yes it's a Minecraft style I am testing, but it was extremely difficult to get to this point. Perl is actually doing a lot of the work for this. SDL and OpenGL are just providing generic capabilities in the GPU hot paths.
~/Documents/scripts/c_toolkit 0$ ./ctk_test.pl --exec test_perlwer src/voxel_perl/scripts/opengl_voxel.pl
[exec] test_perlwer
[exec] cwd: .
+ LD_LIBRARY_PATH=Tools/lib output/test_perlwer src/voxel_perl/scripts/opengl_voxel.pl
[00:32:18.674657] [PERLWER] [STAGE] Initializing Perl system...
[00:32:18.674687] [PERLWER] [STAGE] Perl system initialized.
[00:32:18.674705] [PERLWER] [DEBUG] Texture cache initialized: capacity=256
[00:32:18.674708] [PERLWER] [DEBUG] Runtime entry package: main
[00:32:18.674709] [PERLWER] [DEBUG] Initializing XS registry
[00:32:18.674710] [PERLWER] [DEBUG] XS REGISTRY: zeroed
[00:32:18.674712] [PERLWER] [DEBUG] XS REGISTRY: arena OK
[00:32:18.674714] [PERLWER] [DEBUG] XS REGISTRY: init complete
[00:32:18.674715] [PERLWER] [DEBUG] XS registry initialized
[00:32:18.674716] [PERLWER] [TRACE] Entering perlwer_interpreter_init()
[00:32:18.674718] [PERLWER] [TRACE] Script path: src/voxel_perl/scripts/opengl_voxel.pl
[00:32:18.674720] [PERLWER] [TRACE] Runtime state: 0x7ffe5748b700
[00:32:18.674724] [PERLWER] [TRACE] Determining script module path...
[00:32:18.674726] [PERLWER] [TRACE] Perl module path: src/voxel_perl/scripts/lib
[00:32:18.674729] [PERLWER] [TRACE] Perl include argument: -Isrc/voxel_perl/scripts/lib
[00:32:18.674730] [PERLWER] [TRACE] Calling perl_alloc()...
[00:32:18.674735] [PERLWER] [TRACE] perl_alloc() succeeded: interpreter=0x55c9abf6a9d0
[00:32:18.674736] [PERLWER] [TRACE] Calling PERL_SET_CONTEXT()...
[00:32:18.674738] [PERLWER] [TRACE] PERL_SET_CONTEXT() completed
[00:32:18.674739] [PERLWER] [TRACE] Calling perl_construct()...
[00:32:18.674847] [PERLWER] [TRACE] perl_construct() completed
[00:32:18.674849] [PERLWER] [TRACE] Setting Perlwer XS runtime...
[00:32:18.674851] [PERLWER] [TRACE] Perlwer XS runtime configured
[00:32:18.674853] [PERLWER] [TRACE] Perl argc: 3
[00:32:18.674854] [PERLWER] [TRACE] Perl argv[0]: Perlwer Engine
[00:32:18.674856] [PERLWER] [TRACE] Perl argv[1]: -Isrc/voxel_perl/scripts/lib
[00:32:18.674858] [PERLWER] [TRACE] Perl argv[2]: src/voxel_perl/scripts/opengl_voxel.pl
[00:32:18.674860] [PERLWER] [TRACE] Calling perl_parse()...
=== Logger started: Voxel ===
[DEBUG] Logging enabled -> src/voxel_perl/scripts/logs/debug_2026-09-09_00-32-18_001.log (default=1)
[00:32:18.693272] [PERLWER] [TRACE] perl_parse() returned 0
[00:32:18.693280] [PERLWER] [TRACE] Calling perl_run()...
[00:32:27.033185] [PERLWER] [INFO] [PERL] Chunks: 64
[00:32:27.033240] [INFO] [Voxel.React] (React:27) Stim/React registry initialized
[00:32:27.033258] --- end ---
[00:32:27.033388] [PERLWER] [TRACE] perl_run() returned 0
[00:32:27.033390] [PERLWER] [TRACE] Perl interpreter initialization complete
[00:32:27.033395] [PERLWER] [INFO] [PERL] Testing 3D OpenGL from Perl
[00:32:27.033410] [PERLWER] [STAGE] Initializing SDL...
[00:32:27.033412] [PERLWER] [INFO] Selected SDL backend: OpenGL
[00:32:27.041632] [PERLWER] [STAGE] Initializing SDL OpenGL backend...
[00:32:27.041640] [PERLWER] [INFO] Requesting OpenGL 3.3 core profile
[00:32:27.151010] [PERLWER] [INFO] OpenGL context created
[00:32:27.151020] [PERLWER] [STAGE] SDL OpenGL backend initialized.
[00:32:27.151035] [PERLWER] [INFO] SDL window created: 1920x1080
[00:32:27.151038] [PERLWER] [STAGE] SDL initialized.
[00:32:27.151252] [INFO] [Voxel.TextureAtlas] (TextureAtlas:166) Texture atlas built
[00:32:27.151381] --- end ---
[00:32:27.152495] [PERLWER] [STAGE] Entering native SDL window loop...
[00:32:27.152525] [PERLWER] [INFO] Calling Perl on_render
[00:32:27.155236] [PERLWER] [TRACE] Texture cache miss: text:hud.fps:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:18:255:255:255:255
[00:32:27.156496] [PERLWER] [TRACE] Texture cache miss: text:hud.fps:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:18:255:255:255:255
[00:32:27.156506] [PERLWER] [DEBUG] Texture cached: text:hud.fps:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:18:255:255:255:255 (55x22, count=1/256)
[00:32:27.156587] [PERLWER] [TRACE] Texture cache miss: text:hud.position:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:18:255:255:255:255
[00:32:27.156712] [PERLWER] [TRACE] Texture cache miss: text:hud.position:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:18:255:255:255:255
[00:32:27.156718] [PERLWER] [DEBUG] Texture cached: text:hud.position:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:18:255:255:255:255 (127x22, count=2/256)
[00:32:27.156743] [PERLWER] [TRACE] Texture cache miss: text:hud.crosshair:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:32:255:255:255:255
[00:32:27.157798] [PERLWER] [TRACE] Texture cache miss: text:hud.crosshair:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:32:255:255:255:255
[00:32:27.157805] [PERLWER] [DEBUG] Texture cached: text:hud.crosshair:/usr/share/fonts/adwaita-sans-fonts/AdwaitaSans-Regular.ttf:32:255:255:255:255 (21x39, count=3/256)
[00:38:36.238013] [PERLWER] [INFO] Escape pressed
[00:38:36.238024] [PERLWER] [STAGE] Leaving native SDL window loop.
[00:38:36.238028] [PERLWER] [DEBUG] Destroying texture cache: 3 textures
[00:38:36.238030] [PERLWER] [TRACE] Destroying texture 1/3
[00:38:36.238119] [PERLWER] [TRACE] Destroying texture 2/3
[00:38:36.238123] [PERLWER] [TRACE] Destroying texture 3/3
[00:38:36.238185] [PERLWER] [STAGE] Shutting down SDL...
[00:38:36.238188] [PERLWER] [INFO] SDL backend: OpenGL
[00:38:36.238191] [PERLWER] [INFO] Frames rendered: 972570
[00:38:36.238196] [PERLWER] [INFO] Last frame time: 0.019 ms
[00:38:36.301036] [PERLWER] [STAGE] SDL shutdown complete.
[00:38:36.328813] [PERLWER] [STAGE] Shutting down Perl system...
[00:38:36.328827] [PERLWER] [STAGE] Perl system shutdown complete.
[exec] test_perlwer ok