タッチパネルへの高速表示C言語フレームワーク開発
FA機器などを扱う大手電機会社からご依頼をいただき、PLC(※)内のプログラムをグラフィカルに表示できるタッチパネルへのGUIアプリケーションを開発しました。プログラミング言語はメモリ管理のしやすさからC言語、開発規模はあまり大きくはなくチームメンバーは5名程度で、弊社メンバーは詳細設計から結合テストまでを担当しました。
※PLC:Programmable Logic Controller(プログラマブル・ロジック・コントローラー)
工場などの自動機械やエレベーター、自動ドアなど身近な機械の制御に使われる小型のコンピューターのこと。
【目次】
課題・ご依頼の背景
対象のアプリケーションが扱うデータファイルは当時の組み込みアプリにしてはかなり大きく、最大で数10MBになりました。 対してタッチパネル機器が持つメモリは全部で数MB、データ以外にも管理する情報は多数あるため、データのために利用できるメモリサイズは1MBもありませんでした。 すべてのデータをメモリに読み込むとバッファーオーバーフローになってしまい、かといって毎回必要箇所をファイルの先頭から解析して取り出そうとすると速度が実用に耐えなくなる、そんなメモリ使用量と速度のバランス調整が重要な開発でした。
図形を高速に描画するためのフレームワークの構築
専用機器の組み込み開発ということで一般的なフレームワークなどは存在しておらず、フレームワークを一から作成するところから始まりました。 ライブラリについても、メモリ使用量が把握できないということでオープンソースのものすら使うことができませんでした。 リストや二分木などのコンテナもメモリ使用量やアクセス速度を考慮して実装しました。 広大なキャンバス内に対象の表示図形がX,Y座標で自由に配置されるようなデータを扱うため、開発するフレームワークでは現在表示しているビューに対し高速に表示対象図形を割り出す必要がありました。検討の結果、今回の開発ではメッシュ構造でデータ管理することにしました。
黒線:メッシュ境界線、オレンジ:図形、青:ビューエリア
キャンバスサイズから図形オブジェクト(構造体)リストを持つ2次元配列を生成し、ビューエリアと重なるメッシュセルから表示対象を取得しました。表示対象を最小限に絞ることで、ファイルアクセスを大幅に減らすことができ、高速表示を実現することができました。
メモリ解放と再確保の速度低下を解決
C言語の場合、メモリの取得と解放を明示する必要があります。ひとつ間違えるとアプリケーションが強制終了することもあり、C言語未経験者や学習中の人にとって、このメモリ管理がC言語を難解にしている要因になっていることは間違いないと思います。Javaなどではあまり意識しなくても大きな問題にならないことが多い点です。そして、メモリの取得と解放はOSなどに問い合わせが発生するため、短時間に取得と解放を繰り返し何度も行うと速度低下の要因になりえます。 今回の開発ではデータの管理をメッシュ構造にしスクロール毎に図形オブジェクトを必要な分だけ作るようにしたため、オブジェクトの生成と破棄が頻発するようになりました。組み込み機器のスペックを考慮しても目に見えるほどの速度低下はなかったのですが、計測すると確かに速度は低下しているようだったため、メモリの取得と解放を最適化するように設計しました。 生成と破棄が繰り返される表示対象のオブジェクトは基本的に同程度の情報を保持するため、同一構造体で生成するようにし、破棄されるときに破棄リストに登録しておくようにしました。その後、表示対象のメモリが必要なときには破棄リストに利用可能なメモリが存在する場合はそちらから使用するようにし、メモリの取得と解放を極力減らし速度アップを実現させました。
まとめ
今回はC言語による組み込み開発にてフレームワークからの作成を行いました。対象データを基にデータ構造から最適化しメモリ使用量と処理速度のバランスを取りました。エンドユーザー様にとってもストレスなく利用できる快適なアプリケーションを提供できたのではないかと自負しております。