157 lines
3.2 KiB
Go
157 lines
3.2 KiB
Go
|
package tilerendererjob
|
||
|
|
||
|
import (
|
||
|
"github.com/sirupsen/logrus"
|
||
|
"mapserver/app"
|
||
|
"mapserver/coords"
|
||
|
"strconv"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
func getTileKey(tc *coords.TileCoords) string {
|
||
|
return strconv.Itoa(tc.X) + "/" + strconv.Itoa(tc.Y) + "/" + strconv.Itoa(tc.Zoom)
|
||
|
}
|
||
|
|
||
|
func worker(ctx *app.App, coords <-chan *coords.TileCoords) {
|
||
|
for tc := range coords {
|
||
|
ctx.Objectdb.RemoveTile(tc)
|
||
|
_, err := ctx.Tilerenderer.Render(tc, 2)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Job(ctx *app.App) {
|
||
|
|
||
|
rstate := ctx.Config.RenderState
|
||
|
var totalLegacyCount int
|
||
|
var err error
|
||
|
|
||
|
if rstate.InitialRun {
|
||
|
totalLegacyCount, err = ctx.Blockdb.CountBlocks(0, 0)
|
||
|
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
fields := logrus.Fields{
|
||
|
"totalLegacyCount": totalLegacyCount,
|
||
|
"LastMtime": rstate.LastMtime,
|
||
|
}
|
||
|
logrus.WithFields(fields).Info("Starting rendering job")
|
||
|
|
||
|
} else {
|
||
|
fields := logrus.Fields{
|
||
|
"LastMtime": rstate.LastMtime,
|
||
|
}
|
||
|
logrus.WithFields(fields).Info("Starting rendering job")
|
||
|
|
||
|
}
|
||
|
|
||
|
tilecount := 0
|
||
|
|
||
|
lastcoords := coords.NewMapBlockCoords(rstate.LastX, rstate.LastY, rstate.LastZ)
|
||
|
|
||
|
jobs := make(chan *coords.TileCoords, ctx.Config.RenderingQueue)
|
||
|
|
||
|
for i := 0; i < ctx.Config.RenderingJobs; i++ {
|
||
|
go worker(ctx, jobs)
|
||
|
}
|
||
|
|
||
|
for true {
|
||
|
start := time.Now()
|
||
|
|
||
|
result, err := ctx.BlockAccessor.FindMapBlocks(lastcoords, rstate.LastMtime, ctx.Config.RenderingFetchLimit, ctx.Config.Layers)
|
||
|
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
if len(result.List) == 0 && !result.HasMore {
|
||
|
if rstate.InitialRun {
|
||
|
rstate.InitialRun = false
|
||
|
ctx.Config.Save()
|
||
|
|
||
|
fields := logrus.Fields{
|
||
|
"legacyblocks": rstate.LegacyProcessed,
|
||
|
}
|
||
|
logrus.WithFields(fields).Info("initial rendering complete")
|
||
|
}
|
||
|
|
||
|
time.Sleep(5 * time.Second)
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
tileRenderedMap := make(map[string]bool)
|
||
|
|
||
|
for i := 12; i >= 1; i-- {
|
||
|
for _, mb := range result.List {
|
||
|
//13
|
||
|
tc := coords.GetTileCoordsFromMapBlock(mb.Pos, ctx.Config.Layers)
|
||
|
|
||
|
//12-1
|
||
|
tc = tc.ZoomOut(13 - i)
|
||
|
|
||
|
key := getTileKey(tc)
|
||
|
|
||
|
if tileRenderedMap[key] {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
tileRenderedMap[key] = true
|
||
|
|
||
|
fields := logrus.Fields{
|
||
|
"X": tc.X,
|
||
|
"Y": tc.Y,
|
||
|
"Zoom": tc.Zoom,
|
||
|
"LayerId": tc.LayerId,
|
||
|
}
|
||
|
logrus.WithFields(fields).Debug("Dispatching tile rendering (z11-1)")
|
||
|
|
||
|
tilecount++
|
||
|
jobs <- tc
|
||
|
}
|
||
|
}
|
||
|
|
||
|
lastcoords = *result.LastPos
|
||
|
rstate.LastMtime = result.LastMtime
|
||
|
|
||
|
if rstate.InitialRun {
|
||
|
//Save current positions of initial run
|
||
|
rstate.LastX = lastcoords.X
|
||
|
rstate.LastY = lastcoords.Y
|
||
|
rstate.LastZ = lastcoords.Z
|
||
|
rstate.LegacyProcessed += result.UnfilteredCount
|
||
|
}
|
||
|
|
||
|
ctx.Config.Save()
|
||
|
|
||
|
t := time.Now()
|
||
|
elapsed := t.Sub(start)
|
||
|
|
||
|
if rstate.InitialRun {
|
||
|
progress := int(float64(rstate.LegacyProcessed) / float64(totalLegacyCount) * 100)
|
||
|
|
||
|
fields := logrus.Fields{
|
||
|
"count": len(result.List),
|
||
|
"processed": rstate.LegacyProcessed,
|
||
|
"progress%": progress,
|
||
|
"X": lastcoords.X,
|
||
|
"Y": lastcoords.Y,
|
||
|
"Z": lastcoords.Z,
|
||
|
"elapsed": elapsed,
|
||
|
}
|
||
|
logrus.WithFields(fields).Info("Initial rendering")
|
||
|
|
||
|
} else {
|
||
|
fields := logrus.Fields{
|
||
|
"count": len(result.List),
|
||
|
"elapsed": elapsed,
|
||
|
}
|
||
|
logrus.WithFields(fields).Info("incremental rendering")
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|