メモリデバイス

メモリデバイスは様々な状況で利用できますが、主にアイテムをオーバーラップして表示するときに生じるちらつきを防ぐために使用します。メモリデバイスを使用しない場合ディスプレイ上に描画操作が直接行われます。そのため描画操作ごとに逐次ディスプレイは更新されていき、ちらつきとなります。例えばテキストを見やすくさせるために背景を設定する場合、まず背景を描画し、そのつぎにテキストを描画しなければなりません。このときにちらつきが生じてしまいます。

一方で、メモリデバイスを使用した場合、先述の描画操作自体はメモリ上で行われ、表示したい最終結果のみをディスプレイに表示します。これによりちらつきを防ぐことができます。この2つの違いを下に図として示しています。

メモリデバイスのソフトはオプションとなっておりemWin基本パッケージには含まれていません。GUIビルダのサブディレクトリであるMemdevにあります。

 

メモリデバイス有無の比較

下の表はおなじ描画操作をメモリデバイスあり・なしで行った場合、実際の表示結果にはどのような差異が生じるのかを図示したものです。ポリゴンとそのポリゴンの回転角を表示するというもので、これを0度から10度に変化させるという描画をします。メモリデバイスなしの場合ではディスプレイクリア・回転させたポリゴン描画・テキストを描画という各ステップごとがディスプレイに表示されていきますが、メモリデバイス有りでは一連の描画をメモリー上で行い最後にディスプレイを更新します。

API メモリデバイスなし メモリデバイスあり
Step 0: 初期状態

Step 1: GUI_Clear

Step 2: GUI_DrawPolygon
Step 3: GUI_DispString

Step 4: GUI_MEMDEV_CopyToLCD (メモリーデバイスの場合)

 

メモリデバイスの利用

基本手順

  • メモリデバイスの作成(GUI_MEMDEV_CreateというAPI)
  • メモリデバイスを有効にする(GUI_MEMDEV_selectというAPI)
  • 描画操作
  • 描画結果をディスプレイにコピー(GUI_MEMDEV_CopyToLCDというAPI)
  • メモリデバイスを削除(メモリーデバイスが不要になった場合)

 

バンディングメモリデバイス

通常ディスプレイ全体をカバーするのに十分なメモリサイズがないです。バンディングメモリデバイスでは描画領域をいくつかのバンドに分割して1つずつ更新していきます。

 

オートデバイスオブジェクト

オートデバイスオブジェクトはごく小さな表示領域を更新していく、移動ポインターのようなアプリケーションに適します。デバイスは更新が必要になるディスプレイ部分を認識し、最小限の領域をバンディングメモリデバイスで更新していきます。オートデバイスオブジェクトを利用することで全画面領域の更新をせずにすみ、計算処理時間を短縮することができます。

 

メモリデバイスとウィンドウマネージャー

ウィンドウマネージャーとメモリデバイスはシームレスに動作します。メモリデバイスが有効になっている場合、ウィンドウマネージャーはそれぞれメモリデバイスに認識してもらうためのフラグを持ちます。ウィンドウマネージャーのフラグが有効になっている場合、そのウィンドウマネージャーは描画するときに自動的にメモリデバイスを使用するようになります。ウィンドウの描画時にメモリデバイスが作成され、描画が終了するとメモリデバイスを削除します。

利用可能なメモリサイズが十分な場合はウィンドウに対してメモリデバイスが作成し利用します。しかし、利用可能なメモリサイズが十分でない場合はウィンドウマネージャーはバンディングメモリデバイスを作成し利用します。メモリは描画操作時だけ利用されます。バンディングメモリデバイスを利用するのに十分な利用可能なメモリサイズがない場合はメモリデバイスを使用せずディスプレイに直接描画します。

 

パフォーマンス

メモリデバイスを利用することでパフォーマンスに大きな影響を与えることは基本的にありません。またメモリデバイスを使用することでドライバーの動作は簡単になります。遅いドライバを利用している場合、メモリデバイスによりパフォーマンスは向上します。一方、高速なドライバを利用している場合、守りデバイスによりパフォーマンスは少し低下します。バンディングメモリデバイスが利用されると、分割したバンドの数だけ計算時間が増えます。利用可能なメモリサイズが大きければ大きいほどメモリデバイスのパフォーマンスは良くなります。

 

 API

API説明
GUI_MEMDEV_CopyToLCDAA() メモリデバイスの状態をアンチエイリアシングしてLCDに表示
GUI_MEMDEV_CopyToLCDAt() メモリデバイスの状態をLCDの指定した座標に表示
GUI_MEMDEV_Create() メモリデバイスの作成
GUI_MEMDEV_CreateEx() クリエイションフラグ付きのメモリデバイスの作成
GUI_MEMDEV_CreateFixed() 指定した色深度のメモリデバイスを作成
GUI_MEMDEV_Delete() メモリデバイスで使用していたメモリの解放
GUI_MEMDEV_DrawPerspectiveX() 選択されているデバイスに透過エフェクトを書けて指定されたメモリデバイスを描画します
GUI_MEMDEV_GetDataPtr() 直接操作のためのデータエリアのポインターを返します
GUI_MEMDEV_GetXSize() メモリデバイスの幅を返す
GUI_MEMDEV_GetYSize() メモリデバイスの高さを返す
GUI_MEMDEV_MarkDirty() 描画されるエリアをマークします
GUI_MEMDEV_ReduceYSize() メモリデバイスの高さを減らす
GUI_MEMDEV_Rotate() メモリデバイスの回転とその結果の書き込みを近似値を利用して行います
GUI_MEMDEV_RotateHQ() メモリデバイスの回転とその結果の書き込みを高精度で行います
GUI_MEMDEV_Select() 描画対象としてメモリデバイスを選択します
GUI_MEMDEV_SetOrg() LCD上の減点を変更します
UI_MEMDEV_Write() メモリデバイスの内容をメモリデバイスに書き込みます
GUI_MEMDEV_WriteAlpha() メモリデバイスの内容をメモリデバイスにアルファブレンディングを利用して書き込みます
GUI_MEMDEV_WriteAlphaAt() メモリデバイスの内容をメモリデバイスの指定された座標にアルファブレンディングを利用して書き込みます
GUI_MEMDEV_WriteAt() メモリデバイスの内容をメモリデバイスの指定された座標に書き込みます
GUI_MEMEDV_WriteEx() アルファブレンディングとスケーリングを使用してメモリデバイスの内容を合成します
GUI_MEMDEV_WriteExAt() アルファブレンでイングとスケーリングを利用してメモリデバイスの内容を指定した座標に合成します。
GUI_SelectLCD() 描画するLCDの選択
バンディングメモリデバイス
GUI_MEMDEV_Draw() メモリデバイスを利用して描画
オートデバイスオブジェクト
GUI_MEMDEV_CreateAuto オートデバイスオブジェクトの作成
GUI_MEMDEV_DeleteAuto オートデバイスオブジェクトの削除
GUI_MEMDEV_DrawAuto オートデバイスオブジェクトを利用して描画
計測デバイス
GUI_MEASDEV_ClearRect() 計測領域を削除
GUI_MEASDEV_Create() 計測デバイスを作成
GUI_MEASDEV_Delete() 計測デバイスを削除
GUI_MEASDEV_GetRect() 計測結果を返します
GUI_MEASDEV_Select() 描画対象として計測デバイスを選択します

emWinホームに戻る 


SEGGER
RTOS&Middleware