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:
Sascha L. Teichmann
2017-03-06 15:43:30 +01:00
parent 2cba483d32
commit 6a1356f0eb
5 changed files with 118 additions and 58 deletions

View File

@ -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)}
}
}