Asynchronous Capture Screen on Unity 2019.3

Unity 2019.3から、あれこれ自作せずともやっと、ようやく、悲願の非同期スクリーンキャプチャが出来るようになりました。

前提知識として、Unity APIの呼び出しは、一部のAPIを除いてメインスレッドからの呼び出しのみが許可されています。レガシーな同期アプローチは検索すると吐いて捨てるほど出てくるのでそっちを見てください。

スクリーンキャプチャの流れは3工程あり、バージョンアップを経て段階的に非同期可能になっています。

  1. レンダーテクスチャのシステムメモリへの読み戻し
  2. 画像ファイルフォーマットへのエンコード
  3. ファイル書き込み

1は、ScreenCapture.CaptureScreenshotIntoRenderTexture が2019.1で追加され、ようやく非同期でシステムメモリに読み戻せるようになりました。

1で読み戻したメモリはレンダーテクスチャに指定したフォーマットのバイト配列(NativeArray<byte>)ですが、これを一般的な画像ファイルフォーマットにエンコードするには 2017.1から追加されているImageConversionクラスのAPI、ImageConversion.EncodeToPNG など(フォーマット別)を使用します。しかし、これは引数にバイト配列ではなくTexture2D を要求する上に、メインスレッドのみ呼び出し可能なので同期処理を避けられません。
流石に使えないAPIだと思ったのか、2019.3 でバイト配列(byte[])を使用する ImageConversion.EncodeArrayToPNG が追加されました。リファレンスにも”This method is thread safe.”と書かれていて、メインスレッド以外からの呼び出しを許可しているFreeFunctionアトリビュートがついています。

3は、.Net APIで以前から非同期可能です。

これらを組み合わせれば、”ほぼ”非同期にスクリーンキャプチャを行えます。

 

今後改善して欲しいところ。

  • ScreenCapture.CaptureScreenshotIntoRenderTexture リファレンスのサンプルコードが間違っている。
    using (var imageBytes = request.GetData<byte>()) で使用されているが、ユーザがこのNativeArrayに対してusingや明示的なDisposeの呼び出しを行うと、例外が出力される(InvalidOperationException: The NativeArray can not be Disposed because it was not allocated with a valid allocator.)。AsyncGPUReadbackRequest が管理しているはず?
  • NativeArray<byte>からbyte[]の変換をメインスレッドで行う必要があるが、そこで巨大なマネージドメモリのアロケートが走る。
    NativeArray<byte>のまま処理するAPI、つまりJob System with Burstでエンコードを行って欲しい。
  • ImageConversion.EncodeArrayToPNG のエンコード済みバイト列として巨大なマネージドメモリのアロケートが走る。
    必要メモリ量の計算と、事前確保したメモリを使用するAPIが欲しい。NativeArrayでの非同期ファイル読み書きをサポートして欲しい。
  • ImageConversion.EncodeArrayToPNG は出力フォーマットの指定ができない。つまり入力フォーマットと出力フォーマットは同一になる。また、RGBAのデータをRGBしかもたないJPGにすると、rowBytesを指定してもRGBAからRGBへ変換してくれないようだ。
  • 上下が反転している。グラフィクスAPI依存?ImageConversion.EncodeToPNG はTexture2D の段階でそれが打ち消されている?
    ユーザが面倒を見るべき処理ではないので、内部で処理して欲しい。

THE IDOLM@STER SHINY COLORS Summer Idol 2019

TL;DR
シャニマス運営様へ。パブリックな情報源で人気投票まがいのことをするということは、誰でもそれを情報収集できるということを理解していますか?

前書き

SUMMER PARTY 2019、お疲れ様でした。

アイドルマスターシャイニーカラーズ (シャニマス)では、サマーキャンペーン施策の一つとして「サマーアイドル2019」と題して、2019年7月31日15時頃から2019年8月25日末までツイッターキャンペーンが行われました。

これはそのキャンペーンの詳細な統計情報を公表…する予定でしたが、いきなりそんなことをやる必要も無かったので控えています。

キャンペーンサイトURL: https://campaign-shinycolors.idolmaster.jp/summer2019/index.html

注意

  • 非公式の独自調査に基づく内容です。公式の集計とは手法および結果が異なっている可能性があります。

