mirror of
https://bitbucket.org/s_l_teichmann/mtsatellite
synced 2025-07-03 00:20:48 +02:00
When an tile is rendered the writing to disk can be done in background
concurrently to the rendering of the next tile.
This commit is contained in:
@ -30,10 +30,29 @@ func createTiles(
|
||||
jobs chan blockPos,
|
||||
done *sync.WaitGroup) {
|
||||
|
||||
defer done.Done()
|
||||
defer btc.Close()
|
||||
wFns := make(chan func() (bool, error))
|
||||
|
||||
// Writing already rendered tiles to disk can be done in background.
|
||||
go func() {
|
||||
for wfn := range wFns {
|
||||
if _, err := wfn(); err != nil {
|
||||
log.Printf("WARN: writing file failed: %v.\n", err)
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
defer func() {
|
||||
close(wFns)
|
||||
btc.Close()
|
||||
done.Done()
|
||||
}()
|
||||
|
||||
for job := range jobs {
|
||||
btc.CreateTile(job.x-1, job.z-1, job.i, job.j)
|
||||
if err := btc.RenderArea(job.x-1, job.z-1); err != nil {
|
||||
log.Printf("WARN: rendering failed: %v.\n", err)
|
||||
continue
|
||||
}
|
||||
wFns <- btc.WriteFunc(job.i, job.j, nil)
|
||||
}
|
||||
}
|
||||
|
||||
@ -77,7 +96,7 @@ func createBaseLevel(
|
||||
btc := common.NewBaseTileCreator(
|
||||
client, colors, bg,
|
||||
int16(yMin), int16(yMax),
|
||||
transparent, baseDir, nil)
|
||||
transparent, baseDir)
|
||||
go createTiles(btc, jobs, &done)
|
||||
}
|
||||
|
||||
|
@ -213,9 +213,9 @@ func (tu *tileUpdater) doUpdates() {
|
||||
btc := common.NewBaseTileCreator(
|
||||
client, tu.colors, tu.bg,
|
||||
tu.yMin, tu.yMax,
|
||||
tu.transparent, baseDir, bth.Update)
|
||||
tu.transparent, baseDir)
|
||||
done.Add(1)
|
||||
go tu.updateBaseTiles(jobs, btc, &done)
|
||||
go tu.updateBaseTiles(jobs, btc, &done, bth.Update)
|
||||
}
|
||||
|
||||
for i := range changes {
|
||||
@ -338,19 +338,42 @@ func (tu *tileUpdater) updatePyramidTile(scratch, resized *image.RGBA, level int
|
||||
|
||||
func (tu *tileUpdater) updateBaseTiles(
|
||||
jobs chan *xzc,
|
||||
btc *common.BaseTileCreator, done *sync.WaitGroup) {
|
||||
btc *common.BaseTileCreator,
|
||||
done *sync.WaitGroup,
|
||||
update common.BaseTileUpdateFunc) {
|
||||
|
||||
type jobWriter struct {
|
||||
job *xzc
|
||||
wFn func() (bool, error)
|
||||
}
|
||||
|
||||
jWs := make(chan jobWriter)
|
||||
|
||||
go func() {
|
||||
for jw := range jWs {
|
||||
updated, err := jw.wFn()
|
||||
if err != nil {
|
||||
log.Printf("WARN: writing tile failed: %v.\n", err)
|
||||
}
|
||||
if !updated {
|
||||
jw.job.canceled = true
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
defer func() {
|
||||
close(jWs)
|
||||
btc.Close()
|
||||
done.Done()
|
||||
}()
|
||||
|
||||
defer btc.Close()
|
||||
defer done.Done()
|
||||
for job := range jobs {
|
||||
xz := job.dequantize()
|
||||
//log.Printf("%d/%d %d/%d", x, z, job.X, job.Z)
|
||||
updated, err := btc.CreateTile(xz.X-1, xz.Z-1, int(job.X), int(job.Z))
|
||||
if err != nil {
|
||||
log.Printf("WARN: create tile failed: %s\n", err)
|
||||
}
|
||||
if !updated {
|
||||
if err := btc.RenderArea(xz.X-1, xz.Z-1); err != nil {
|
||||
log.Printf("WARN: rendering tile failed: %v.\n", err)
|
||||
job.canceled = true
|
||||
continue
|
||||
}
|
||||
jWs <- jobWriter{job, btc.WriteFunc(int(job.X), int(job.Z), update)}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user