Pārlūkot izejas kodu

Overestimate draw duration to reduce missed VSyncs

Johannes Hofmann 8 gadus atpakaļ
vecāks
revīzija
2cbc675050
1 mainītis faili ar 21 papildinājumiem un 5 dzēšanām
  1. 21
    5
      src/main.rs

+ 21
- 5
src/main.rs Parādīt failu

@@ -158,6 +158,10 @@ fn handle_event(event: &Event, map: &mut MapViewGl, input_state: &mut InputState
158 158
     }
159 159
 }
160 160
 
161
+fn dur_to_sec(dur: Duration) -> f64 {
162
+    dur.as_secs() as f64 + dur.subsec_nanos() as f64 * 1e-9
163
+}
164
+
161 165
 fn main() {
162 166
     env_logger::init();
163 167
 
@@ -227,12 +231,14 @@ fn main() {
227 231
           duration_per_frame.as_secs() as f64 * 1000.0
228 232
           + duration_per_frame.subsec_nanos() as f64 * 1e-6);
229 233
 
230
-    let mut draw_dur = Duration::from_millis(8);
234
+    // estimated draw duration
235
+    let mut est_draw_dur = duration_per_frame;
231 236
     let mut last_draw = Instant::now();
232 237
 
233 238
     'outer: for event in window.wait_events() {
234
-        let start_source_id = sources.current().id();
239
+        debug!("{:?}", &event);
235 240
 
241
+        let start_source_id = sources.current().id();
236 242
         let mut redraw = false;
237 243
 
238 244
         match handle_event(&event, &mut map, &mut input_state, &mut sources) {
@@ -244,6 +250,7 @@ fn main() {
244 250
         }
245 251
 
246 252
         for event in window.poll_events() {
253
+            debug!("{:?}", &event);
247 254
             match handle_event(&event, &mut map, &mut input_state, &mut sources) {
248 255
                 Action::Close => break 'outer,
249 256
                 Action::Redraw => {
@@ -255,11 +262,12 @@ fn main() {
255 262
 
256 263
         {
257 264
             let diff = last_draw.elapsed();
258
-            if diff + draw_dur * 2 < duration_per_frame {
259
-                if let Some(dur) = duration_per_frame.checked_sub(draw_dur * 2) {
265
+            if diff + est_draw_dur * 2 < duration_per_frame {
266
+                if let Some(dur) = duration_per_frame.checked_sub(est_draw_dur * 2) {
260 267
                     std::thread::sleep(dur);
261 268
 
262 269
                     for event in window.poll_events() {
270
+                        debug!("after sleep {:?}", &event);
263 271
                         match handle_event(&event, &mut map, &mut input_state, &mut sources) {
264 272
                             Action::Close => break 'outer,
265 273
                             Action::Redraw => {
@@ -275,11 +283,19 @@ fn main() {
275 283
         if redraw {
276 284
             let draw_start = Instant::now();
277 285
             map.draw(sources.current());
278
-            draw_dur = draw_start.elapsed();
286
+            let draw_dur = draw_start.elapsed();
279 287
 
280 288
             let _ = window.swap_buffers();
281 289
 
282 290
             last_draw = Instant::now();
291
+
292
+            debug!("draw: {} sec (est {} sec)", dur_to_sec(draw_dur), dur_to_sec(est_draw_dur));
293
+
294
+            est_draw_dur = if draw_dur > est_draw_dur {
295
+                draw_dur
296
+            } else {
297
+                (draw_dur / 4) + ((est_draw_dur / 4) * 3)
298
+            };
283 299
         }
284 300
 
285 301
         // set window title