動機

  • シャニマスだいすきな12年来P
  • 技術的好奇心
  • 今回のキャンペーンとその特典に対する問題提起
    • 今回のキャンペーンは、誰でも調査可能な公開された情報である。
      • 公開されている順位情報例
        • Pカップ(ゲーム内イベント)
        • 各種ツイートキャンペーン
      • 半公開されている順位情報例
        • ファミ通アンケート(誌面掲載)
      • 非公開の順位情報例
        • 各種公式アンケート
        • 各種ゲーム内プレイ情報
    • アイドルマスターコンテンツではアイドルの順位付け、特にアイドル全員の順位を公表することはタブーとされる傾向があるが、シャニマスではこれまでのPカップやツイートキャンペーンをはじめとする公開された情報よりそれが可能である。運営側にアイドル全員の順位付けを行っていく姿勢が見られる
    • 今回のキャンペーンはツイート数上位3名のアイドルが抽選プレゼントとなる。
      •  応募方法・条件にはそれら上位3名のアイドルにツイートを行っているという条件はなく、上位3名以外の担当アイドルへのみツイートを行うことでも当選可能のはずである。 当選した場合、担当外のアイドルがプレゼントとなる
        • 目当てのアイドルを報酬とするために順位を競わせる意図があると思われる。中間発表で途中順位を明らかにしたことが、それを裏付けている。
        • 一方、シンデレラガールズのシンデレラガール総選挙に関連した過去のアニバーサリーイベントでの物理報酬は、好きなアイドルを指定することが可能だった。

キャンペーン情報

キャンペーン情報URL: https://campaign-shinycolors.idolmaster.jp/summer2019/campaign/index.html

9月20日15時の時点でキャンペーンページが削除される予定のため、以下引用

参加方法

夏ならではのシチュエーションを選んでアイドルたちを輝かせよう!!
1. 輝かせたいアイドルを選ぶ
2. シチュエーションを選ぶ
3. ツイートして輝かせる

キャンペーン特典

アイドルを輝かせて豪華特典を獲得しよう!

キャンペーン1 抽選プレゼント

キャンペーン期間内に「ツイートして輝かせる」より#サマーアイドル2019をつけてツイートして頂いた方の中から抽選で3名様に、この夏特に輝いたアイドル3名の描き下ろしイラスト入りサイン色紙をプレゼント!!

キャンペーン2 全員プレゼント

ハッシュタグ #サマーアイドル2019 のツイート数に応じて、ゲーム内アイテムをプレゼント!!

全員プレゼント
  • 1万ツイート
    • フェザージュエル x300
    • ブロンズトレーニングチケット x5
    • 銀の羽 x5
  • 2.83万ツイート
    • シルバートレーニングチケット x5
    • リカバリーソーダ1/2 x5
    • 金の羽 x3
  • 4.12万ツイート
    • 限定プロデュースアイテム x2
    • ゴールドトレーニングチケット x5
    • プラチナの羽 x1
    • リカバリーソーダMAX x5

キャンペーン1 抽選プレゼントの注意事項

