Windows 10 Mobile のアプリケーションは起動に20秒以上かかると起動せずに落ちる

Windows 10 Mobile のアプリケーションで起動時にファイル操作を「同期処理」であれこれやっていて結構時間がかかっているのですが、Visual Studio からデバッグ実行している限りでは問題なく動作し、W10M から単体でアプリケーションを起動すると、起動が完了する前に落ちてしまいます。

最初この現象の理由がわからずデバッグ実行での確認もできないので悩んでいました。例外をキャッチしてログを出すようにもしていたのですが、何でもないような処理のところでプログラムが落ち、例外もまったく発生しませんでした。

しかし、何回かやっているうちに気づいたのですが、ログの出力時間を確認したら最初のログの時間と落ちるタイミングの時間の差が20秒であることに気づきました。試しに Task.Delay.Wait で待機させるようにしたらもっと前の処理で落ちることを確認できました。

Windiws Phone 7 か 8 あたりでも、処理に時間がかかって UI? に処理を戻さないとアプリケーションが落ちるという話は聞いたことがあるのですが、このことをしばらく思い出せなくて盲点でした。デバッグ実行では落ちないし、例外も発生しないので気を付けなければいけませんね。

余談ですが、ファイルアクセス処理はファイルがあるかどうかのチェックだけでも1回あたり1秒ぐらいかかるので非同期処理のほうがいいですね。


Visual Studio でアセンブリ署名を作成・登録しようとするとエラーがでる (解決済み)

環境

  • Windows 10 Pro
  • Visual Studio 2015 Community

現象

環境を Windows 10 (新規)に移行して Visual Studio 2015 を入れたのですが、以前のプロジェクトを編集していると一部のプロジェクトでアセンブリ署名がうまく設定されない現象に出くわしました。

原因を探るために新規プロジェクトを作成して試してみました。今回はコンソールアプリケーションです。プロジェクトを作成しただけで特に何も追加していません。

2015-09-16 22_34_37-3D Builder

プロジェクトのプロパティを開き、アセンブリの署名キーを作成します。

2015-09-16 22_35_20-3D Builder

ファイル名とパスワードを入力します。

2015-09-16 22_35_44-厳密な名前キーの作成

しかし、「操作を完了できませんでした。アクセスが拒否されました。」のエラーメッセージが出てしまいました。

2015-09-16 22_36_23-Microsoft Visual Studio

プロジェクトにもキーファイルは追加されていません。

2015-09-16 22_36_36-3D Builder

ただ、エクスプローラーを見るとファイルだけは作成されているようです。

2015-09-16 22_36_46-

試しに、このpfxファイルを参照して設定してみます。

2015-09-16 22_36_57-3D Builder

作成されたpfxファイルを選択します。

2015-09-16 22_37_05-3D Builder

先ほど入力したパスワードを入力します。

2015-09-16 22_37_15-ファイルを開くためのパスワードを入力してください。

しかし今度は「存在しないトークンを参照しようとしました。」というエラーメッセージが表示されました。

2015-09-16 22_37_18-キーのインポート エラーです。

もちろん、キーファイルは設定されていません。

2015-09-16 22_37_26-3D Builder

しかし、今度はプロジェクトには追加されているようです。

2015-09-16 22_37_31-3D Builder

解決方法

正規の解決方法なのかはわかりませんがうまく対応できたので手順を載せておきます。

いろいろ調べてみると「C:ProgramDataMicrosoftCryptoRSAMachineKeys」フォルダに対して更新権限がないために起こっているエラーのようでした。試しに、そのフォルダに対してファイルを作成しようとしても作成できないことが確認できます。

2015-09-16 22_38_56-MachineKeys

ちなみに、正常に動作している環境ではファイルが作成できるようになっていました。

2015-09-16 22_39_42-yuuichi-main_3404 - リモート デスクトップ接続

なぜこのような違いが起こったのかわかりませんが、とりあえずログインしているユーザーでフルコントロールを割り当ててみました。ちなみに正常に動作している環境のセキュリティを確認したところ、「Everyone」「Administrators」のみで、どちらもアクセス許可にはすべてチェックはついていませんでした。

2015-09-16 22_40_20-MachineKeys のアクセス許可

セキュリティの設定を行ったところ、作成したプロジェクトでキーファイルが設定できるようになりました。

2015-09-16 22_41_54-OneNote

もともと正常に動作している環境、動作しなかった環境はいずれも「Windows 10 Pro」「Visual Studio 2015 Community」なのですが、Windows 10 に移行した際の手順によってもしかしたら違いが出たのかもしれません。

Windows 10 新規インストール OK
Windows 8.1 Professional から Windows 10 へアップグレード OK
Windows 8.1 Enterprise から Windows 10 へアプリ以外をアップグレード NG

