2017年11月5日日曜日

Fall CU - スプラッシュスクリーンをすっとばして起動速度を上げる

意識低めのFall Creators Update ガイド二つ目です。
FCUから、スプラッシュスクリーンの表示設定にAttirbute「optional」が追加になりました。

Windows Platform Uservoice の意見が採用された(貴重な)例でもあります。

Splash screen for UWP apps should be optional
https://wpdev.uservoice.com/forums/110705-universal-windows-platform/suggestions/9333255-splash-screen-for-uwp-apps-should-be-optional

使い方はとても簡単で、Package.appxmanifest のスプラッシュスクリーン定義でOptional="true"とするだけです。
参考のために、Package.appxmanifest の例を下に示します。24行目がそれです。

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5" IgnorableNamespaces="uap mp">
<Identity Name="55884DDLG.FCUTrial" Publisher="CN=0ADFD460-31D2-4A92-A4A8-DF66FF78B5F8" Version="1.1.1.0" />
<mp:PhoneIdentity PhoneProductId="f0696861-c4dc-44b1-87f7-97601f0c45c3" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
<Properties>
<DisplayName>FCU Trial</DisplayName>
<PublisherDisplayName>DDLG</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="App1.App">
<uap:VisualElements DisplayName="FCU Trial" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="App1" BackgroundColor="transparent">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png">
</uap:DefaultTile>
<uap:SplashScreen Image="Assets\SplashScreen.png" uap5:Optional="true" />
</uap:VisualElements>
<Extensions>
<uap5:Extension
Category="windows.appExecutionAlias"
Executable="App1.exe"
EntryPoint="App1.App"
>
<uap5:AppExecutionAlias>
<uap5:ExecutionAlias Alias="App1.exe"/>
<uap5:ExecutionAlias Alias="hogehoge.exe"/>
</uap5:AppExecutionAlias>
</uap5:Extension>
</Extensions>
</Application>
</Applications>
<Capabilities>
<Capability Name="internetClient" />
</Capabilities>
</Package>
丁寧に言うと、

  1. AppのMinVersion を 16299(FCU)以降に設定する
  2. Package.appxmanifest のPackage Element にネームスペース xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5" を追加する
  3. エレメント uap:SplashScreen に 属性 Optional="true" を追加する

です。

Optional="true" の効果


注意したいのは、これは「スプラッシュスクリーンをOFFにする」機能では無いことです。スプラッシュスクリーンを「Optional に」するよ!という機能です。
どういうことかというと…
アプリケーションの初期化が終わった時点でスプラッシュスクリーンが即閉じる、という動作になります(なのでスプラッシュスクリーンは「オプショナルな」動作だという事なのでしょう)。
このため、optional="true"であっても…アプリの初期化自体がモタモタしていると結局スプラッシュスクリーンはたっぷり表示されてしまいます。

「初期化」とはどのフェーズを言うのか…経験的には、「このスプラッシュスクリーンの扱いに関しては」App.xaml.csのアプリケーションクラスを抜けてページ表示に行った所で終わり、という感じに見えます(仕様で出ているかもしれませんが調べきれていないです、すみません)。一旦ページ表示まで行くと、例えばPage の OnNavigatedTo で幾ら時間がかかったところで今回のスプラッシュスクリーン表示には影響しません。

実例を動画で示します。


このアプリはVisual Studio 2017 のUWP Blankテンプレートほぼそのままです。
左から

  1. UWP App 既定(optional=false)
  2. optional=true
  3. optional=true, ただしApp.xaml.cs のOnLaunchedでディレイ1秒追加

です。
1) 一番左は、おそらくWindows 標準の電卓と同じ動作に見えます。Blank テンプレートそのままで初期化に時間大してかかっていないので、この状態でもスプラッシュスクリーン表示は一瞬で終わります。
2) は今回のoptional=true の場合です。即App画面に行っているのが分かります。
3) はtrueだけどウェイト1秒入っている場合です。この場合スプラッシュスクリーンはきっちりその分表示され続けるため、optional=trueの意味が全く無いという悲しい結果になっています。


※ 動画は TechSmith Camtasia で作っています。Microsoft MVP 特典として使わせてもらっています。こういった説明、チュートリアル用のスクリーンキャプチャからの動画作成には超便利です。アリガトウ(*´▽`*)




0 件のコメント:

コメントを投稿