HOME > ソフテックだより > 第219号(2014年10月1日発行) 技術レポート「.NET Compact Frameworkを使用したデバイスアプリケーション開発」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第219号(2014年10月1日発行)
技術レポート

「.NET Compact Frameworkを使用したデバイスアプリケーション開発」

1. はじめに

私は主にWindowsアプリケーション開発を担当しております。Windows系の組み込みOSであるWindows Embedded Compact 7環境で稼働するデバイスアプリケーション開発に携わる機会がありました。
開発プラットフォームには、いつもWindowsアプリケーション開発で利用しているMicrosoft Visual Studio 2008(.NET Compact Framework 3.5)を利用できたので、Windowsアプリケーション開発と同じ感覚で開発を行えました。
今回のソフテックだよりでは、 .NET Compact Frameworkを用いたデバイスアプリケーション開発についてご紹介させていただきます。

2. .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)などです。

3. .NET Compact Frameworkアプリケーション開発で直面した問題点

私が携わった開発では、画面数が多く、1画面に表示/入力するためのコントロール数も多い仕様のアプリケーションでした。

下記のような改善を図る必要にせまられ、表示/動作パフォーマンスを向上させる対応を行う必要がありました。

(1) 画面で、大量の標準コントロールを利用したときに表示動作が重くなる

画面コントロールが1つずつ順番に描画されるため、画面内に配置したコントロール数が多いと表示更新の時に画面がちらついて見える。

(2) アプリケーション起動が起動するまでに時間がかかる

画面数が多く、起動時に全ての画面インスタンスを生成(リソースロード&プロパティ初期化)していたために、処理時間が膨大にかかっておりました。

4. パフォーマンス向上について

直面した問題に対して、下記パフォーマンス向上の対策を取ることで、現象を解消させることができましたので、ご紹介させていただきます。
パフォーマンス向上に際しては、Microsoft技術情報ページで紹介されている情報などを元に、特にパフォーマンス向上に効果的であった対策を取りいれて対応するようにしました。

4-1.標準コントロールを使用せずに、カスタムコントロールを作成

.NET Compact Frameworkが提供する標準コントロール(ラベル、テキストボックス、コンボボックス、ボタン等)を使用して画面を構築したところ、画面表示動作が重く感じられました。

対策として、それぞれの画面部品に関して必要な機能のみ自前で作りこんだカスタムコントロールクラスを製作することで改善を図るアプローチをとりました。

(a)
必要な機能に絞って実装したことで、コントロールリソースサイズのコンパクト化
(b)
描画処理では、オフスクリーン ビットマップ化を図ることで描画速度の向上

(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);
}
//--------------------------------------------------------
// オフスクリーン ビットマップにコントロール外観を適宜描画
・・・・・・
・・・・・・
}

4-2. アプリケーション起動の高速化

開発したデバイスアプリケーションの画面数が多かったことで、アプリケーションを起動させて初期表示の画面が立ち上がるまで、運用で許容できないほど時間がかかる問題に直面しました。
起動時間がかかっているボトルネックを調査したところ、下記、実装方法に問題/改善の余地が認められて対策をとることになっています。

  • アプリ起動時に表示するモード画面のみ初期化させる
    複数画面に対応したアプリケーションでしたが、アプリ起動時に全画面リソースをロードして初期化を行っていました。画面表示されるものはカレントページだけでしたので、初期表示する画面ページのみ初期化対象とするように対策を講じました。

    アプリ起動時間の大部分はこちら原因だったので、劇的な起動時間の高速化を実現できました。
    尚、初期表示しない他画面(アプリ起動後は未初期化)については、画面切り替え操作によって初期表示されるタイミングで初期化を行うことになりましたが、1画面の初期化処理時間は運用想定時に許容できるレベルでしたので問題なかったことを補足いたします。

  • コントロール初期化処理におけるパフォーマンス向上例
    Microsoft技術情報で紹介されていたパフォーマンス向上方法の中で、コントロール初期化処理で効果的(プロパティ設定における処理時間が大幅に短縮される)だった方法を下記に示します。
    尚、こちらの対応はVisual Studioの画面リソースデザイナが自動生成するコードをカスタマイズする必要があります。
■パフォーマンス向上 対応前 (デザイナ自動生成)
this.Controls.Add(this.panelPage1);

■パフォーマンス向上 対応後 (自前のコードにカスタマイズ)
this.panelPage1.Parent = this;

5. さいごに

.NET Compact Frameworkを使ったデバイスアプリケーション開発では、Windowsアプリケーションとは違った点に苦労しました。
デバイスアプリケーション開発を通して経験したパフォーマンス向上のアプローチは、Windowsアプリケーション開発でも有用な部分があると思います。これまでは、アプリケーション起動や、画面表示が運用で許容できないほどの問題に直面することはなかったので良い経験となりました。

今回のソフテックだよりで取り上げさせていただいた内容が、.NET Compact Frameworkを使ったデバイスアプリケーション開発時のパフォーマンス向上の材料のひとつになれば幸いです。

(M.S.)

[参考URL]
.NET Compact Frameworkアプリ 起動高速化⇒ http://msdn.microsoft.com/library/aa446535
.NET Compact Framework アプリケーション開発 パフォーマンス向上
http://msdn.microsoft.com/ja-jp/library/1766918e(v=vs.90).aspx
[注釈]
※1:
CLR(Common Language Runtime)に準拠したプログラムコードで作成されたアプリケーション
※2:
重複したタグ名が存在するXMLファイルを読み込んだ時に.NET Frameworkではエラー、.NET Compact Frameworkでは成功します

関連ページへのリンク

関連するソフテックだより

ページTOPへ