こういうライブラリって割と簡単に PDF に出力できるもんだと思っていたのですが、レポートの種類や ActiveReports のバージョンによってやり方が異なっていたりしたので結構実現するのに苦労しました。
タグ: Visual Studio
【ActiveReports Tips】ActiveReports for .NET 16 をインストールする
少し ActiveReports を触る機会があったので Tips でまとめてみようと思いました。とはいってもあまり触っているわけではないので今後 Tips で公開するのは3つぐらいだとおもいます。
【Visual Studio Tips】Visual Studio のインストール手順
様々なアプリケーションや Web 開発を行うことができる無料の統合開発環境「Visual Studio」のインストール手順について説明しています。
MonoGame 公式サンプルプログラムの Tips を2本公開しました
MonoGame の公式サイトにサンプルプログラムがあるのですが、公開されているものはすべて英語コメントでプロジェクトのみがアップロードされている形となっています。
なので今回その中から最初の2つを日本語で解説しつつコメントの日本語化してみました。以下の2つのサンプルが対象です。
- Aiming
- Audio3D
他のプロジェクトも解説していこうかと思ったのですが、現在公開されているサンプルは以前の MonoGame のバージョンで作られたものも多く、残念ながらそのまま MonoGame 3.8 に持っていけないものもあったため移行作業は中断しています。
今後の公開については気が向いたらレベルで見ていただければと思います。
公開ページは以下の場所にあります。
WiX の Tips を公開しました
Windows 向けアプリケーションのインストーラーを作成するのに使われることの多い WiX に関する Tips をいくつか作成しました。WiX を使用すると Visual Studio に標準で含まれているセットアッププロジェクトよりも、より自由な形でインストーラーを作成することができます。
ゲーム「リトルセイバー」の体験版を配布したときも WiX を使用してインストーラーを作成しており、せっかくなので覚えたことを Tips にしてみました。
Tips は以下のページにまとめております。
---------------------------------
- プログラム配布用の Windows インストーラーを作成ための WiX をセットアップする
- Wix を使用して Windows インストーラー「MSI」を作成する part1
- Wix を使用して Windows インストーラー「MSI」を作成する part2
- バージョンアップしたアプリケーションを配布するインストーラーを WiX で作成する
- インストーラーファイルの付加情報を日本語で設定する
- CAB ファイルを MSI ファイルの中に含める
- 64bit アプリケーションをインストールするインストーラーを作成する
- Ngen.exe を使用してインストールしたプログラムの起動を高速化
]]>
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 を入れたのですが、以前のプロジェクトを編集していると一部のプロジェクトでアセンブリ署名がうまく設定されない現象に出くわしました。
原因を探るために新規プロジェクトを作成して試してみました。今回はコンソールアプリケーションです。プロジェクトを作成しただけで特に何も追加していません。
プロジェクトのプロパティを開き、アセンブリの署名キーを作成します。
ファイル名とパスワードを入力します。
しかし、「操作を完了できませんでした。アクセスが拒否されました。」のエラーメッセージが出てしまいました。
プロジェクトにもキーファイルは追加されていません。
ただ、エクスプローラーを見るとファイルだけは作成されているようです。
試しに、このpfxファイルを参照して設定してみます。
作成されたpfxファイルを選択します。
先ほど入力したパスワードを入力します。
しかし今度は「存在しないトークンを参照しようとしました。」というエラーメッセージが表示されました。
もちろん、キーファイルは設定されていません。
しかし、今度はプロジェクトには追加されているようです。
解決方法
正規の解決方法なのかはわかりませんがうまく対応できたので手順を載せておきます。
いろいろ調べてみると「C:ProgramDataMicrosoftCryptoRSAMachineKeys」フォルダに対して更新権限がないために起こっているエラーのようでした。試しに、そのフォルダに対してファイルを作成しようとしても作成できないことが確認できます。
ちなみに、正常に動作している環境ではファイルが作成できるようになっていました。
なぜこのような違いが起こったのかわかりませんが、とりあえずログインしているユーザーでフルコントロールを割り当ててみました。ちなみに正常に動作している環境のセキュリティを確認したところ、「Everyone」「Administrators」のみで、どちらもアクセス許可にはすべてチェックはついていませんでした。
セキュリティの設定を行ったところ、作成したプロジェクトでキーファイルが設定できるようになりました。
もともと正常に動作している環境、動作しなかった環境はいずれも「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 に移植できるんじゃないかと思いました。
シンプルなゲームとは言っても数百のスプライトを60FPSで動かすという意外に負荷のかかるゲームです。これが Windows Phone で動けばゲーム制作に希望が持てるので、検証するにはもってこいのゲームだと思いました。
移植
「エイッとウォーズ」は「Windows 8」向けのゲームです。今回「UWP」として作り直すので、UWP プロジェクトを新規で作り、Windows 8 時代のコードをそのまま持ってきました。MonoGame のバージョンも 3.0 から 3.4 に上がるので、フレームワークに差異がないか(多少は)心配しましたが特に問題ありませんでした。(さすが XNA)
コンテンツ(画像などのリソース)については XNA Framework のコンテンツパイプラインを使わず MonoGame のコンテンツパイプラインで作り直しました。SpriteFont で一部ビルドできないフォントがあったので別なフォント名にしましたが、それ以外については問題なくコンパイルできました。MonoGame でのコンテンツの作り方は以下のページにまとめてあります。
コードについてはほぼ変えていません。1か所だけ、マウスカーソルを表示するように設定していると WP で実行時にアサートが発生するのでシンボル条件で WP では表示しないようにしました。これだけです。
で、実行した結果の写真です。MADOSMA でゲームが動きました。ちゃんとタッチして操作できます。
何気に 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」のように複数のピリオドを持つファイルが含まれていると警告が出るようです。ファイル名を変えたらでなくなりました。
]]>