amarao_san

Category:

Рефакторинг

Мой рефакторинг по изучению Раста закончился успехом. Итог:

fn main() {...}
fn main() {...}

Код: https://github.com/amarao/equart/commit/246e29e117aa7eabb1347d213e9aa3c7a1bdbf05

Самое дерзкое тут — App::new::<RandDraw> — в этом месте можно передавать любые структуры, у которых реализован трейт DrawingApp, что позволит переключать «рисовалки» в одну строчку.

Сам трейт суперпростой:

pub trait DrawingApp {
  fn new(id: usize)->Self;
  fn calculate_pixel(&mut self, x: u32, y: u32) -> im::Rgba<u8>;
}

При инциализации даётся id (треда), а потом в цикле спрашивают про значение пиксела в заданной точке (серией по одной строке, потом возможна пауза на апдейт фрейма). Остальные куски кода реализуют всё остальное — параллелизм (запускается несколько копий), обработку буфера/тексту, генерация апдейтов на экран во время vsync, ресайзы и т.д.

Теперь сюда можно прифигачить код «поиска корней» больше не парясь про проблемы отображения. Будет не очень эффективно (де-факто ещё одно копирование), но зато можно вообще перестать думать про графическую часть и параллельность.


Error

default userpic

Your IP address will be recorded 

When you submit the form an invisible reCAPTCHA check will be performed.
You must follow the Privacy Policy and Google Terms of use.