「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
私は主にWindowsアプリケーション開発を担当しております。Windows系の組み込みOSであるWindows Embedded Compact 7環境で稼働するデバイスアプリケーション開発に携わる機会がありました。
開発プラットフォームには、いつもWindowsアプリケーション開発で利用しているMicrosoft Visual Studio 2008(.NET Compact Framework 3.5)を利用できたので、Windowsアプリケーション開発と同じ感覚で開発を行えました。
今回のソフテックだよりでは、 .NET Compact Frameworkを用いたデバイスアプリケーション開発についてご紹介させていただきます。
.NET Compact Frameworkは、スマート デバイス上で実行するためのマネージ アプリケーション(※1)を開発するのに利用されるクラスライブラリです。名前から分かるとおり.NET Framework の機能を継承している完全なサブセットの位置づけが特徴です。
.NET Framework上で動作するWindowsアプリケーション開発の経験があれば、容易にプログラミング習得ができる利点があります。
Windows Mobileベースのデバイス用にチューニングされたSDKを作成(OSイメージの構築に併せて対応)して、開発環境PCにインストールすることで、Microsoft Visual Studioのスマートデバイス プロジェクトとしてアプリケーション開発することが可能です。
エミュレータ機能を使って開発コンピュータ上でプログラムコードの実行/デバックを行うことが可能なので、Windowsアプリケーション開発を行うのとほとんど同じ感覚で開発できます。
注意点としては、完全な.NET Frameworkクラスライブラリ提供機能の約3割程度の実装なので、.NET Frameworkで使用できた機能が使用できない場合があることが挙げられます。
また、.NET Frameworkと.NET Compact Frameworkで挙動に違いが見られる場合もあります。
具体例としては、XmlSerializerクラスの"Serialize(…)"メソッドの挙動(※2)などです。
私が携わった開発では、画面数が多く、1画面に表示/入力するためのコントロール数も多い仕様のアプリケーションでした。
下記のような改善を図る必要にせまられ、表示/動作パフォーマンスを向上させる対応を行う必要がありました。
(1) 画面で、大量の標準コントロールを利用したときに表示動作が重くなる
(2) アプリケーション起動が起動するまでに時間がかかる
直面した問題に対して、下記パフォーマンス向上の対策を取ることで、現象を解消させることができましたので、ご紹介させていただきます。
パフォーマンス向上に際しては、Microsoft技術情報ページで紹介されている情報などを元に、特にパフォーマンス向上に効果的であった対策を取りいれて対応するようにしました。
.NET Compact Frameworkが提供する標準コントロール(ラベル、テキストボックス、コンボボックス、ボタン等)を使用して画面を構築したところ、画面表示動作が重く感じられました。
対策として、それぞれの画面部品に関して必要な機能のみ自前で作りこんだカスタムコントロールクラスを製作することで改善を図るアプローチをとりました。
(b)の対策によって画面表示によるちらつきの問題を解消させるところに苦心しましたので、プログラムコード対応例を以下に示します。ユーザの視点に立った1画面で、必要十分な情報を確認できる画面仕様をスムーズな表示で実現させることができました。
カスタムコントロール ソース例
/// <summary>オフスクリーン ビットマップ</summary>
protected Bitmap m_bmpDraw = null;
/// <summary>
/// 描画処理オーバライド
/// </summary>
protected override void OnPaint(PaintEventArgs e)
{
// オフスクリーン ビットマップの転送
e.Graphics.DrawImage(m_bmpDraw, 0, 0, this.ClientRectangle, GraphicsUnit.Pixel);
}
/// <summary>
/// オフ
/// </summary>
protected void DrawOffscreenBitmap()
{
// オフスクリーン ビットマップ未作成なら作成
if (m_bmpDraw == null)
{
m_bmpDraw = new Bitmap(
this.ClientRectangle.Width, this.ClientRectangle.Height);
}
else
{
if (m_bmpDraw.Width != this.ClientRectangle.Width ||
m_bmpDraw.Height != this.ClientRectangle.Height)
{
m_bmpDraw.Dispose();
m_bmpDraw = new Bitmap(
this.ClientRectangle.Width, this.ClientRectangle.Height);
}
}
//--------------------------------------------------------
// 描画矩形領域をコントロールから取得
Rectangle rcControl = this.ClientRectangle;
//--------------------------------------------------------
// 背景の塗りつぶし
{
sb.Color = this.CustomBackColor;
g.FillRectangle(sb, rcControl);
}
//--------------------------------------------------------
// オフスクリーン ビットマップにコントロール外観を適宜描画
・・・・・・
・・・・・・
}
開発したデバイスアプリケーションの画面数が多かったことで、アプリケーションを起動させて初期表示の画面が立ち上がるまで、運用で許容できないほど時間がかかる問題に直面しました。
起動時間がかかっているボトルネックを調査したところ、下記、実装方法に問題/改善の余地が認められて対策をとることになっています。
アプリ起動時間の大部分はこちら原因だったので、劇的な起動時間の高速化を実現できました。
尚、初期表示しない他画面(アプリ起動後は未初期化)については、画面切り替え操作によって初期表示されるタイミングで初期化を行うことになりましたが、1画面の初期化処理時間は運用想定時に許容できるレベルでしたので問題なかったことを補足いたします。
■パフォーマンス向上 対応前 (デザイナ自動生成)
this.Controls.Add(this.panelPage1);
■パフォーマンス向上 対応後 (自前のコードにカスタマイズ)
this.panelPage1.Parent = this;
.NET Compact Frameworkを使ったデバイスアプリケーション開発では、Windowsアプリケーションとは違った点に苦労しました。
デバイスアプリケーション開発を通して経験したパフォーマンス向上のアプローチは、Windowsアプリケーション開発でも有用な部分があると思います。これまでは、アプリケーション起動や、画面表示が運用で許容できないほどの問題に直面することはなかったので良い経験となりました。
今回のソフテックだよりで取り上げさせていただいた内容が、.NET Compact Frameworkを使ったデバイスアプリケーション開発時のパフォーマンス向上の材料のひとつになれば幸いです。
(M.S.)
関連ページへのリンク
関連するソフテックだより