在 Rust 中批量更新 Vec 中的相邻元素(为了性能)

问题描述 投票:0回答:1

我正在使用 minifb 构建一个小型图形库,本质上只是将像素绘制到帧缓冲区。
目前,我将矩形位块传输为

Texture
的代码如下:

fn blit(&self, dest: &mut Texture) {                  
    for x: i32 in self.x..self.x+self.width {         
        for y: i32 in self.y..self.y+self.height {    
            dest.set(x, y, color: self.color.clone());
            // same as dest.pixels[y*dest.width+x]=color
            // but this checks for out-of-bound pixels.
        }                                             
    }                                                 
}                                                     

显然这是非常低效的,因为我需要逐一循环每个像素。
我想知道 Rust 是否有一种方法将 dest.pixels 向量的“块”设置为矩形像素线?那么一次调用就可以更新一行 100 像素?类似于

Vec::update_from(&mut self, index, new_values)

例如,如果我有两个 Vec,如下所示:

let a = vec![2, 4, 5, 6, 7, 8, 10];
let b = vec![0, 1, 2];

我希望能够开始将 vec b 写入 vec a 的特定索引处,例如索引 3(元素 4)。所以得到的 vec 将是

[2, 4, 5, 0, 1, 2, 10]

如果有一种方法可以通过一次调用来批量更新 vec 中的元素,我真的很感激:)

第二个请求 - 其他纹理怎么样?

我将texture(像素向量)传输到另一个纹理的代码如下:

fn blit(&self, dest: &mut Texture) {                                                       
    for y: i32 in 0i32..self.height as i32 {                                               
        for x: i32 in 0i32..self.width as i32 {                                            
            dest.set(x: x + self.x, y: y + self.y, color: self.get(x, y).unwrap().clone());
        }                                                                                  
    }                                                                                      
}                                                                                          

是否也可以批量写入不同的值(一次写入行而不是像素)?

对其中任何一个的任何帮助将不胜感激,我很乐意回答任何问题以澄清问题。

arrays list performance rust vector
1个回答
0
投票

对于

Vec
s(或更准确地说是切片),是的,但我不知道你的纹理库。无论如何,这是
copy_from_slice()

a[3..][..b.len()].copy_from_slice(b);
© www.soinside.com 2019 - 2024. All rights reserved.