multithreading now should divide jobs evenly without any job missing out

Former-commit-id: 0511065489b0813fef82361b74369040fc2ad887
Former-commit-id: fe23e50fa33d6cf0c5118916bb29669d69bed5b9
This commit is contained in:
Song Minjae
2016-12-23 00:38:21 +09:00
parent 272c1a6ae9
commit 106afb4f49
3 changed files with 31 additions and 12 deletions

View File

@@ -512,8 +512,8 @@ constructor() : BasicGameState() {
ThreadPool.map(
i,
ThreadActorUpdate(
((actors / CORES) * i).toInt(),
((actors / CORES) * i.plus(1)).toInt() - 1,
actors.div(Terrarum.THREADS).times(i).roundInt(),
actors.div(Terrarum.THREADS).times(i.plus(1)).roundInt() - 1,
gc, delta
),
"ActorUpdate"

View File

@@ -4,6 +4,7 @@ import com.sudoplay.joise.Joise
import com.sudoplay.joise.module.*
import net.torvald.terrarum.Terrarum.Companion.STATE_ID_TOOL_NOISEGEN
import net.torvald.terrarum.concurrent.ThreadPool
import net.torvald.terrarum.gameactors.roundInt
import org.newdawn.slick.Color
import org.newdawn.slick.GameContainer
import org.newdawn.slick.Graphics
@@ -25,10 +26,8 @@ class StateNoiseTexGen : BasicGameState() {
}
override fun init(p0: GameContainer?, p1: StateBasedGame?) {
generateNoiseImage()
println("Press SPACE to generate new noise")
}
private fun noiseRidged(): Joise {
val ridged = ModuleFractal()
ridged.setType(ModuleFractal.FractalType.RIDGEMULTI)
@@ -59,6 +58,21 @@ class StateNoiseTexGen : BasicGameState() {
return Joise(ridged_autocorrect)
}
private fun noiseBillowFractal(): Joise {
val ridged = ModuleFractal()
ridged.setType(ModuleFractal.FractalType.BILLOW)
ridged.setAllSourceInterpolationTypes(ModuleBasisFunction.InterpolationType.QUINTIC)
ridged.setNumOctaves(8)
ridged.setFrequency(1.0)
ridged.seed = Random().nextLong()
val ridged_autocorrect = ModuleAutoCorrect()
ridged_autocorrect.setRange(0.0, 1.0)
ridged_autocorrect.setSource(ridged)
return Joise(ridged_autocorrect)
}
private fun noiseBlobs(): Joise {
val gradval = ModuleBasisFunction()
gradval.seed = Random().nextLong()
@@ -103,7 +117,7 @@ class StateNoiseTexGen : BasicGameState() {
}
fun generateNoiseImage() {
val noiseModule = noiseSmokyFractal() // change noise function here
val noiseModule = noiseBillowFractal() // change noise function here
noiseImage.graphics.background = Color.black
@@ -113,12 +127,12 @@ class StateNoiseTexGen : BasicGameState() {
}
}
for (i in 0..Terrarum.CORES - 1) {
for (i in 0..Terrarum.THREADS - 1) {
ThreadPool.map(
i,
ThreadRunNoiseSampling(
((imagesize / Terrarum.CORES) * i),
((imagesize / Terrarum.CORES) * i.plus(1)) - 1,
imagesize.toFloat().div(Terrarum.THREADS).times(i).roundInt(),
imagesize.toFloat().div(Terrarum.THREADS).times(i.plus(1)).roundInt() - 1,
noiseModule
),
"SampleJoiseMap"
@@ -135,6 +149,10 @@ class StateNoiseTexGen : BasicGameState() {
override fun getID() = STATE_ID_TOOL_NOISEGEN
override fun render(gc: GameContainer, sbg: StateBasedGame, g: Graphics) {
g.color = Color.red
g.drawString("Press SPACE to generate new noise", 8f, 8f)
g.drawString("CPUs: ${Terrarum.THREADS}", Terrarum.WIDTH - 90f, 8f)
for (sy in 0..imagesize - 1) {
for (sx in 0..imagesize - 1) {
val noise = noiseMap[sy][sx]

View File

@@ -9,6 +9,7 @@ import com.sudoplay.joise.module.*
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.concurrent.ThreadPool
import net.torvald.terrarum.gameactors.ThreadActorUpdate
import net.torvald.terrarum.gameactors.roundInt
import java.util.*
object WorldGenerator {
@@ -687,12 +688,12 @@ object WorldGenerator {
private fun processNoiseLayers(noiseRecords: Array<TaggedJoise>) {
if (Terrarum.MULTITHREAD) {
// set up indices
for (i in 0..Terrarum.CORES - 1) {
for (i in 0..Terrarum.THREADS - 1) {
ThreadPool.map(
i,
ThreadProcessNoiseLayers(
((HEIGHT / Terrarum.CORES) * i),
((HEIGHT / Terrarum.CORES) * i.plus(1)) - 1,
HEIGHT.toFloat().div(Terrarum.THREADS).times(i).roundInt(),
HEIGHT.toFloat().div(Terrarum.THREADS).times(i.plus(1)).roundInt() - 1,
noiseRecords
),
"SampleJoiseMap"