« 【Windows ストア アプリ】7月の認定要件の変更: アプリ内購入の説明が必須に #win8dev_jp #wpdev_jp | トップページ | ご案内 »

2014年9月23日 (火)

【Windows ストア アプリ開発】 画像は scale-100 が基本! しかし、 scale-100 を入れたくないときは…!? (あるいは「アプリ バンドルについて」)

Windows 8.1 のストア アプリでは、

  1. scale-100 の画像を用意するのが基本
  2. 高解像度デバイスの増加を考えると、scale-180 を追加しておくのが望ましい
  3. アプリ バンドルにしないのなら、 scale-100 を入れなくても OK


■ scale-100 の画像を用意するのが基本

これはいいですよね? VS2013 で Windows ストア アプリのプロジェクトを生成すると、自動的に scale-100 のタイルが生成されます。
これが基本です。

20140918_appbundletest02a


■ 高解像度デバイス対応

Windows ストア アプリの画像は、 次のスケールがサポートされてます。

80% ○オプション
100% ◎標準
140% ○オプション
180% ○オプション

で、 例えば Surface Pro 3 の画面は 2160×1440ピクセルになっていて、 scale-140 で表示されます。 また、 scale-180 で表示される機種もあります。

20140922_scaling01
※ 「Windowsの画面スケーリングを きちんと理解しよう」 p.13

それらの機種では、 scale-100 の画像を与えた場合は自動的に拡大表示されるわけですが、 それではボケた画像になってしまいます。

次の 2つの画像は、@IT の記事 「WinRT/Metro TIPS:解像度が変わっても画像をシャープに表示するには?[Win 8]」 より。

Metrotips009_03
※ scale-100 の画像が scale-180 に拡大された場合

Metrotips009_07
※ scale-180 の画像 (斜線や円弧のエッジに注目)

逆に、scale-180 を与えて、それが scale-140 に縮小されても、さほど気になりません。

というわけで、 「scale-180 を追加しておくのが望ましい」


■ アプリ バンドル

VS2013 で Windows ストア アプリのパッケージを作るとき、 デフォルトでは必要な場合にアプリ バンドルが自動的に生成されます。

アプリ バンドルとは何かというと、 1つのパッケージを複数に分割しておき、 デバイスに必要な部分だけダウンロードさせるものです。
これにより、 ムダなダウンロードを減らせます。

例えば、 「クラウディアさんタイマー」のアプリ バンドルを覗いてみると、 こんなふうです。
※ パッケージは zip ファイルになっています。 拡張子を .zip に変えてやれば、 エクスプローラーで中を覗けます。

◇ ストアにアップロードするパッケージ (*_bundle.appxupload)
20140923_appxbundle01a

◇ .appxbundle の中身
20140923_appxbundle02a
このアプリの場合は、4つのパッケージ (*.appx) が 1つにバンドルされています。

*_AnyCPU.appx は「アプリ パッケージ」/「メイン パッケージ」などと呼ばれます。
*_AnyCPU.appx は必ずダウンロードされます。 CPU 別にバイナリを作った場合は、 *_x86.appx パッケージや *_amd64.appx パッケージなどとなり、 デバイスの CPU に合ったメイン パッケージだけがダウンロードされます。

*_scale-180.appx や *_language-ja.appx などは「リソース パッケージ」と呼ばれます。 言語、画像スケール、Microsoft DirectX 機能レベルなどによって、 リソースがまとめられています。
これは、 デバイスが必要とするものだけがダウンロードされます。 例えば、 scale-140 のデバイスでは *_scale-140.appx を、 (メイン パッケージに追加して) ダウンロードします。

ここで、メイン パッケージの Assets フォルダーを覗いてみましょう。

◇ メイン パッケージの中身
20140923_appxbundle03a
メイン パッケージには、scale-140 や scale-180 の画像は含まれていません。
それらのスケールの画像は、 個別のリソース パッケージに入っています。

◇ scale-180 のリソース パッケージの中身
20140923_appxbundle04a

そして、 デバイスがサポートしていないスケールの画像のリソース パッケージはダウンロードしません。
この例では、 メイン パッケージは 4MB。 対して、 画像のリソース パッケージは、 それぞれ 500KB 超。 従来のパッケージだと 5MB 以上になったはずですが、 このバンドルならば、 例えば scale-100 のデバイスでは 4MB、 あるいは scale-180 のデバイスでは 4.5MB 強のダウンロードで済むわけです。

さて。

ということは、 scale-180 の画像だけを提供した場合には (メイン パッケージに入る画像はありませんから)、 scale-100 のデバイスには画像がインストールされない、 ということになります。

これはマズいですね。 そこで、 最新の VS2013 では、 そのような状態 (scale-180 の画像だけを提供) のときにパッケージを作ろうとすると、 (アプリ バンドルを自動生成する条件が満たされているときは) 次の画像のようにエラーとして弾くようになっています。
20140918_appbundletest08a

これを回避しつつ、 scale-180 の画像だけを提供したいときには、 強制的にアプリ バンドルを作らせないようにします。
20140918_appbundletest09a

ということで、 「アプリ バンドルにしないのなら scale-100 を入れなくても OK」 です。
(ただし、 ダウンロード サイズは大きくなる!)

※ ちなみに、 バンドルをアップロードすると、 自動的に (というか、勝手にw) 「年.月日.…」 という形式のバージョン番号が振られます。


■ アプリ バンドルを手動で作成する

不可能ではないっぽいです。
AppxBundleManifest.xml を手書きして、 メイン パッケージに scale-180 だけを含めるようにして、 バンドルを手動で作成すれば、 scale-180 の画像だけを提供するアプリ バンドルがたぶん出来上がるでしょう。

※ 自動生成された AppxBundleManifest.xml の例
20140918_appbundletest11a
(メイン パッケージには scale-100 が含まれるという記述になっている。 ここを 180 に書き換えれば…)

手動でバンドルを作る手順がなんだか超絶めんどくさそうだし、 AppxBundleManifest.xml の書式もよくわからないので、 お勧めはしません (っていうか、不毛な気がするw)。

MSDN: App packager (MakeAppx.exe)
MSDN: アプリ パッケージと展開 (Windows ランタイム アプリ)
MSDN: アプリのパッケージ化 - アプリ バンドル
MSDN: Block

|

« 【Windows ストア アプリ】7月の認定要件の変更: アプリ内購入の説明が必須に #win8dev_jp #wpdev_jp | トップページ | ご案内 »

プログラミング」カテゴリの記事

* プログラミング ( Metro スタイル )」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 【Windows ストア アプリ開発】 画像は scale-100 が基本! しかし、 scale-100 を入れたくないときは…!? (あるいは「アプリ バンドルについて」):

« 【Windows ストア アプリ】7月の認定要件の変更: アプリ内購入の説明が必須に #win8dev_jp #wpdev_jp | トップページ | ご案内 »