2018年5月24日木曜日

UWP App の Multi Instance サポート その1

Windows 10 April 2018 Update (1803, RS4)からUWP App がMulti Instance、いわゆるアプリの複数起動をサポートするようになりました。実は今迄使えなかったんですね。

(This post is part 1 of the series - UWP Multi Instance Support.)
UWP Multi Instance support - Part 2, sample app and source
https://ddlgjp.blogspot.com/2019/03/uwp-app-multi-instance-2.html


まずは実際動かして試してみましょう。拙作のUWP App Wheel World Clockが既にMulti Instance に対応しています。


UWP App を複数起動している様子


Microsoft からダウンロード
Wheel World Clock ダウンロードはこちらからどうぞ

タスクマネージャーを見ると、実際にインスタンスが複数作成されているのがわかります。またこのアプリはちょっと仕込みが入っていて、文字盤の画像貼り換えを行うと他インスタンスに設定変更が通知されるようになっています。





ただ…Windows、Desktop上でAppを普通に使っている身からすると、

  • 「アプリが同時起動」って当たり前なのでは?
  • 今迄なんでできなかったの?
  • 2018年になって今更?

という疑問が湧くのは当然…という気がします。そこで、Multi Instance をキーにしてApp Model発展の経緯を俯瞰し、なんとなく分かった気になってみようというのが今回の記事です。


  • その1 UWP App Model の経緯と今回のMulti Instance対応、今後の展望 (この記事)
  • その2 Multi Instance 実際の対応作業と注意点


という予定です。

StoreApp / UWP App Model の変遷


Win8 - Single Instance, Single View (2012)


現在のUWP App の源流となるWin8 StoreApp、またそれの元となったWindows Phone環境は別名「Immersive UI」、没入型UI等と言われていました。タブレットやPCの画面「全体」をアプリが占有するイメージです。この環境では所謂デスクトップそのものが存在せず、あるアプリが同時に起動できるのは一つだけになっていました。
また、Immersive UIではこの当時から画面分割、Splitをサポートしていましたが、Win8の頃は「別アプリ同士」で画面を分割する形でした。


Win8/8.1 用 StoreApp 拙作のfuta8 です。
配布は終了しています。



Win8.1 - Single Instance, Multi View (2014)


"Multi View"がサポートされました。同時起動できるアプリのInstance
は引き続き一つだけですが、そこから複数の「View*1」を別スレッドで持つことが出来るというものです。画面分割に対し、一つのアプリが複数のViewを同時に表示できるようになりました。ただこの頃はStore AppでMulti Viewをサポートしたものは少なかったように記憶しています。


Win10 - Single Instance, Multi Window (2015)


「Immersive」の看板はそっと後ろに下げられ、Win10 UWP Appはデスクトップ上「でも」普通に使えるものとして再定義され、これまでの「View」が「Window」としてデスクトップ上に表示されるようになりました。Tablet / Phoneに軸足を置いたApp Modelから、デスクトップ / Win32 App と一緒に使える方向に大きく舵を切り直したのが Win10 UWP Appと言えると思います。

ただ、Win8.1 のSingle Instance なモデルは維持されました。プロセス自体の仕組みはそのままで、所謂Multi Window な動作を実現するためにはMulti Viewが引き続き使われていました。


Win10 UWP App F10 Image bbs browser
右がスレ・カタログを扱うメインウインドウ、
左の二つがスレ画像を表示する画像ウィンドウ、のMulti Viewを使っています。


MultiView を採用している、おそらく一番馴染みのあるUWP App は…Win10標準の「電卓」だろうと思います。一見複数起動しているように見えるのですが、実はプロセスとしては一つだけです。なお、電卓はRS4でもこの仕組みのままです。*2


UWP App「電卓」のMulti View動作
一見沢山起動しているように見えるけどInstanceは一つだけ
「起動」の度に一つのInstanceのOnLaunchedが呼ばれ、その都度Window(View)を作成しています。



このように、対応すればそれなりに色々な事が出来るMulti Viewですが…過剰というかオーバーキルというか、マルチスレッドの実装が大袈裟過ぎるという弱点があります。
上の例のF10 image bbs browser のような、Window一枚がドキュメント一つに対応しているSDI / MDI的なアプリならば頑張る価値はあるのですが、

  • 電卓のように、単に複数起動したい → 素直にMulti Instanceでいいのでは?
  • メインウィンドウの脇にサブウィンドウを表示したい → 同一スレッドでポンとWindow出したい…マルチスレッドにするほどでも無い…

