performance bottleneck
This commit is contained in:
parent
c6116f88f3
commit
3810e64a5c
18 changed files with 298 additions and 412 deletions
|
|
@ -175,42 +175,56 @@ class CollisionEngine:
|
|||
Returns:
|
||||
Boolean if static, integer count if congestion.
|
||||
"""
|
||||
# Optimization: Pre-fetch some members
|
||||
sz = self.safety_zone_radius
|
||||
|
||||
if buffer_mode == 'static':
|
||||
# Use raw query against pre-dilated obstacles
|
||||
candidates = self.static_index.intersection(geometry.bounds)
|
||||
bounds = geometry.bounds
|
||||
candidates = self.static_index.intersection(bounds)
|
||||
|
||||
static_prepared = self.static_prepared
|
||||
static_dilated = self.static_dilated
|
||||
static_geometries = self.static_geometries
|
||||
|
||||
for obj_id in candidates:
|
||||
if self.static_prepared[obj_id].intersects(geometry):
|
||||
if static_prepared[obj_id].intersects(geometry):
|
||||
if start_port or end_port:
|
||||
# Optimization: Skip expensive intersection if neither port is near the obstacle's bounds
|
||||
# (Plus a small margin for safety zone)
|
||||
sz = self.safety_zone_radius
|
||||
is_near_port = False
|
||||
for p in [start_port, end_port]:
|
||||
if p:
|
||||
# Quick bounds check
|
||||
b = self.static_dilated[obj_id].bounds
|
||||
if (b[0] - sz <= p.x <= b[2] + sz and
|
||||
b[1] - sz <= p.y <= b[3] + sz):
|
||||
is_near_port = True
|
||||
break
|
||||
b = static_dilated[obj_id].bounds
|
||||
if start_port:
|
||||
if (b[0] - sz <= start_port.x <= b[2] + sz and
|
||||
b[1] - sz <= start_port.y <= b[3] + sz):
|
||||
is_near_port = True
|
||||
if not is_near_port and end_port:
|
||||
if (b[0] - sz <= end_port.x <= b[2] + sz and
|
||||
b[1] - sz <= end_port.y <= b[3] + sz):
|
||||
is_near_port = True
|
||||
|
||||
if not is_near_port:
|
||||
return True # Collision, and not near any port safety zone
|
||||
|
||||
# Only if near port, do the expensive check
|
||||
raw_obstacle = self.static_geometries[obj_id]
|
||||
raw_obstacle = static_geometries[obj_id]
|
||||
intersection = geometry.intersection(raw_obstacle)
|
||||
if not intersection.is_empty:
|
||||
ix_minx, ix_miny, ix_maxx, ix_maxy = intersection.bounds
|
||||
ix_bounds = intersection.bounds
|
||||
is_safe = False
|
||||
for p in [start_port, end_port]:
|
||||
if p and (abs(ix_minx - p.x) < sz and
|
||||
abs(ix_maxx - p.x) < sz and
|
||||
abs(ix_miny - p.y) < sz and
|
||||
abs(ix_maxy - p.y) < sz):
|
||||
# Check start port
|
||||
if start_port:
|
||||
if (abs(ix_bounds[0] - start_port.x) < sz and
|
||||
abs(ix_bounds[2] - start_port.x) < sz and
|
||||
abs(ix_bounds[1] - start_port.y) < sz and
|
||||
abs(ix_bounds[3] - start_port.y) < sz):
|
||||
is_safe = True
|
||||
# Check end port
|
||||
if not is_safe and end_port:
|
||||
if (abs(ix_bounds[0] - end_port.x) < sz and
|
||||
abs(ix_bounds[2] - end_port.x) < sz and
|
||||
abs(ix_bounds[1] - end_port.y) < sz and
|
||||
abs(ix_bounds[3] - end_port.y) < sz):
|
||||
is_safe = True
|
||||
break
|
||||
|
||||
if is_safe:
|
||||
continue
|
||||
|
|
@ -222,9 +236,12 @@ class CollisionEngine:
|
|||
test_poly = dilated_geometry if dilated_geometry else geometry.buffer(dilation)
|
||||
candidates = self.dynamic_index.intersection(test_poly.bounds)
|
||||
|
||||
dynamic_geometries = self.dynamic_geometries
|
||||
dynamic_prepared = self.dynamic_prepared
|
||||
|
||||
count = 0
|
||||
for obj_id in candidates:
|
||||
other_net_id, _ = self.dynamic_geometries[obj_id]
|
||||
if other_net_id != net_id and self.dynamic_prepared[obj_id].intersects(test_poly):
|
||||
other_net_id, _ = dynamic_geometries[obj_id]
|
||||
if other_net_id != net_id and dynamic_prepared[obj_id].intersects(test_poly):
|
||||
count += 1
|
||||
return count
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue