diff --git a/main.go b/main.go index c63c33f..70af857 100644 --- a/main.go +++ b/main.go @@ -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)