1- from threading import Condition
21from typing import Dict , Any , List , Callable , Optional
32from operator import mul
43from functools import reduce
4+ import time
55
66import numpy as np
77from structures .heap import Heap
88
9+ from utility .threading import Condition , cond_var_wait_for
910from algorithms .configuration .entities .agent import Agent
1011from algorithms .configuration .entities .trace import Trace
1112from algorithms .configuration .entities .obstacle import Obstacle
@@ -40,6 +41,7 @@ def __init__(self, services: Services) -> None:
4041 self .cv = None
4142 self .key_frame_skip_count = 0
4243 self .total_time = 0
44+ self .last_frame_time = 0
4345 self .requires_key_frame = False
4446 self .reset ()
4547
@@ -51,6 +53,7 @@ def reset(self) -> None:
5153 self .cv = None
5254 self .key_frame_skip_count = 0
5355 self .total_time = 0
56+ self .last_frame_time = 0
5457 if self ._services .settings .simulator_key_frame_speed == 0 or not self ._services .settings .simulator_graphics :
5558 self .key_frame = lambda * args , ** kwargs : None
5659 else :
@@ -86,6 +89,10 @@ def key_frame_internal(self, ignore_key_frame_skip: bool = False, only_render: L
8689 if root_key_frame :
8790 root_key_frame .instance .testing .key_frame (ignore_key_frame_skip = ignore_key_frame_skip , only_render = only_render )
8891
92+ def sleep_pred ():
93+ return not self .requires_key_frame or self .is_terminated ()
94+
95+ # skip render frame
8996 if ignore_key_frame_skip or self .key_frame_skip_count >= self ._services .settings .simulator_key_frame_skip :
9097 self .display_info = self ._services .algorithm .instance .set_display_info ()
9198
@@ -96,11 +103,26 @@ def key_frame_internal(self, ignore_key_frame_skip: bool = False, only_render: L
96103 with self .cv :
97104 self .requires_key_frame = True
98105 self .cv .notify ()
99- self .cv . wait_for ( lambda : not self . requires_key_frame or self . is_terminated () )
106+ cond_var_wait_for ( self .cv , sleep_pred )
100107 self .key_frame_skip_count = 0
101108 else :
102109 self .key_frame_skip_count += 1
103110
111+ # limit key frame speed
112+ if self .cv is not None :
113+ t = time .time ()
114+ sleep_dt = self ._services .settings .simulator_key_frame_speed - (t - self .last_frame_time )
115+ self .last_frame_time = t
116+
117+ while sleep_dt > 0 :
118+ with self .cv :
119+ self .requires_key_frame = True
120+ self .cv .notify ()
121+ cond_var_wait_for (self .cv , sleep_pred )
122+ nt = time .time ()
123+ sleep_dt = sleep_dt - nt + t
124+ t = nt
125+
104126 if self .is_terminated ():
105127 from simulator .models .map_model import AlgorithmTerminated
106128 raise AlgorithmTerminated ()
0 commit comments