また、今回は「C:ProgramDataMicrosoftCryptoRSAMachineKeys」フォルダにセキュリティのアクセス許可を追加しましたが、セキュリティ的にリスクがないかどうかはよくわかっていません。試される方はその点を認識したうえで行ってください。


MonoGame を使って MADOSMA (Windows Phone) で動くゲームを作ってみた検証メモ

前振り

日本でも Windows Phone 8.1 が搭載されたスマフォ(MADOSMA) が発売され、ようやく Windows Phone アプリ開発にも本腰が入れられるようになりました。正直今までは Windows Phone 自体が日本になかったので(7.8 には目をそらしつつ)、Windows Phone アプリの開発についてもほとんど触れていませんでした。

ですが、最近はユニバーサル Windows アプリ(UWP)開発なるものが出てきて、Windows Store App と Windows Phone 8.1 のアプリを同時開発できるなど、WP 開発の敷居も少し下がったような感じがします。MonoGame でも最新バージョンではこの UWP に対応したりしています。

ということでせっかく MADOSMA も入手したので、MADOSMA で動くゲームを作ってみようかと思いました。

しかし、ここで問題になるのは MonoGame を使ってちゃんと WP で動くゲームを作れるか、ということです。正直これは作ってみないとわからないのですが、かといってかなり作りこんだ後に、「実はパフォーマンス上の問題が…」「実はリソースの問題が…」なんてことになったら元も子もないので、やはり事前に調査は必要になってくると思います。

が、さらに問題になるのは、その検証するのを作るのもかなり大変だということです。「とある機能」を検証すること自体は必要な機能の数だけ検証すればいいのですが、実際に出来上がるゲームは多数の「とある機能」が複雑に絡み合って動くものなので、こればかりは実際にゲームを構築したあとにならないとわからないものです。

とまあ結局何が言いたいのかというと、1から作って検証するのもめんどくさいので、すでに作ったゲームでとりあえず動くか検証しようというのが今回の話です。

動かすゲーム

私の実況動画でもたまに出していますが、以前 Windows ストア向けに作ったゲームがあって、それをそのまま Windows Phone で動かしてみようと思いました。

エイッとウォーズ」というゲームなのですが、タッチでキャラクターを動かして戦わせるというシンプルなゲームです。タッチ操作前提のゲームなので、意外とそのまま Windows Phone に移植できるんじゃないかと思いました。

222

シンプルなゲームとは言っても数百のスプライトを60FPSで動かすという意外に負荷のかかるゲームです。これが Windows Phone で動けばゲーム制作に希望が持てるので、検証するにはもってこいのゲームだと思いました。

移植

エイッとウォーズ」は「Windows 8」向けのゲームです。今回「UWP」として作り直すので、UWP プロジェクトを新規で作り、Windows 8 時代のコードをそのまま持ってきました。MonoGame のバージョンも 3.0 から 3.4 に上がるので、フレームワークに差異がないか(多少は)心配しましたが特に問題ありませんでした。(さすが XNA)

コンテンツ(画像などのリソース)については XNA Framework のコンテンツパイプラインを使わず MonoGame のコンテンツパイプラインで作り直しました。SpriteFont で一部ビルドできないフォントがあったので別なフォント名にしましたが、それ以外については問題なくコンパイルできました。MonoGame でのコンテンツの作り方は以下のページにまとめてあります。

コードについてはほぼ変えていません。1か所だけ、マウスカーソルを表示するように設定していると WP で実行時にアサートが発生するのでシンボル条件で WP では表示しないようにしました。これだけです。

で、実行した結果の写真です。MADOSMA でゲームが動きました。ちゃんとタッチして操作できます。

WIN_20150705_181947

何気に 60 FPS で動いているものすごいです。一部のステージではキャラ数が多すぎて 50 FPS ぐらいには落ちるのですが、スマフォのせいかはわかりませんが遅延しているようには感じられませんでした。XNA のころは WP は標準 30FPS に設定しているぐらいなのでたぶん問題ないのでしょう。

 

と、オールクリア的な書き方をしているのですが、やはり WP ならではの問題はありました。解決未解決も含めて3つほどありましたので書いておきます。

アクションセンターが邪魔

WP 特有の機能です。普通に WP を使っている場合は縦向きで上から指を下にスライドするとアクションセンターが表示されます。このゲームは横向きなので左側から指をスライドするとアクションセンターが出てきます。

このゲームはキャラクターを移動させるためにキャラをタッチしてスライドして移動するのですが、キャラクターが左端にいるときに移動させようとするとアクションセンターが移動します(おまえじゃない)。

画面外からスライドしてアクションセンターが出るのであればまだ許容はできたのですが、ゲーム内の1キャラ分画面内をタッチしてもアクションセンターが反応するので厄介でした。Windows タブレットのころもチャームなどサイドから出てくるメニューはあったのですが、あちらは画面外からタッチしないとでないのでなんとかなったのですが WP はそうはいきませんでした。

