トップMy OpenStreetMap > マルチスレッド・レンダリング

マルチスレッド・レンダリング

はじめに

レンダリングはマルチスレッドで行う。スマホ画面には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();
                }
            }
        }
    }

}