Rust 使用活塞高效地绘制路径

Rust 使用活塞高效地绘制路径,rust,rust-piston,Rust,Rust Piston,活塞的图形库提供了一个在两点之间绘制直线的功能,但仅限于两点。如何有效地绘制通过多个点的路径,而不必为每个线段绘制直线 假设我有以下代码: extern crate piston_window; use piston_window::*; fn main() { let mut window: PistonWindow = WindowSettings::new("Hello Piston!", [640, 480]) .exit_on_esc(true).build

活塞的图形库提供了一个在两点之间绘制直线的功能,但仅限于两点。如何有效地绘制通过多个点的路径,而不必为每个线段绘制直线

假设我有以下代码:

extern crate piston_window;

use piston_window::*;

fn main() {
    let mut window: PistonWindow = WindowSettings::new("Hello Piston!", [640, 480])
        .exit_on_esc(true).build().unwrap();
    while let Some(e) = window.next() {
        window.draw_2d(&e, |c, g| {
            clear([1.0; 4], g);
            let points = [
                [100., 100.],
                [200., 200.],
                [150., 350.],
                //...
            ];

            let mut prev = points[0];
            for pt in points[1..].iter() {
                line([0., 0., 0., 255.], 1., [
                    prev[0], prev[1], pt[0], pt[1]
                ], c.transform, g);
                prev = *pt;
            }
        });
    }
}
有没有办法把它变成这样

extern crate piston_window;

use piston_window::*;

fn main() {
    let mut window: PistonWindow = WindowSettings::new("Hello Piston!", [640, 480])
        .exit_on_esc(true).build().unwrap();
    while let Some(e) = window.next() {
        window.draw_2d(&e, |c, g| {
            clear([1.0; 4], g);
            let points = [
                [100., 100.],
                [200., 200.],
                [150., 350.],
                //...
            ];
            path([0., 0., 0., 255.], 1., &points, c.transform, g);
        });
    }
}
我被推荐到图书馆,但我不知道如何使用活塞

如何有效地绘制通过多个点的路径,而不必为每个线段绘制直线

我对活塞不太熟悉,但我怀疑您的假设,即
line()
有一些开销,使得重复调用效率低下。最后,无论你画了很多行还是一个库函数画了它们,它们都会被画出来,性能应该不会有太大的差别

看起来目前还没有一种方法可以在点之间画出一系列的线,但这应该只是一个循环的问题,就像你已经在做的那样。不过,使用
Vec::windows
会更好一些,因为您不需要临时可变变量:

pub fn path<G>(color: Color, radius: Radius, points: &[[Scalar; 2]], transform: Matrix2d, g: &mut G)
where
    G: Graphics,
{
    for w in points.windows(2) {
        line(
            color,
            radius,
            [w[0][0], w[0][1], w[1][0], w[1][1]],
            transform,
            g,
        );
    }
}
pub fn路径(颜色:颜色,半径:半径,点:&[[Scalar;2]],变换:Matrix2d,g:&mut g)
哪里
G:图形,
{
用于w in点。窗口(2){
线(
颜色
半径
[w[0][0],w[0][1],w[1][0],w[1][1],,
使改变
G
);
}
}

你可以考虑对活塞项目做一个或PR。< /P>你怎么画一条不画每段的路径?你的for循环有什么低效的地方?我正在寻找一种可以连续绘制所有线段而不必为每个线段发送绘制命令的东西。嗨,我已经归档了。他们建议我使用里昂(见我的问题),但我还没有弄明白怎么做。我已经像你描述的那样,把每一条线都画成了一个紧密的循环。当我开始画大约200条线时,会产生开销。我计划在将来画更多的线,所以我需要用一条路径或其他东西来加快速度。@SunjayVarma我不认为你理解“最终,无论你画了很多线还是一个库函数画了它们,它们都会被画出来,性能应该不会有太大的差异。”是什么让你如此确信你正在经历的减速是由于调用
线路的开销造成的?你分析过了吗?是的,我分析过了。我就是这样知道的。我只对带有行调用的循环进行了计时,执行它会使我丢弃一个帧,因为添加更多行需要很长时间。