とりあえず対応策としてはキャラクターの移動できる範囲を両サイド 50px ほど中にせばめました。狭めたところで難易度はほとんど変わらないのでこれで対応することにしました。

音が遅延してくる

最初普通にプレイするには全然問題なかったのですが、しばらくゲームしてると、効果音に雑音が入るようになってきました。ゲームを続ければ続けるほどよりひどくなります。最初は雑音かと思っていたのですがよくよく聞いてみると音の再生スピードがだんだん遅くなってくるような感じに聞こえました。

原因は定かではないのですが、このゲームはやたら効果音が再生されるので、内部バッファ的なものが溜まりすぎてうまく音声が調整できなくなったのではないかと思います。ちなみに BGM (MonoGame では Song クラス)の再生の方は問題ありませんでした。(要は BGM は普通に聞こえるのに効果音がおかしくなる状態)

これはプログラムで対処しました。効果音の再生には「SoundEffect.Play」を使用しているのですが、このメソッドは連続で使うと内部的に「SoundEffectInstance」をプールします。おそらくこのインスタンスをプールするあたりの制御がうまくいってないような感じがしたので、「SoundEffect.Play」メソッドは使わず事前に「SoundEffectInstance」を作成してプログラム側でこれを使いまわすようにしました。とりあえず全クリするぐらい耐久テストしてみましたが今のところ再生される音が遅延することはなくなりました。

ゲームをプレイしていると勝手にサスペンドする

未解決でありながらやっかいな現象です。

ゲームをしていると画面が止まります。

一瞬ハングしたのかと思ってしまうのですが、「アプリ間の切り替え」画面をいったん表示させて再度ゲームを選択すると停止した状態から動き出します。なのでおそらくサスペンドしてしまっているのではないかと思います。

原因が全く分からないので、どういったタイミングで停止してしまうのかを調査してみました。するとどうやらタッチ操作をしたタイミングで停止するようです。もちろん毎回ではなくタッチしてもまったく止まらないこともあれば止まることもある、という状態です。

タッチ系の処理が悪さをしているのかとおもって「TouchPanel.GetCapabilities」や「TouchPanel.GetState」「Mouse.GetState」など関連しそうなところをつけたり消したししてみましたが、処理を入れなくても停止するようでした。

ちなみにどの状態でも停止するかというとそういうわけでもなく、MonoGame を新規で作った時にできるサンプルコードを実行したときはいくらタッチ操作をしても停止することはありませんでした。おそらく高負荷な状態で発生しているような気もしました。

さらにコードのどの部分で停止しているかも調査してみました。すると Game.Draw メソッドが終わった後なので、停止場所はフレームワーク内部ということになります。ちなみに停止している間は Update メソッドも Draw メソッドも呼ばれないので、残念ながら手をつけられる範囲ではないようです。

まとめ

まあ、まとめることは特にないのですが、とりあえず MonoGame で Windows Phone 向けのゲームを作るのは「あり」だと思います。最後の未解決問題の件はありますが、「高負荷な状態」「頻繁にタッチをする」という条件下で発生するようなので、そういう形にならないように作ればなんとかなるのではないかと思います。仮に停止してしまったとしてもいったんアプリ間切り替えに移動して再度ゲームを選択してもらえば一応続けられます。この問題が WP 全体の問題なのか MADOSMA だけの問題なのかわからないので、別な環境でもおいおい調査してみたいと思います。

ちなみに調査用に移植したこの「エイッとウォーズ」なのですが、Windows Phone アプリとして公開するかどうかは微妙です。なぜかというとこのゲームの元はコンテスト用に作ったものなので、Windows Phone で公開していいのか不明だからです。一応確認してみますが、運がよければ公開します、ぐらいで思っていただければと思います。


ビルド時に「MakePRI : warning 0xdef00520: Invalid qualifier」の警告がでる原因

メモです。

「.NET for Windows Store apps」を参照しているプロジェクトにおいてビルドすると「MakePRI : warning 0xdef00520: Invalid qualifier:xxxxx」という警告がでる場合があります。

原因がわからなく、そのままでも問題なかったので放置していたのですが、原因がわかりました。

プロジェクト内にファイル名が「xxx.xxxx.xx.txt」のように複数のピリオドを持つファイルが含まれていると警告が出るようです。ファイル名を変えたらでなくなりました。


MonoGame の Tips 始めました

最近 MonoGame の更新が Win10 対応や VS2015 対応とかで積極的になっているようなので、MonoGame に関連する Tips でも作っていこうかなと思いました。

