Parallelisierung von der kollision

This commit is contained in:
any
2026-05-10 21:14:07 +02:00
parent 79e94f9377
commit 907268c47c
+27 -9
View File
@@ -85,29 +85,47 @@ func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int, particleLis
var particleSpeed = [MAXPOINTS]rl.Vector2{{0, -300}} //pixel pro Sekunde
var timeIncrement float64 = 0.01
var gravity rl.Vector2 = rl.Vector2{0, 300}
var newParticleList [MAXPOINTS]rl.Vector2
var newParticleSpeed [MAXPOINTS]rl.Vector2
for j := float64(0); j < 50; {
var startTime time.Time = time.Now()
(*particleListKey).Lock()
// Snapshot der aktuellen Positionen für den parallelen Block (read-only)
particleListKey.Lock()
currentPositions := *particleList
particleListKey.Unlock()
for i := 0; i < particleCount; i++ {
var wg sync.WaitGroup
obstacleReflect((*particleList)[i], &(particleSpeed[i]), obstacles, particleRadius, obstacleCount)
particleList[i] =
rl.Vector2Add(
particleList[i],
for k := 0; k < particleCount; k++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
// Jede Goroutine arbeitet nur auf Index i → kein Datenkonflikt
obstacleReflect(currentPositions[i], &particleSpeed[i], obstacles, particleRadius, obstacleCount)
newParticleList[i] = rl.Vector2Add(
currentPositions[i],
rl.Vector2Scale(particleSpeed[i], float32(timeIncrement)))
particleSpeed[i] =
rl.Vector2Add(
newParticleSpeed[i] = rl.Vector2Add(
particleSpeed[i],
rl.Vector2Scale(gravity, float32(timeIncrement)))
}(k)
}
(*particleListKey).Unlock()
wg.Wait()
// Ergebnisse zurückschreiben — nur dieser Block muss gelockt sein
particleListKey.Lock()
*particleList = newParticleList
particleListKey.Unlock()
//fmt.Println(particleList)
particleSpeed = newParticleSpeed
j += timeIncrement
var endTime time.Time = time.Now()
var elapsed time.Duration = endTime.Sub(startTime)