Browse Source

Overestimate draw duration to reduce missed VSyncs

Johannes Hofmann 8 years ago
parent
commit
2cbc675050
1 changed files with 21 additions and 5 deletions
  1. 21
    5
      src/main.rs

+ 21
- 5
src/main.rs View File

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
 fn main() {
165
 fn main() {
162
     env_logger::init();
166
     env_logger::init();
163
 
167
 
227
           duration_per_frame.as_secs() as f64 * 1000.0
231
           duration_per_frame.as_secs() as f64 * 1000.0
228
           + duration_per_frame.subsec_nanos() as f64 * 1e-6);
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
     let mut last_draw = Instant::now();
236
     let mut last_draw = Instant::now();
232
 
237
 
233
     'outer: for event in window.wait_events() {
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
         let mut redraw = false;
242
         let mut redraw = false;
237
 
243
 
238
         match handle_event(&event, &mut map, &mut input_state, &mut sources) {
244
         match handle_event(&event, &mut map, &mut input_state, &mut sources) {
244
         }
250
         }
245
 
251
 
246
         for event in window.poll_events() {
252
         for event in window.poll_events() {
253
+            debug!("{:?}", &event);
247
             match handle_event(&event, &mut map, &mut input_state, &mut sources) {
254
             match handle_event(&event, &mut map, &mut input_state, &mut sources) {
248
                 Action::Close => break 'outer,
255
                 Action::Close => break 'outer,
249
                 Action::Redraw => {
256
                 Action::Redraw => {
255
 
262
 
256
         {
263
         {
257
             let diff = last_draw.elapsed();
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
                     std::thread::sleep(dur);
267
                     std::thread::sleep(dur);
261
 
268
 
262
                     for event in window.poll_events() {
269
                     for event in window.poll_events() {
270
+                        debug!("after sleep {:?}", &event);
263
                         match handle_event(&event, &mut map, &mut input_state, &mut sources) {
271
                         match handle_event(&event, &mut map, &mut input_state, &mut sources) {
264
                             Action::Close => break 'outer,
272
                             Action::Close => break 'outer,
265
                             Action::Redraw => {
273
                             Action::Redraw => {
275
         if redraw {
283
         if redraw {
276
             let draw_start = Instant::now();
284
             let draw_start = Instant::now();
277
             map.draw(sources.current());
285
             map.draw(sources.current());
278
-            draw_dur = draw_start.elapsed();
286
+            let draw_dur = draw_start.elapsed();
279
 
287
 
280
             let _ = window.swap_buffers();
288
             let _ = window.swap_buffers();
281
 
289
 
282
             last_draw = Instant::now();
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
         // set window title
301
         // set window title