refactor: drop remaining Box::leak & statics where possible

This commit is contained in:
Ryan Walters
2025-09-02 13:44:40 -05:00
parent f2fc60b250
commit 7dfab26898
4 changed files with 19 additions and 31 deletions

View File

@@ -42,9 +42,9 @@ num-width = "0.1.0"
pretty_assertions = "1.4.1" pretty_assertions = "1.4.1"
[build-dependencies] [build-dependencies]
phf = { version = "0.13.1", features = ["macros"] }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0.143" serde_json = "1.0.143"
phf = { version = "0.13.1", features = ["macros"] }
# phf generates runtime code which machete will not detect # phf generates runtime code which machete will not detect
[package.metadata.cargo-machete] [package.metadata.cargo-machete]

View File

@@ -1,10 +1,5 @@
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
use sdl2::render::TextureCreator;
use sdl2::ttf::Sdl2TtfContext;
use sdl2::video::WindowContext;
use sdl2::{AudioSubsystem, EventPump, Sdl, VideoSubsystem};
use crate::error::{GameError, GameResult}; use crate::error::{GameError, GameResult};
use crate::constants::{CANVAS_SIZE, LOOP_TIME, SCALE}; use crate::constants::{CANVAS_SIZE, LOOP_TIME, SCALE};
@@ -34,15 +29,11 @@ impl App {
/// Returns `GameError::Sdl` if any SDL initialization step fails, or propagates /// Returns `GameError::Sdl` if any SDL initialization step fails, or propagates
/// errors from `Game::new()` during game state setup. /// errors from `Game::new()` during game state setup.
pub fn new() -> GameResult<Self> { pub fn new() -> GameResult<Self> {
let sdl_context: &'static Sdl = Box::leak(Box::new(sdl2::init().map_err(|e| GameError::Sdl(e.to_string()))?)); let sdl_context = sdl2::init().map_err(|e| GameError::Sdl(e.to_string()))?;
let video_subsystem: &'static VideoSubsystem = let video_subsystem = sdl_context.video().map_err(|e| GameError::Sdl(e.to_string()))?;
Box::leak(Box::new(sdl_context.video().map_err(|e| GameError::Sdl(e.to_string()))?)); let _audio_subsystem = sdl_context.audio().map_err(|e| GameError::Sdl(e.to_string()))?;
let _audio_subsystem: &'static AudioSubsystem = let _ttf_context = sdl2::ttf::init().map_err(|e| GameError::Sdl(e.to_string()))?;
Box::leak(Box::new(sdl_context.audio().map_err(|e| GameError::Sdl(e.to_string()))?)); let event_pump = sdl_context.event_pump().map_err(|e| GameError::Sdl(e.to_string()))?;
let _ttf_context: &'static Sdl2TtfContext =
Box::leak(Box::new(sdl2::ttf::init().map_err(|e| GameError::Sdl(e.to_string()))?));
let event_pump: &'static mut EventPump =
Box::leak(Box::new(sdl_context.event_pump().map_err(|e| GameError::Sdl(e.to_string()))?));
let window = video_subsystem let window = video_subsystem
.window( .window(
@@ -55,19 +46,17 @@ impl App {
.build() .build()
.map_err(|e| GameError::Sdl(e.to_string()))?; .map_err(|e| GameError::Sdl(e.to_string()))?;
let canvas = Box::leak(Box::new( let mut canvas = window
window .into_canvas()
.into_canvas() .accelerated()
.accelerated() .build()
.build() .map_err(|e| GameError::Sdl(e.to_string()))?;
.map_err(|e| GameError::Sdl(e.to_string()))?,
));
canvas canvas
.set_logical_size(CANVAS_SIZE.x, CANVAS_SIZE.y) .set_logical_size(CANVAS_SIZE.x, CANVAS_SIZE.y)
.map_err(|e| GameError::Sdl(e.to_string()))?; .map_err(|e| GameError::Sdl(e.to_string()))?;
let texture_creator: &'static mut TextureCreator<WindowContext> = Box::leak(Box::new(canvas.texture_creator())); let texture_creator = canvas.texture_creator();
let game = Game::new(canvas, texture_creator, event_pump)?; let game = Game::new(canvas, texture_creator, event_pump)?;
// game.audio.set_mute(cfg!(debug_assertions)); // game.audio.set_mute(cfg!(debug_assertions));

View File

@@ -81,9 +81,9 @@ impl Game {
/// Returns `GameError` for SDL2 failures, asset loading problems, atlas parsing /// Returns `GameError` for SDL2 failures, asset loading problems, atlas parsing
/// errors, or entity initialization issues. /// errors, or entity initialization issues.
pub fn new( pub fn new(
canvas: &'static mut Canvas<Window>, mut canvas: Canvas<Window>,
texture_creator: &'static mut TextureCreator<WindowContext>, texture_creator: TextureCreator<WindowContext>,
event_pump: &'static mut EventPump, event_pump: EventPump,
) -> GameResult<Game> { ) -> GameResult<Game> {
let ttf_context = Box::leak(Box::new(sdl2::ttf::init().map_err(|e| GameError::Sdl(e.to_string()))?)); let ttf_context = Box::leak(Box::new(sdl2::ttf::init().map_err(|e| GameError::Sdl(e.to_string()))?));
let mut backbuffer = texture_creator let mut backbuffer = texture_creator
@@ -106,9 +106,8 @@ impl Game {
debug_texture.set_blend_mode(BlendMode::Blend); debug_texture.set_blend_mode(BlendMode::Blend);
debug_texture.set_scale_mode(ScaleMode::Nearest); debug_texture.set_scale_mode(ScaleMode::Nearest);
let font_data = get_asset_bytes(Asset::Font)?; let font_data: &'static [u8] = get_asset_bytes(Asset::Font)?.to_vec().leak();
let static_font_data: &'static [u8] = Box::leak(font_data.to_vec().into_boxed_slice()); let font_asset = RWops::from_bytes(font_data).map_err(|_| GameError::Sdl("Failed to load font".to_string()))?;
let font_asset = RWops::from_bytes(static_font_data).map_err(|_| GameError::Sdl("Failed to load font".to_string()))?;
let debug_font = ttf_context let debug_font = ttf_context
.load_font_from_rwops(font_asset, constants::ui::DEBUG_FONT_SIZE) .load_font_from_rwops(font_asset, constants::ui::DEBUG_FONT_SIZE)
.map_err(|e| GameError::Sdl(e.to_string()))?; .map_err(|e| GameError::Sdl(e.to_string()))?;
@@ -256,7 +255,7 @@ impl Game {
world.insert_non_send_resource(atlas); world.insert_non_send_resource(atlas);
world.insert_non_send_resource(event_pump); world.insert_non_send_resource(event_pump);
world.insert_non_send_resource(canvas); world.insert_non_send_resource::<&mut Canvas<Window>>(Box::leak(Box::new(canvas)));
world.insert_non_send_resource(BackbufferResource(backbuffer)); world.insert_non_send_resource(BackbufferResource(backbuffer));
world.insert_non_send_resource(MapTextureResource(map_texture)); world.insert_non_send_resource(MapTextureResource(map_texture));
world.insert_non_send_resource(DebugTextureResource(debug_texture)); world.insert_non_send_resource(DebugTextureResource(debug_texture));

View File

@@ -128,7 +128,7 @@ pub fn input_system(
delta_time: Res<DeltaTime>, delta_time: Res<DeltaTime>,
mut bindings: ResMut<Bindings>, mut bindings: ResMut<Bindings>,
mut writer: EventWriter<GameEvent>, mut writer: EventWriter<GameEvent>,
mut pump: NonSendMut<&'static mut EventPump>, mut pump: NonSendMut<EventPump>,
mut cursor: ResMut<CursorPosition>, mut cursor: ResMut<CursorPosition>,
) { ) {
let mut cursor_seen = false; let mut cursor_seen = false;