Race condition resolved mit mutex lock
This commit is contained in:
@@ -1,12 +1,13 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
rl "github.com/gen2brain/raylib-go/raylib"
|
rl "github.com/gen2brain/raylib-go/raylib"
|
||||||
)
|
)
|
||||||
|
|
||||||
const MAXPOINTS = 100
|
const MAXPOINTS = 100000
|
||||||
|
|
||||||
func spawnParticlesAsGrid(particleWidth float32, particleHeight float32, particleColumnCount int, particleRowCount int, particleList *[MAXPOINTS]rl.Vector2) {
|
func spawnParticlesAsGrid(particleWidth float32, particleHeight float32, particleColumnCount int, particleRowCount int, particleList *[MAXPOINTS]rl.Vector2) {
|
||||||
var particleLeftCornerPos rl.Vector2 = rl.Vector2{500, 300}
|
var particleLeftCornerPos rl.Vector2 = rl.Vector2{500, 300}
|
||||||
@@ -19,31 +20,35 @@ func spawnParticlesAsGrid(particleWidth float32, particleHeight float32, particl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int) {
|
func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int, particleListKey *sync.Mutex) {
|
||||||
var particleSpeed rl.Vector2 = rl.Vector2{0, -300} //pixel pro Sekunde
|
var particleSpeed rl.Vector2 = rl.Vector2{0, -300} //pixel pro Sekunde
|
||||||
var timeIncrement float32 = 0.001
|
var timeIncrement float64 = 0.0001
|
||||||
var gravity rl.Vector2 = rl.Vector2{0, 150}
|
var gravity rl.Vector2 = rl.Vector2{0, 150}
|
||||||
|
|
||||||
for j := float32(0); j < 5; {
|
for j := float64(0); j < 5; {
|
||||||
var startTime time.Time = time.Now()
|
var startTime time.Time = time.Now()
|
||||||
|
|
||||||
|
particleListKey.Lock()
|
||||||
|
|
||||||
for i := 0; i < particleCount; i++ {
|
for i := 0; i < particleCount; i++ {
|
||||||
particleList[i] =
|
particleList[i] =
|
||||||
rl.Vector2Add(
|
rl.Vector2Add(
|
||||||
particleList[i],
|
particleList[i],
|
||||||
rl.Vector2Scale(particleSpeed, timeIncrement))
|
rl.Vector2Scale(particleSpeed, float32(timeIncrement)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
particleListKey.Unlock()
|
||||||
//fmt.Println(particleList)
|
//fmt.Println(particleList)
|
||||||
particleSpeed =
|
particleSpeed =
|
||||||
rl.Vector2Add(
|
rl.Vector2Add(
|
||||||
particleSpeed,
|
particleSpeed,
|
||||||
rl.Vector2Scale(gravity, timeIncrement))
|
rl.Vector2Scale(gravity, float32(timeIncrement)))
|
||||||
j += timeIncrement
|
j += timeIncrement
|
||||||
var endTime time.Time = time.Now()
|
var endTime time.Time = time.Now()
|
||||||
var elapsed time.Duration = endTime.Sub(startTime)
|
var elapsed time.Duration = endTime.Sub(startTime)
|
||||||
var waitTime float64 = float64(timeIncrement) - elapsed.Seconds()
|
var waitTime float64 = timeIncrement - elapsed.Seconds()
|
||||||
println(waitTime)
|
|
||||||
rl.WaitTime(waitTime)
|
rl.WaitTime(waitTime)
|
||||||
|
println((waitTime / timeIncrement))
|
||||||
rl.ClearBackground(rl.RayWhite)
|
rl.ClearBackground(rl.RayWhite)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -61,26 +66,34 @@ func main() {
|
|||||||
|
|
||||||
rl.EndDrawing()
|
rl.EndDrawing()
|
||||||
|
|
||||||
var particleWidth float32 = 200
|
var particleWidth float32 = 300
|
||||||
var particleHeight float32 = 200
|
var particleHeight float32 = 200
|
||||||
var particleColumnCount int = 10
|
var particleColumnCount int = 20
|
||||||
var particleRowCount int = 10
|
var particleRowCount int = 20
|
||||||
var particleCount int = particleRowCount * particleColumnCount
|
var particleCount int = particleRowCount * particleColumnCount
|
||||||
var particleRadius float32 = 5
|
var particleRadius float32 = 5
|
||||||
var particleColor rl.Color = rl.Black
|
var particleColor rl.Color = rl.Black
|
||||||
|
var particleListKey sync.Mutex
|
||||||
|
|
||||||
//var stepSize float32 = 10
|
//var stepSize float32 = 10
|
||||||
|
|
||||||
var particleList = [MAXPOINTS]rl.Vector2{}
|
var particleList = [MAXPOINTS]rl.Vector2{}
|
||||||
|
|
||||||
spawnParticlesAsGrid(particleWidth, particleHeight, particleColumnCount, particleRowCount, &particleList)
|
spawnParticlesAsGrid(particleWidth, particleHeight, particleColumnCount, particleRowCount, &particleList)
|
||||||
go physics(&particleList, particleCount)
|
go physics(&particleList, particleCount, &particleListKey)
|
||||||
|
|
||||||
for !rl.WindowShouldClose() {
|
for !rl.WindowShouldClose() {
|
||||||
|
rl.ClearBackground(rl.RayWhite)
|
||||||
|
|
||||||
|
particleListKey.Lock()
|
||||||
|
|
||||||
rl.BeginDrawing()
|
rl.BeginDrawing()
|
||||||
for i := 0; i < particleCount; i++ {
|
for i := 0; i < particleCount; i++ {
|
||||||
rl.DrawCircleV(particleList[i], particleRadius, particleColor)
|
rl.DrawCircleV(particleList[i], particleRadius, particleColor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
particleListKey.Unlock()
|
||||||
|
|
||||||
rl.EndDrawing()
|
rl.EndDrawing()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user