2015年4月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
無料ブログはココログ

« MOON で使い回しの効く GUI の作り方? | トップページ | 新規 strokes データの正式な追加登録手続きが分からない »

2014年4月10日 (木)

世代別 JSON ?, JSON 階層化 ?

MOONPhase ver.2.9.0 に update しました。

課題が消失したわけではなないでしょうが、レスポンスの向上は純粋に素晴らしい。

それはともかく。

一から書きなおしたという内部コードを理解することはかなわないとして、趣味プロ屋としては、API の brush up と、データ・オブジェクトの構成変更が気になります。

早速手書きしたページのデータを覗いてみると、backing データは、従来 info.json だけであったところが、info.json, canvas.png, strokeX.json に分かれています。

また、ページのトップディレクトリ内に screenshot.jpg, と thumb.png が追加されています。

Genjson_2

 

つまり、従来、手書きデータは JSON 形式でのベクトルデータで全てを保持していて、それは info.json 内に含まれていました。ページを開くたびに info.json を読み込んで、ベクトルデータを解釈して描画するしかなかったわけです。

今回のファイル構成だと、info.json を開くと、その中に strokeX.json へのリンクが記録されています。これだけで、まず、問答無用で読み込まなければならない情報量が減りました。そして、状況に応じ、手書きデータの追加・削除がなければ、screenshot.jpg (あるいは backing と、全てのシールの canvas.json の積算) を表示し、ベクトルデータの編集が必要な場合だけ strokeX.json を読み書きするのでしょう。

なるほど、ページ表示だけでも明らかに速くなるはずです。

上記の構成だけ見ると、JSON ファイル (或いは、データファイル) の階層化と表現した方が分かりやすいような気もします。

但し、まだまだ情報がなくてわからないのですが、手書きで stroke1.json に格納されたベクトルデータは、必ずしも即時に *.png なラスタデータに変換されるわけでなく、スリープ時や、何も操作をしていない時に、バックグラウンドで徐々に処理されていくはずです。そうすると、タイミングによって、既にラスタライズの済んだ stroke データと、まだ処理されていない stroke データを区別する必要があるので、恐らく stroke0.json と stroke1.json のような形で、storokeX.json がいくつかできて処理が進んでいくのでしょう。

「世代別 JSON」という表現が、どこまでを含むのか分かりませんが、他のファイルの関係を見ると、この strokeX.json の範囲を差しているのだと思います。ラスタライズ済みのものから、最新の手書きされたばかりのものまで、何世代分にも分ける方法もあるでしょうが、恐らく「世代別」という言葉が「世代別ガーベジコレクション」からの流用であろうこと、世代別ガーベジコレクションで 5 世代も 10 世代も分類するようなものは聞かないことから、2 から、せいぜい 3 世代くらいでパフォーマンスが出せるのだろうと推測します。

さて、従来 strokes データ(手書きのベクトルデータ)を扱うプログラムでは、

var page = MOON.getCurrentPage();
var backing = page.backing;
var paperJSON = MOON.getPaperJSON( backing );
var strokes = paperJSON.strokes;

という形で strokes データを取得していましたが、新しい info.json には strokes オブジェクトが含まれていません。どうやって、外部リンクされている strokesX.json のデータを取得すればよいのか、と、ver.2.9.0 版の暗号化シールのコードを読んでいますと、今後はどうやら以下の形でアクセスできるようです。

var page = MOON.getCurrentPage();
var backing = page.backing;
var strokes = MOON.getStrokeJSON( backing );

という tweet を踏まえると、ver.2.9.0 で MOON.getPaperJSON( backing ) を使用すると、新しい info.json の内容に、strokeX.json の内容を組み込んだ JSON を新しく作成し、それを返すように内部で wrap しているのでしょう。同じように、MOON.setPaperJSON( backing, papaerJSON ) すると、内部で strokeX.json に書き出して、外部リンクを張るのだと思います。互換性は保たれますが、直接 MOON.getStrokeJSON(), MOON.setStrokeJSON() を call した方が、効率がよいわけですね。

ver.2.9.0 版の暗号化シールのコードには、他にも、stickerStorage.getItem(), stickerStorage.setItem() という記述も見られます。

「お、これは、Issue Tracker 148 の、シール固有データの保存 API が実装されたか」と喜んで、固有データの保存先を探したのですが、わかりません。てっきり、各シールの directory 内に、storage.json が作成されるのだと思ったのですが。これについては、技術データの公開を待つことにします。

さて、動かなくなったシールをバージョンアップすることにしましょう。すぐできればよいのですが。

« MOON で使い回しの効く GUI の作り方? | トップページ | 新規 strokes データの正式な追加登録手続きが分からない »

enchantMOON」カテゴリの記事

コメント

コメントを書く

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

トラックバック

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

この記事へのトラックバック一覧です: 世代別 JSON ?, JSON 階層化 ?:

« MOON で使い回しの効く GUI の作り方? | トップページ | 新規 strokes データの正式な追加登録手続きが分からない »