feat: improve performance (1000 boid @ ~140ms)
This commit is contained in:
parent
a26e1fa993
commit
c34e2b72bf
@ -72,11 +72,14 @@ func _process_boids() -> void:
|
|||||||
args[iidx].boid.apply_force(forces[iidx])
|
args[iidx].boid.apply_force(forces[iidx])
|
||||||
|
|
||||||
func _pack_calc_args_flock(flock: Flock) -> Dictionary:
|
func _pack_calc_args_flock(flock: Flock) -> Dictionary:
|
||||||
var others_pos := PackedVector3Array([])
|
var num_of_boids := flock.boids.size()
|
||||||
var others_vel := PackedVector3Array([])
|
var others_pos := PackedVector3Array([]); others_pos.resize(num_of_boids)
|
||||||
|
var others_vel := PackedVector3Array([]); others_vel.resize(num_of_boids)
|
||||||
|
var idx := 0
|
||||||
for aboid in flock.boids.values():
|
for aboid in flock.boids.values():
|
||||||
others_pos.append(aboid._get_boid_position())
|
others_pos.set(idx, aboid._get_boid_position())
|
||||||
others_vel.append(aboid._get_boid_velocity())
|
others_vel.set(idx, aboid._get_boid_velocity())
|
||||||
|
idx += 1
|
||||||
var flock_args := {
|
var flock_args := {
|
||||||
'others_pos': others_pos,
|
'others_pos': others_pos,
|
||||||
'others_vel': others_vel,
|
'others_vel': others_vel,
|
||||||
@ -98,9 +101,11 @@ func _pack_calc_args_boid(boid, args: Dictionary) -> Dictionary:
|
|||||||
func _calculate_boid_parallel(idx: int, read_from: Array[Array], write_to: Array[PackedVector3Array]) -> void:
|
func _calculate_boid_parallel(idx: int, read_from: Array[Array], write_to: Array[PackedVector3Array]) -> void:
|
||||||
var args = read_from[idx]
|
var args = read_from[idx]
|
||||||
var forces = write_to[idx]
|
var forces = write_to[idx]
|
||||||
for iidx in args.size():
|
var arg_idx := 0
|
||||||
var force = _calculate_boid(args[iidx])
|
for arg in args:
|
||||||
forces[iidx] = force
|
var force = _calculate_boid(arg)
|
||||||
|
forces[arg_idx] = force
|
||||||
|
arg_idx += 1
|
||||||
|
|
||||||
func _calculate_boid(args: Dictionary) -> Vector3:
|
func _calculate_boid(args: Dictionary) -> Vector3:
|
||||||
var boid_properties: BoidProperties = args.self_props
|
var boid_properties: BoidProperties = args.self_props
|
||||||
@ -115,23 +120,31 @@ func _calculate_boid(args: Dictionary) -> Vector3:
|
|||||||
var align_count := 0
|
var align_count := 0
|
||||||
var cohere_count := 0
|
var cohere_count := 0
|
||||||
|
|
||||||
|
var goal_seperation: float = args.goal_seperation
|
||||||
|
var goal_alignment: float = args.goal_alignment
|
||||||
|
var goal_cohesion: float = args.goal_cohesion
|
||||||
|
var others_pos: PackedVector3Array = args.others_pos
|
||||||
|
var others_vel: PackedVector3Array = args.others_vel
|
||||||
var aboid_idx := 0
|
var aboid_idx := 0
|
||||||
for aboid_pos in args.others_pos:
|
# iterating over the packed array for pos is faster, we use pos always, vel only in one case
|
||||||
var dist = boid_pos.distance_to(aboid_pos)
|
for aboid_pos in others_pos:
|
||||||
|
# faster for when checking, we can just sqrt later for calculating steering
|
||||||
|
var dist = boid_pos.distance_squared_to(aboid_pos)
|
||||||
if dist >= EPSILON:
|
if dist >= EPSILON:
|
||||||
var diff = (boid_pos - aboid_pos).normalized() / dist
|
if dist < goal_seperation:
|
||||||
if dist < args.goal_seperation: steer += diff; steer_count += 1
|
var diff = (boid_pos - aboid_pos).normalized() / sqrt(dist)
|
||||||
if dist < args.goal_alignment: align += args.others_vel[aboid_idx]; align_count += 1
|
steer += diff; steer_count += 1
|
||||||
if dist < args.goal_cohesion: cohere += aboid_pos; cohere_count += 1
|
if dist < goal_alignment: align += others_vel[aboid_idx]; align_count += 1
|
||||||
|
if dist < goal_cohesion: cohere += aboid_pos; cohere_count += 1
|
||||||
aboid_idx += 1
|
aboid_idx += 1
|
||||||
|
|
||||||
if steer_count > 0: steer /= steer_count
|
if steer_count > 0: steer /= steer_count
|
||||||
if align_count > 0: align /= align_count
|
if align_count > 0: align /= align_count
|
||||||
if cohere_count > 0: cohere /= cohere_count; cohere -= boid_pos
|
if cohere_count > 0: cohere /= cohere_count; cohere -= boid_pos
|
||||||
|
|
||||||
if align.length() > 0.0: align = (align.normalized() * boid_properties.max_speed - boid_vel).limit_length(boid_properties.max_force)
|
if align.length_squared() > 0.0: align = (align.normalized() * boid_properties.max_speed - boid_vel).limit_length(boid_properties.max_force)
|
||||||
if steer.length() > 0.0: steer = (steer.normalized() * boid_properties.max_speed - boid_vel).limit_length(boid_properties.max_force)
|
if steer.length_squared() > 0.0: steer = (steer.normalized() * boid_properties.max_speed - boid_vel).limit_length(boid_properties.max_force)
|
||||||
if cohere.length() > 0.0: cohere = (cohere.normalized() * boid_properties.max_speed - boid_vel).limit_length(boid_properties.max_force)
|
if cohere.length_squared() > 0.0: cohere = (cohere.normalized() * boid_properties.max_speed - boid_vel).limit_length(boid_properties.max_force)
|
||||||
|
|
||||||
var target := Vector3.ZERO
|
var target := Vector3.ZERO
|
||||||
var target_position := args.get('target_position')
|
var target_position := args.get('target_position')
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
extends Node
|
extends Node
|
||||||
class_name Flock
|
class_name Flock
|
||||||
|
|
||||||
@export var goal_seperation: float = 25.0
|
@export var goal_seperation: float = 25.0 ** 2
|
||||||
@export var goal_alignment: float = 50.0
|
@export var goal_alignment: float = 50.0 ** 2
|
||||||
@export var goal_cohesion: float = 50.0
|
@export var goal_cohesion: float = 50.0 ** 2
|
||||||
|
|
||||||
var boids: Dictionary = {}
|
var boids: Dictionary = {}
|
||||||
|
|
||||||
|
@ -8,15 +8,3 @@ script = ExtResource("1_3gcrf")
|
|||||||
|
|
||||||
[node name="Flock" type="Node" parent="."]
|
[node name="Flock" type="Node" parent="."]
|
||||||
script = ExtResource("2_1xeeb")
|
script = ExtResource("2_1xeeb")
|
||||||
|
|
||||||
[node name="Flock2" type="Node" parent="."]
|
|
||||||
script = ExtResource("2_1xeeb")
|
|
||||||
|
|
||||||
[node name="Flock3" type="Node" parent="."]
|
|
||||||
script = ExtResource("2_1xeeb")
|
|
||||||
|
|
||||||
[node name="Flock4" type="Node" parent="."]
|
|
||||||
script = ExtResource("2_1xeeb")
|
|
||||||
|
|
||||||
[node name="Flock5" type="Node" parent="."]
|
|
||||||
script = ExtResource("2_1xeeb")
|
|
||||||
|
Loading…
Reference in New Issue
Block a user