レンダリングはマルチスレッドで行う。スマホ画面には8~12タイルが表示される。 タイルのレンダリングは独立しているため、並列処理はやりやすい。 しかし、マルチポリゴンのレンダリングやパターンによるポリゴン塗りつぶしなどではワークエリアが必要となる。
これらのワークエリアを class TileToRenderer で管理している。
Tile にワークエリアを置けばプログラムは分かりやすいが、メモリ使用量が増大する。
public class RenderThread extends Thread {
final static int NumThreads = 8;
final static Thread[] threads = new Thread[NumThreads];
static boolean run;
int thread_number;
Renderer renderer;
Map map;
public RenderThread(Map map, int num) {
this.map = map;
this.thread_number = num;
this.renderer = new Renderer(map, num);
System.out.printf("RenderThead #%d ready.\n", num);
}
public void run() {
run = true;
while (run) {
Tile tile = Tile.getRequest(map.src, map.zoom);
if (tile != null) {
tile.status = Tile.Status.busy;
renderer.render(tile);
tile.status = Tile.Status.ready;
map.invalidate();
} else {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}