抽選プレゼントの注意事項
  • ◆キャンペーン内容
    • キャンペーン期間中、「#サマーアイドル2019」とハッシュタグをつけてツイートをしていただいたアカウントの中から、抽選で3名様に「描き下ろしイラスト付きサイン色紙」をプレゼントいたします。
  • ◆賞品・当選者数
    • 描き下ろしイラスト付きサイン色紙 計3名様
      ※本描き下ろしイラスト付きサイン色紙に描かれるアイドルは、キャンペーン期間中「このアイドルを輝かせる」ボタンより投稿されたツイート数の多い順に3名となります。
      ※本描き下ろしイラスト付きサイン色紙の内容は全て同一となります。
  • ◆キャンペーン期間
    • 開催中~2019年8月25日(日)23:59まで
  • ◆応募方法
    • STEP1:アイドルマスターシャイニーカラーズ公式Twitterアカウントをフォローしてください。
    • STEP2:「#サマーアイドル2019」のハッシュタグをつけて、上記キャンペーン期間中にツイートしてください。
    • STEP3:応募完了です。
      当選された方にはTwitterのダイレクトメッセージにてお知らせいたします。
  • ◆応募条件
    • ・Twitterアカウントをお持ちの方に限ります。
    • ・国内在住の方に限ります。
    • ・アイドルマスターシャイニーカラーズ公式Twitterアカウントをフォローのうえ、「#サマーアイドル2019」のハッシュタグをつけて、キャンペーン期間中にツイートしていただいた方に限ります。
  • ◆抽選・当選者発表
    • ・応募期間終了後、当選のご連絡をいたします。
    • ・当選された方には、応募で利用されたTwitterアカウントへ
      DM(ダイレクトメッセージ)にて当選通知等を送信いたします。
    • ・当選された方は、賞品発送のため、バンダイナムコエンターテインメント公式ファンサイト「Side-876倶楽部」への会員登録(登録無料)が必要です。なお、登録期限までに登録いただけない場合、当選は無効となります。
      ※登録完了後にお届け先情報を変更することはできません。
      ※お届け先情報の不備またはお客様の都合(不在、転居等)で賞品をお届けできない場合、当選は無効となります。
      ※賞品のお届け先は日本国内に限ります。
      ※賞品のお届けは2019年9月下旬頃を予定しておりますが、事情により変更となる場合があります。
  • ◆その他の注意事項
    • ・本キャンペーンは、予告なく変更、中止する場合があります。
    • ・本キャンペーンに応募する場合には、Twitterの利用規約またはルール等に従ってください。
    • ・複数のTwitterアカウントを利用して応募した場合、お客様は当選資格を失います。
    • ・当選資格、または賞品の転売、譲渡または換金を禁止します。
    • ・お客様が不正行為等を行ったと弊社が判断した場合、当選は無効となります。
    • ・弊社の責に帰すべき事由によりお客様が損害を被った場合の弊社の賠償責任は、当該損害に関係する賞品の市販価格(市販されていない場合は賞品の原価相当額)を上限とします。
      ただし、弊社の故意または重大な過失に起因する損害については、この限りではありません。
    • ・お客様が未成年者の場合、法定代理人(親権者等)の同意を得てから本キャンペーンにご参加ください。
    • ・パケット料金などの通信料はお客様のご負担となります。
    • ・本キャンペーンは株式会社バンダイナムコエンターテインメントが実施するものであり、本ゲームを配信するストアの運営会社はその実施に関与していません。
  • ◆個人情報◆
    • お預かりした個人情報は、プレゼントの発送およびそのサポート業務のために使用します。
      なお、個人情報の取り扱いの詳細につきましては、こちらをご参照ください。
      https://www.bandainamcoid.com/portal/privacyPolicyNew
      ※本ページに記載されている会社名・製品名は、各社の商標または登録商標です。

キャンペーン2 全員プレゼントの注意事項

全員プレゼントの注意事項
  • ◆キャンペーン内容
    • キャンペーン期間中、「#サマーアイドル2019」とハッシュタグをつけてツイートを行うことで対象ツイート数が加算されます。
      キャンペーン期間中に投稿された対象ツイートの累計数に応じて、上記ゲーム内アイテムを、対象の方全員にゲーム内でプレゼントさせていただきます。
  • ◆キャンペーン期間
    • 開催中~2019年8月25日(日)23:59まで
  • ◆その他の注意事項
    • ・本キャンペーンは、キャンペーン終了時の対象ツイートの累計数に応じてプレゼントの内容が変わります。
    • ・対象ツイートの累計数は、「#サマーアイドル2019」とハッシュタグをつけられたツイートの累計数となります。
    • ・プレゼントは2019年8月30日15:00以降、ゲーム内にてお一人様1回のみお受け取りいただけます。
    • ・本キャンペーンの対象者は、2019年8月30日15:00までにチュートリアルを終了している方かつ、プレゼント配布日程後にログインをした方全員となります。
    • ・本キャンペーンのプレゼント受取期間は、2019年9月30日14:59までとなります。受取期間終了後はプレゼントをお受け取りになれませんのでご注意ください。
    • ・お客様のご利用環境によって本キャンペーンをご利用いただけない場合があります。
    • ・本キャンペーンの内容は予告なく終了または変更になる場合があります。
    • ・本キャンペーンに参加する場合には、Twitterの利用規約またはルール等に従ってください。

統計だったもの

もう一度述べますが、公開されている情報なので誰でも集計することが出来ます。
今回は数値やラベルは全て伏せて14ラベル分に留めていますが、次のように数や推移を統計情報として求められます。

シンデレラガール総選挙では、出口調査と称して同じようなことが行われています。シャニマス運営はその1/10規模の人数のシャニマスでもそういうことをやって欲しいということなんでしょうか。

考察だったもの

ノーコメント。

Lorelai #1 The Princess of Maggots?

