xyz I'm on Godot 4.3 for Android... Profiling is difficult as running the game isn't on a separate Window...
here's how I do collisions currently, results are 400-500 Bullets at 30-60 FPS
const BROAD_RADIUS: float = 120.0
const GRAZE_RADIUS: float = 100.0
const HURT_RADIUS: float = 8.0
const SHIELD_RADIUS: float = 80.0
const WAVE_RADIUS: float = 40.0
func physics_process(delta: float) → void:
check_collisions()
func check_collisions() → void:
if not is_instance_valid(GameManager.player):
return
for b: EnemyBullet in active_enemy_bullet_pool:
if not is_instance_valid(b):
continue
var player_distance: float = GameManager.player.global_position.distance_squared_to(b.global_position)
var graze_r: float = GRAZE_RADIUS + b.collision_size()
var inside_graze: bool = player_distance <= graze_r * graze_r
if inside_graze and not b.has_grazed:
GameManager.player.graze_increase(1)
b.has_grazed = true
elif not inside_graze and b.has_grazed:
b.has_grazed = false
var hurt_r: float = HURT_RADIUS + b.collision_size()
var inside_hurt: bool = player_distance <= hurt_r * hurt_r
if inside_hurt and not b.has_hit_player:
GameManager.player.damaged(b.damage_player())
b.has_hit_player = true
elif not inside_hurt and b.has_hit_player:
b.has_hit_player = false
var broad_r: float = BROAD_RADIUS + b.collision_size()
if is_instance_valid(GameManager.shield) and GameManager.shield.enabled == true:
var shield_distance: float = GameManager.shield.global_position.distance_squared_to(b.global_position)
var shield_r: float = SHIELD_RADIUS + b.collision_size()
var inside_shield: bool = shield_distance <= shield_r * shield_r
if inside_shield and not b.has_been_reflected:
var shield_result: bool = b.shield_reflected(GameManager.shield.global_position)
if shield_result == false:
GameManager.shield.destroyed()
b.has_been_reflected = true
elif not inside_shield and b.has_been_reflected:
b.has_been_reflected = false
if shield_distance > broad_r * broad_r:
continue
if player_wave_bullet_pool.size() > 0:
for pb: PlayerBullet in player_wave_bullet_pool:
var wave_distance: float = pb.global_position.distance_squared_to(b.global_position)
var wave_r: float = WAVE_RADIUS + b.collision_size()
var inside_wave: bool = wave_distance <= wave_r * wave_r
if inside_wave and not b.has_been_slowed:
b.movement_slowed(200.0, Vector2.UP)
b.has_been_slowed = true
elif not inside_wave and b.has_been_slowed:
b.has_been_slowed = false
if player_distance > broad_r * broad_r:
continue