在 Rust 中使用 SDL 绘图时获取许多不同颜色的像素

Getting pixels of many different colors when drawing with SDL in Rust

我正在 SDL2 玩 Rust,想在屏幕上绘制一个矩形和一个点。虽然这似乎在一定程度上起作用,但我在绘制所需工件的区域周围出现了各种不同颜色的垃圾像素。为什么是这样?如果有帮助,我正在使用配备 M1 Max 的 MacBook Pro。

代码如下:

extern crate sdl2;

use sdl2::event::Event;
use sdl2::pixels::Color;
use sdl2::rect::Point;
use sdl2::rect::Rect;

pub fn main() {
    let sdl_context = sdl2::init().unwrap();
    let video_subsystem = sdl_context.video().unwrap();

    let window = video_subsystem
        .window("rust-sdl2 demo", 800, 600)
        .position_centered()
        .build()
        .unwrap();

    let mut canvas = window.into_canvas().build().unwrap();
    canvas.set_draw_color(Color::RGB(255, 255, 255));
    let point = Point::new(400, 400);
    canvas.draw_point(point).unwrap();
    canvas.fill_rect(Rect::new(10, 10, 80, 70)).unwrap();
    canvas.present();

    let mut event_pump = sdl_context.event_pump().unwrap();
    'running: loop {
        for event in event_pump.poll_iter() {
            match event {
                Event::Quit { .. } => break 'running,
                _ => {}
            }
        }
    }
}

您需要清除 canvas,在帧的开头清除 canvas 是正常的,以确保没有任何遗留下来的先前帧或其他遗留物的人工制品(即另一个程序以前使用过该内存并且在退出/继续之前没有将其清零)。在您的情况下,您需要添加

// Adust the color to whatever you want
canvas.set_draw_color(Color::RGB(0, 0, 0));
canvas.clear();

let mut canvas = ... 行之后但在 canvas

上绘制任何内容之前

如果您熟悉 Source 引擎游戏(半条命、CS:GO、传送门等),不这样做加上不为每一帧绘制屏幕上的每个像素会导致非常独特的视觉效果并且曾经在其中一场比赛中出界,你就会明白我在说什么,这就是“镜厅效应”。 This Q&A on the Gamedev Stack Exchange has some more information on why it happens, and here 的视频展示了原版《毁灭战士》

中的效果