ひとまずクリアしてみたけれど、The Cat Lady (TCL)のように強いメッセージ性のあるストーリーというわけでもなく、Downfallのように強い狂気があるわけでもなく、その中庸という感じかなあ。とはいえ、結構バッド寄りの終わり方で、色々と各所の結末が変わりそうな判断を求められるところがいくつかあったので、その辺をもう少し網羅してみないと何とも言えないところ。

過去作でThe Queen of Maggots (QoM)の別名がLorelaiだということが判明しているので、今作の主人公であるLorelaiとQoMについての関係性を掘り下げる話がメインストーリーとなるのかなと事前段階では予想していたのだが、そうでもなかった。これまた、選択によってはよりその核心に踏み込むこともあるのかもしれないが、相変わらずはぐらかされてよく分からないという感じ。

続きを読む →

Tacoma #1 Fullbrightness

数あるWalking Simulatorの中でも、同じ開発元だけあってGone Homeに通ずるところは多い。大体はGone Homeで体験していることなので、新鮮味には欠く。
家に誰もいない秘密を探る代わりに無人になった宇宙ステーションの謎を探るというプロット。Gome Homeは別の人の青春を垣間見る青臭さのあるストーリーで人を選ぶ内容だったが、Tacomaでは割と万人向けになった印象を受ける。

最初のうちは、主人公が何をしているのかもよく分からず、ステーション内の状況もクルーが誰が誰なのかもよく分からないまま進めることになるので結構混乱したが、そのあたりが明らかになってきて把握できるようになってくると楽しい。
クルーの役割や性格が分かってくるとそれぞれの人物に感情移入でき、特に私の場合は、Sareh(発音でもサラと言っているのに、日本語訳では一貫してサリーになっているのはなぜ)は辛い決断を求められていることが多く、共感することが多かった。
最終的に全容が明らかになることでカタルシスもあり、同時にAIについて考えさせられる内容にもなっている。ただし、Tacomaに登場するAIは一般的なNPCに過ぎず、同年にリリースされたEvent[0]には残念ながら及ばないが…

Gone Homeからの新しい試みは、ARという体裁でアニメーション付きで過去の状況再現を見られることだろうか。
ARというのはなかなか良いアイデアだと思う。カットシーンとは異なり、一定の範囲をその場にいないかのように自由に歩き回って状況を知ることができるし、巻き戻しや早送り、一時停止もできるので、一方的に見せられるカットシーンよりも自ら探りたい時間と場所の情報を得られるので気が利いている。

Gone Homeをプレイした方は分かると思うが、オブジェクトに文字が書かれているときにそれを見やすくするためにオーバーレイでテキストが表示されているが、TacomaではそれもARが投影しているという設定になっているため、違和感が無い。現実世界でも実現されつつあるが、多言語にローカライズされたオーバーレイは近未来感がある。
文字を入力するときに手話のように手を動かすのも、近未来のキーボードレスな入力インターフェイスという感じで説得力がある。ここで安直に空中でキーボードをタイピングするような仕草を取られると興醒めしてしまうだろう。

一方で、ARとAIに強く依存しているためデジタルデータでの情報が多くなっているが、そのデジタルデータは大体破損していて全部読めない状態なのがストレスが溜まる。推測して欲しいのかもしれないが、推測しようがないわけの分からないローカライズ泣かせな文面も多い。状況がよくわかっていない序盤では猶更である。
逆に紙媒体ではそうした欠如が起こっていないというのは、このゲームで意図した皮肉だろうか。

The Red String Club #2 Androids Dream

やり直しの効かない前半の会話シーンとはうって変わり、後半のアドベンチャー?は総当たりでゲーム的な試行を何度も行う必要があり、現実的におかしいだろという光景になるのがもうちょっと頑張って欲しいところ。
会話シーンでは功を奏していた、何をどう選んでもそのままゲームが進行できてしまうこのゲームの特性が、仇になっているように見える。

とはいえ、ストーリーは面白かった。ボリューム的にも内容的にも、エピソード 1が終わったような印象なので、続きを期待をしてしまう。多分想定されていないだろうけれど。
ストーリーのテーマは共感と倫理にあたるだろうか。サイバーパンクのお決まりのようでもあるが、プレイヤーに解のない答えを問いかける選択も多い。

記録されていく数々の選択に関しては、明示的に影響しているような箇所は随所にみられたが、大局的には他のゲームと大差無く大きく逸れた結果にはならないように見える。赤い糸として選択を図示してくだけの価値はあったのかどうか不明である。