ただ、今回の Tips は連載的なものではなく、気づいた点があったら書き込んでいくという形になるので不定期な更新になると思います。(とは言っても今までも不定期でしたが…)

あと、書くお題については初心者にもわかるように初歩的なものから順番に、というものにはならないと思います。そもそも MonoGame は XNA Framework のクラスライブラリなどをベースに作られているものなので、入門的なプログラムについては XNA の Tips を見れば大体動かせると思います。一応私の方でも以前に XNA の Tips の入門的なものは書いているので、プログラムでわからないことがあればそちらをご覧ください。

そのため、今回書く MonoGame の Tips は以下のようなものになると思います。

  • MonoGame 専用の Tips
  • ゲームプログラム中級者あたりを目安にした Tips

前述通り、初心者向けの Tips については XNA の Tips にあるものを見ていただければある程度わかると思います。今までゲームプログラミング Tips は入門的な部分を書くのに手一杯だったので、今後は少し高度な Tips とかも書いていきたいと思っています。

 

さて今回、MonoGame を始めるにあたっての Tips を3つほど書きました。MonoGame での開発を始めるにあたっての最初の部分なのですが、一応 MonoGame が絡んでくる場所なので書いておきました。

あともう一つ「コンテンツ・パイプライン」について書く予定なのですが、ちょっと時間がかかりそうなので、こちらはでき次第上げたいと思います。


[ゲーム制作] しゃべりながらゲーム製作やってみます #01(.1) 仕切り直し回

前回ゲーム制作動画を上げましたが、VOICEROID を使って動画を製作するとかなり時間がかかることが判明したので、実況形式として撮り直しました。実況は初めてなのでうまくしゃべれていないのですが、今後も継続してやっていきたいと思いますのでよろしくお願いします。

初回はゲーム制作についての概要と、テキスト表示を行っています。


Crystal Reports でデータベース フィールドの項目を最新にする (DataSet 版)

環境

  • Visual Studio : Visual Studio 2008
  • Crystal Reports : Crystal Reports Basic for Visual Studio 2008

概要

Crystal Reports のデータベース フィールドに DataSet のテーブルをバインドした後に、DataSet のテーブルの項目を変更してもデータベース フィールドには自動的に反映されません。最新の状態を反映させるには以下の手順を行います。

手順

  1. DataSet のテーブルの構成(列など)を変更
  2. 対象のプロジェクトをビルド
  3. Crystal Reports のフィールド エクスプローラーから「データベース フィールド」を右クリックし、「データベースの照合」を選択
  4. 確認ダイアログで「OK」をクリック

Visual Studio 2008 に SP1 をインストールしたときに Intelisense 等の説明が英語になってしまう現象を修正する

下記のサイトにアクセスし「VS90SP1-KB957507-JPN-x86.exe」をダウンロードしてインストールします。インストールに少し時間がかかるので注意してください。


ASP.NET アプリケーションをデバッグ実行したときに「AspAccessCheck~.tmp」へのアクセス拒否のエラーに対処する

メモ書きです。

環境

  • Visual Studio 2013
  • .NET Framework 4.5

内容

原因がよくわかっていないのですが、Visual Studio で ASP.NET アプリケーションをデバッグ実行したときに以下のエラー(例外)が表示されて、その後の処理が正常に行われない現象が発生する場合があります。

型 'System.UnauthorizedAccessException' の初回例外が mscorlib.dll で発生しました

追加情報:パス 'C:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Files~AspAccessCheck_71d98a9c21352.tmp' へのアクセスが拒否されました。

※「71d98a9c21352」はたぶん一時的に決められた値

これを解決するには「C:WindowsMicrosoft.NETFrameworkv4.0.30319」フォルダにある「Temporary ASP.NET Files」フォルダを削除してしまいます。たぶんフォルダの中には何も入っていないはずです。削除後デバッグ実行すると正常に動作する場合があります。(実行しても Temporary ASP.NET Files フォルダは作成されないようです)


[C#]Visual Studioにおけるステートメントのコードスニペット

実はいままで知らなかったんですが if 文や for 文を入力する際にコードスニペットを使って定型文を入力できたんですね。今までちまちま鍵かっこと書いていました。^^;

コードスニペットは Tab キーを押して入力できます。まず、if 文を例として、if 文を入力したい箇所にカーソルを置きます。

image

続いて「if」と入力します。インテリセンスが表示されるので途中で Tab キーを押して確定しても構いません。

image

下のように「if」の後ろにカーソルがある状態で Tab キーを押します。

image

下図のように必要なかっこが自動的に作られます。あとはオレンジ色になっている個所を修正していきます。

image

else 文が必要な場合は同様に else と入力した後に Tab キーを押せば鍵かっこが追加されます。これ以外の for や while, switch などにも使えるので試してみてください。

試していませんが、VB.NET とかもできるのではないかと思います。