« メニューの表示 | トップページ | 曲線の作図 »

2012年3月20日 (火)

ゴーストの再利用が出来ない

経路作成の時、一度作成した経路を一旦キャンセルして新たに作成し直すことが有ります。その際、既に生成していたゴーストをお蔵入りにしてしまうのはモッタイナイ気がして、再利用することを考えました。

removeChild() したゴーストを appendChild() する訳ですが、そのゴーストへのポインターを保持していないので、それを取得しなければなりません。普通、SVG 要素へのポインターの取得は document.getElementById() で行います。しかし、これはその要素が appendChild() されていなければ機能しませんが、再利用したいゴーストは今 removeChild() 状態なのでポインターの取得が出来ません。即ち、ゴーストを再利用するにはゴーストへのポインターを別途保持しておく必要が有るのです。

そもそも、ゴーストの再利用は、システムへの負荷(特にメモリ・フラグメンテーション)を防ぐのが目的です。FlatTable の予想される使用状況から判断して、ゴーストの無駄遣いは高々数十個と思われます。この僅かな無駄遣いを無くすために、廃棄したゴーストの管理にコストを掛けるのは気が進みません。最悪のケースだと無駄遣いに上限は無いので、それを考慮すれば多少のコストを掛けてでも再利用した方が良いのかも知れませんが、最悪のケースは考えないことにします。

// ゴーストを再利用しないコード
function makeGhost(ball){
    var baseBall = ball.baseBall;
    var n = ++(baseBall.nGhost);
    var id = baseBall.id + "g" + n;
    var ghost = baseBall.cloneNode(true);  // 新しいゴーストを生成
    ghost.setAttribute("id", id);
    ghost.setAttribute("opacity", 0.3);
    ghost.x = ball.x;
    ghost.y = ball.y;
    ghost.setAttribute("transform",
        "translate(" + ghost.x + "," + ghost.y + ")");

    ghost.baseBall = baseBall;
    ghost.prev = ball.prev;
    ball.prev = ghost;
    ghost.next = ball;
    ghost.prev.next = ghost;

    flattable.appendChild(ghost);
    addEvent(ghost, "click", ballClick);
    return ghost;
}

« メニューの表示 | トップページ | 曲線の作図 »

ビリヤードの配置図ソフト」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/584699/54266922

この記事へのトラックバック一覧です: ゴーストの再利用が出来ない:

« メニューの表示 | トップページ | 曲線の作図 »