
app.time() ์๋ฒฝ ์ดํดํ๊ธฐ์๊ฐ์ ๋ฐ๋ผ ๋ณํํ๋ ์ ๋๋ฉ์ด์
์ ๊ตฌํํ ๋ ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉํ๋ ๋ฉ์๋๊ฐ ๋ฐ๋ก app.time()์ด๋ค.
์ด ๋ฉ์๋๋ ๋จ์ํ โํ์ฌ ๊ฒฝ๊ณผ ์๊ฐโ์ ๋ฐํํ๋ ๊ฒ ๊ฐ์ง๋ง,
์ ํํ ์ธ์ , ์ด๋ค ๋จ์๋ก, ์ด๋ป๊ฒ ๊ฐฑ์ ๋๋์ง๋ฅผ ์ดํดํ๋ฉด ํจ์ฌ ๋ ์ ์ฐํ ์ ๋๋ฉ์ด์
์ ๋ง๋ค ์ ์๋ค.
app.time()์ ๊ธฐ๋ณธ ๊ฐ๋
app.time()์ Nannou์ App ๊ตฌ์กฐ์ฒด์ ํฌํจ๋ ๋ฉ์๋๋ก,
์ ํ๋ฆฌ์ผ์ด์
์ด ์์๋ ์ดํ ๊ฒฝ๊ณผํ ์๊ฐ์ ์ด ๋จ์(f32)๋ก ๋ฐํํ๋ค.
let t = app.time();
f32app ์คํ(์๋์ฐ ์์ฑ) ์์ ์ฆ, ํ๋ก๊ทธ๋จ์ด ์คํ๋ ํ๋ถํฐ ํ์ฌ๊น์ง์ ๋์ ์๊ฐ์ด์ผ.
์ด ์๊ฐ์ ํ๋ ์๊ณผ ๊ด๊ณ์์ด ์ง์์ ์ผ๋ก ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์,
ํ๋ ์ ๋๋์ด ์๋๋ผ๋ ์ ์ฒด ์๊ฐ ํ๋ฆ์ ์ผ์ ํ๊ฒ ์ ์ง๋ผ.
Nannou๋ ๋ด๋ถ์ ์ผ๋ก ํ๋ ์ ๋ฃจํ(ํ๋ ์ ๋จ์ ์
๋ฐ์ดํธ)๋ฅผ ๊ด๋ฆฌํ์ง๋ง,
app.time()์ ํ๋ ์ ๋ฃจํ์ ๋ณ๊ฐ๋ก ์์คํ
์ ์ค์ ๊ฒฝ๊ณผ ์๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐฑ์ ๋๋ค.
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฐํ ํ์ / ํ๋ ํ์ | f32 โ App.time ํ๋๊ฐ f32 ํ์
์ผ๋ก ์ ์๋์ด ์์ (docs.rs) |
| ์๋ฏธ | ์ฑ์ด ์์๋ ์ดํ ํ๋ฅธ ์๊ฐ(์ด ๋จ์) |
| ์ ๊ณต ์ด์ | app.duration.since_start.secs()๋ฅผ ๋งค๋ฒ ํธ์ถํ์ง ์๊ณ ๊ฐํธํ๊ฒ ์ ๊ทผํ๋ ค๋ ์ฉ๋ (docs.rs) |
| ํ๊ณ | ์ฅ์๊ฐ ์คํ์๋ ๋ถ๋์์์ ์ ๋ฐ๋ ์์ค ๊ฐ๋ฅ์ฑ ์์ โ ๋ฌธ์์์ ๊ถ์ฅํ์ง ์์ (docs.rs) |
| ๋ ์ ๋ฐํ ๋์ | app.duration.since_start ๋๋ app.duration.since_prev_update ๋ฑ Duration ๊ธฐ๋ฐ ํ๋ ์ฌ์ฉ (docs.rs) |
| ์๊ฐ ์ ํธ๋ฆฌํฐ | nannou::time ๋ชจ๋์์ DurationF64 ๋ฑ Duration โ f64 ๋ณํ ์ ํธ๋ฆฌํฐ ์ ๊ณต (docs.rs) |
๐ก ์ฐธ๊ณ
Nannou๋ ๋ด๋ถ์ ์ผ๋กApp๊ตฌ์กฐ์ฒด์Instant::now()๋ฅผ ๊ธฐ๋กํด๋๊ณ ,
app.time()ํธ์ถ ์Instant::now() - start_time๊ฐ์ ์ด ๋จ์๋ก ๋ณํํด ๋ฐํํ๋ค.
fn view(app: &App, _model: &Model, frame: Frame) {
let draw = app.draw();
draw.background().color(BLACK);
let t = app.time();
let x = (t * 2.0).sin() * 200.0;
let y = (t * 3.0).cos() * 200.0;
draw.ellipse()
.x_y(x, y)
.radius(20.0)
.color(RED);
draw.to_frame(app, &frame).unwrap();
}
fn view(app: &App, _model: &Model, frame: Frame) {
let draw = app.draw();
// ์ฑ ์์ ํ ๊ฒฝ๊ณผ๋ ์ด
let t = app.time;
// t๋ฅผ ์ฌ์ฉํด์ ์์ง์์ด๋ ์ ๋๋ฉ์ด์
์ฒ๋ฆฌ
let center = pt2(t.cos(), t.sin()) * 100.0;
draw.rect()
.x_y(center.x, center.y)
.w_h(100.0, 100.0);
draw.to_frame(app, &frame).unwrap();
}
โก๏ธ app.time()์ผ๋ก ์ป์ t๋ฅผ sin๊ณผ cos ํจ์์ ์ ์ฉํ๋ฉด,
์๊ฐ์ ๋ฐ๋ผ ์ฃผ๊ธฐ์ ์ผ๋ก ์์ง์ด๋ ํจํด์ ์์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
fn view(app: &App, _model: &Model, frame: Frame) {
let draw = app.draw();
draw.background().color(BLACK);
let t = app.time();
let hue = (t * 30.0) % 360.0;
let color = hsv(hue / 360.0, 1.0, 1.0);
draw.rect()
.w_h(300.0, 300.0)
.color(color);
draw.to_frame(app, &frame).unwrap();
}
โก๏ธ ์๊ฐ ๊ธฐ๋ฐ์ผ๋ก ์์(Hue)์ ์ํ์์ผ,
์ง์์ ์ผ๋ก ๋ณํํ๋ ์๊ฐ์ ๋ฆฌ๋ฌ์ ํํํ ์ ์๋ค.
app.time()๊ณผ update()์ ์ฐจ์ด๋ณดํต Nannou ํ๋ก์ ํธ๋ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
fn main() {
nannou::app(model).update(update).run();
}
update()๋ ๋งค ํ๋ ์๋ง๋ค ํธ์ถ๋๋ ํจ์๋ค.
app.time()์ ์ ์ญ ์๊ฐ์ผ๋ก, ํ๋ ์๊ณผ ๊ด๊ณ์์ด ํ๋ฌ๊ฐ ์๊ฐ์ ๋ํ๋ธ๋ค.
| ๊ตฌ๋ถ | app.time() | update() |
|---|---|---|
| ์ญํ | ๊ฒฝ๊ณผ ์๊ฐ ๋ฐํ | ์ํ ๊ฐฑ์ ๋ก์ง ์ฒ๋ฆฌ |
| ๋จ์ | ์ด ๋จ์(f64) | ํ๋ ์ ๋จ์ |
| ๊ฐฑ์ ์ฃผ๊ธฐ | ์ค์๊ฐ | FPS ์์กด |
| ์ฉ๋ | ์ ๋๋ฉ์ด์ , ์ฃผ๊ธฐ ์ ์ด | ํํฐํด, ๋ฌผ๋ฆฌ ๊ณ์ฐ ๋ฑ |
๋์ ํจ๊ป ์ฌ์ฉํ๋ฉด
โ์๊ฐ ๊ธฐ๋ฐ + ํ๋ ์ ๊ธฐ๋ฐโ์ ํ์ด๋ธ๋ฆฌ๋ ์
๋ฐ์ดํธ๊ฐ ๊ฐ๋ฅํ๋ค.
app.elapsed_frames()app.time()์ด ์ด ๋จ์๋ผ๋ฉด,
app.elapsed_frames()๋ ํ๋ ์ ์นด์ดํฐ๋ค.
let frame_count = app.elapsed_frames();
๋จ์: ํ๋ ์ ์ (์ ์ํ u64)
FPS๊ฐ ์ผ์ ํ๋ฉด app.time()๊ณผ ๋น๋ก ๊ด๊ณ
๐ก ์๋ฅผ ๋ค์ด FPS๊ฐ 60์ด๋ผ๋ฉด,
app.elapsed_frames() โ app.time() * 60.0
๋์ ํจ๊ป ์จ์, ํ๋ ์ ๊ธฐ๋ฐ ํ์ด๋ฐ ์ ์ด๋ ๊ฐ๋ฅํ๋ค.
app.time()์ ๋ฉ์ถ์ง ์๋๋ค.
app.time()์ ๊ณ์ ์ฆ๊ฐํ ์ ์๋ค.delta_time์ ๋ํด์ฃผ๋ ๋ฐฉ์์ด ํ์ํ๋ค.๋ฆฌ์ ๋ถ๊ฐ๋ฅ
app.time() ์์ฒด๋ ์ด๊ธฐํ ํ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ.
๋ฆฌ์
์ด ํ์ํ๋ฉด start_time = app.time() ํํ๋ก ๊ธฐ์ค์ ์ ์๋ ์ ์ฅํด์ผ ํ๋ค.
๋ถ๋์์์ ์ค์ฐจ
๋งค์ฐ ๊ธด ๋ฐํ์(์์๊ฐ ์ด์)์์๋ f64์ ์ค์ฐจ๊ฐ ๋์ ๋ ์ ์๋ค.
์ผ๋ฐ์ ์ธ ์ ๋๋ ์ดํฐ๋ธ ์ํธ์์๋ ๋ฌด์ํด๋ ๋ฌด๋ฐฉํ๋ค.
struct Model {
start_time: f64,
}
fn model(app: &App) -> Model {
Model {
start_time: app.time(),
}
}
fn view(app: &App, model: &Model, frame: Frame) {
let t = app.time() - model.start_time; // ๋ฆฌ์
๊ฐ๋ฅํ ์๋ ์๊ฐ
let draw = app.draw();
draw.background().color(BLACK);
let x = (t * 2.0).sin() * 200.0;
draw.ellipse().x_y(x, 0.0).radius(30.0).color(WHITE);
draw.to_frame(app, &frame).unwrap();
}
โก๏ธ model.start_time์ ๊ธฐ์ค์ ์ผ๋ก ๋๋ฉด,
์ธ์ ๋ ์ง start_time์ ๊ฐฑ์ ํ์ฌ ํ์ด๋จธ๋ฅผ ๋ฆฌ์
ํ ์ ์๋ค.