Я думаю, что проблема здесь в том, что мы используем функцию view(..)
как обратный вызов внутри для рисования графики. Таким образом, минимальная установка будет выглядеть так:
fn main() {
nannou::sketch(view);
}
fn view(app: &App, frame: Frame) -> Frame {
// Draw stuff
}
Однако, если вы хотите передать данные, тогда нам нужно использовать Model
, например:
fn main() {
nannou::app(model).update(update).run();
}
struct Model {
my_data: MyData,
}
fn model(app: &App) -> Model {
app
.new_window()
.with_dimensions(720, 720)
.view(view)
.build()
.unwrap();
let my_data = MyData::new();
Model { my_data }
}
fn update(_app: &App, _model: &mut Model, _update: Update) {}
fn view(app: &App, model: &Model, frame: Frame) -> Frame {
// Draw stuff
}
Обратите внимание, что функция вида имеет другую подпись при такой настройке. Он включает Model
, в который вы можете поместить свои собственные данные. Он неизменен, пока вы хотите обновить его в функции update()
, но при необходимости вы можете обойтись с помощью RefCell
.
Обычно я запускаю другие потоки из функции model()
, а затем использую каналы в Model
для обратной связи с циклом nannou, например:
fn model(app: &App) -> Model {
let (talk_to_nannou, data_from_my_thread) = mpsc::channel();
thread::spawn(|| {
//All the stuff I want to do
talk_to_nannou.send("Hey");
});
Model {
data_from_my_thread,
};
}
fn view(app: &App, model: &Model, frame: Frame) -> Frame {
if let Some(msg) = model.data_from_my_thread.try_recv() {
dbg!(msg);
}
}
Вы могли бы думать об этом иначе, если бы вы добавляли его в существующее приложение, например:
fn main() {
// My awesome app that has heaps of cool stuff
thread::spawn(|| {
nannou::app(model).update(update).run();
});
// Do more stuff in my cool app
}
struct Model {
my_data: MyData,
}
fn model(app: &App) -> Model {
app.new_window()
.with_dimensions(720, 720)
.view(view)
.build()
.unwrap();
let my_data = MyData::new();
Model { my_data }
}
fn update(_app: &App, _model: &mut Model, _update: Update) {}
fn view(app: &App, model: &Model, frame: Frame) -> Frame {
// Draw stuff
}
Тогда вы можете заправить все наноу в модуль, но вам решать, как вы хотите все упорядочить. Единственное, что Nannou нужно выполнить свой внутренний цикл, чтобы выполнить всю работу, но он счастлив быть в другом потоке.
Ознакомьтесь с примерами и Guide для получения дополнительной информации