という具合で、実際 Win10 UWP App でもMulti View を使っているアプリは少ないです。*3


また、Win10 UWPでは「ContentDialog」が追加になりました。Desktop+Window化に伴い、「簡単に使える」Win32のモーダルダイアログ的な物を狙ったのかもしれません。しかし、これはこれでアプリ画面の真ん中に固定で表示されるだけでした。帯にも襷にも短すぎた感じです。


アプリ情報をContent Dialog で表示している様子
表示位置はアプリ表示領域の中心固定です。
Win32 Appで良くある、入力用サブウィンドウやツールウィンドウをポンと自由な位置に出すというのが
実はUWP Appでは結構面倒なんですね。


このように、「一応」Desktop 上でWin32 App っぽく動く最初の一歩は踏み出したものの、Win32 Appで普通にやっていたようなMainWindow + ToolWindowものを気軽に書けるには至りませんでした。*4


こういうサブウィンドウをぽこぽこ出すスタイルが、
今…RS4までのUWP Appでは書くのが大変


Win10 RS4 - Multi Instance, Multi Window (2018)


前のセクションで上げたうちの前者、「単に複数起動したい」…電卓系を叶えるのがRS4 で導入された Multi Instance、と考えると理解しやすいです。Opt-In 形式になっており、MultiInstance を使う!とAppxManifest で宣言したアプリのみがMulti Instanceになります。
実際の対応作業や注意点等詳しい所は次の記事にまとめる予定ですが、Multi Instance 対応が期待されるUWP Appを考えると…以下のような使い方に向いているかなと思います。


  • 電卓系、シンプルアプリ
  • 他のWin32 Appから起動して使うもの … 起動=新インスタンス生成、タスク終了でインスタンスも消える、でないとWin32ものと仲良くしづらい所があります。そしてこれはMultiViewで救える話でもありません。
  • Sets … Sets で複数タブ表示を行いたい場合、Multi Instance 対応が必要です。



Win10 RS5 以降



今後どうしていくつもりなのか、2018年5月の開発者会議 Build2018でチラ見せがありました。上の例で挙げた後者、「メインウィンドウの脇にサブウィンドウを表示したい」系のMultiWindow AppをMulti View無しで簡単に記述できるようになるのだそうです。





こういう、サブウィンドウをメインウィンドウの外に出して
自由に配置可能なもの

MultiViewでは無くこういう形で簡単に書ける

ただ、Win32のDesktop Window Modelをそのまま再発明しても仕方ないので
WindowingEnvironment でDevice Familyでの差を吸収する
今だと、Hololens / Windows MRが特にWindowingとして
普通のDesktopとは異なる扱いが必要になりそうです。

それそれのDeviceにあった形のWindowing
"That new thing" … さて…

左が「2018年夏」予定のアイテム
予定は予定

予定通りなら、左の「2018 Summer」がおそらくRS5でしょう。ただしあくまでも予定です。Buildでの発表後にスケジュール変わった例はこれまでも多いです。


次の記事では、Multi Instance 対応 を実際の作業に即して書いてみます。



*1) 元がImmersive UI だった経緯もあり、WinRT APIでは「Window」という単語はあまり使われないです。
*2) このあたり、Multi Viewの解説とサンプルコードを以前Stack Overflow に載せた事があるので興味があればどうぞ。…今回の記事は、この2015年当時の回答を現状に即して書き直したような所があります。

Multiple instances of a Windows Universal App (Windows 10)
https://stackoverflow.com/questions/32807090/multiple-instances-of-a-windows-universal-app-windows-10/

*3) なおUWP Appとして扱われる事の多いEdge Browser ですが、アプリケーションとしての成り立ちは他のUWP Appとは全く異なっており、タブ毎に独立したプロセスが走っています。現在我々開発者が使う事の出来るUWP AppModelでこういうものを作る事はできません。出来るのは現在の所Microsoft だけです。また、Edge の仕組みをUWP App Genericに使えるように仕立て直したのが「Sets」と呼べるかもしれません。
*4) Win10の当初、2015年末まではWindows 10 Mobile がまだ…まだ生きていたため、そういう意味ではImmersive Deviceへの軸足を残していた…のかもしれないですね。その後2016年になるとWindows 10 Mobile への投資はパタリと途絶え、緩慢な死へと向かっていったのはご存知の通りです。

DDLG: Windows 10 Mobile について 
https://ddlgjp.blogspot.jp/2017/04/windows-10-mobile.html


0 件のコメント:

コメントを投稿