C
メモリの最適化
以下の最適化機能や手法を1つ以上使用することで、フラッシュおよびRAMの占有容量を削減できます。
リソースの圧縮を有効にする
PNG圧縮
ImageFiles.MCU.resourceCompression を設定することで、画像を PNG 圧縮形式で保存できます。画像は必要なときにキャッシュ内で展開されます。これによりバイナリサイズは縮小されますが、展開処理のオーバーヘッドが発生します。Qt Quick Ultralite アプリケーションでの PNG 圧縮の使用に関する詳細については、ImageFiles.MCU.resourceCompression を参照してください。
RLE圧縮
ImageFiles.MCU.resourceCompression を使用する画像とは異なり、RGB888RLE 、XRGB8888RLE 、およびARGB888RLE ピクセル形式の RLE 画像は、実行時にデコードされます。これによりメモリ使用量は大幅に削減されますが、これらの画像に対する変形(拡大縮小、回転、せん断、遠近法)はサポートされません。
詳細については、「ロスレス圧縮画像フォーマット」を参照してください。
フレームバッファのサイズ
色深度を低く設定したり、シングルバッファリングを選択したりすることで、フレームバッファのサイズを最適化できます。フレームバッファのサイズ要件に関する詳細については、「フレームバッファの要件」を参照してください。
また、お使いのプラットフォームが対応している場合は、ハードウェアレイヤーを使用してパフォーマンスを向上させることもできます。詳細については、「ハードウェアレイヤーを使用したパフォーマンスの向上」を参照してください。
使用していないコアライブラリ機能を無効にする
Qul::initializeCoreFeatures API を使用すると、アプリケーションで使用しない機能を無効にすることができます。
注: アプリケーションが利用できない機能を使用している場合 、Qt Quick Ultralite はランタイムエラーを記録し、アプリケーションを停止します。
フォントの品質
font.quality プロパティを使用すると、低品質のグリフをレンダリングするためのヒントを提供することで、よりきめ細かな最適化が可能になります。QML でフォント品質を `Font.QualityVeryLow` に設定することで、それらのグリフが消費するメモリを節約できます。詳細については、MCU.Config.defaultFontQuality を参照してください。
翻訳からソース言語の文字列を省略する
使用ケースによっては、翻訳のソース言語文字列がまったくレンダリングされない場合があります。特にIDベースの翻訳を使用する場合、アプリケーションがソース文字列を表示することは想定されていません。TranslationFiles.MCU.omitSourceLanguageQmlProjectプロパティを使用して、アプリケーションバイナリからソース文字列を除外してください。
Monotype Spark フォントエンジンのメモリ最適化
MCU.Config.fontEngine を"Spark" に設定して Monotype Spark フォントエンジンを使用する場合、フォントエンジン固有のメモリ最適化をいくつか適用できます:
フォントファイルから未使用のグリフを削除する
Monotype Spark フォントエンジンをfontmap フォントファイルと組み合わせて使用する場合、Qt Quick Ultralite に同梱されている Monotype の FontmapEditor ユーティリティを使用して、フォントファイルのサイズを縮小することができます。このユーティリティを使用すると、フォントエントリの Unicode 範囲を指定し、未使用のグリフを削除することができます。 これは、アプリケーションで必要なグリフのサブセットが事前に分かっている場合に役立ちます。特にCJKフォントファイルの場合、未使用のグリフを削除することで、ファイルサイズを大幅に削減できます。
この機能の使用方法の詳細については、FontmapEditorのドキュメントを参照してください。
注:この 機能は 、FontmapEditor バージョン 3.1.1 で利用可能です。
Monotype データテーブルを外部フラッシュに配置
Monotype Spark フォントエンジンを使用する場合、Unicode エンジンおよびシェーピングエンジンで使用されるいくつかのデータテーブルがアプリケーションにリンクされます。これら全体で、約 57 KB のフラッシュメモリを消費します。
以下に、関連するデータテーブルのシンボル名と、そのサイズ(バイト単位)の一覧を示します。
| データテーブルのシンボル名 | サイズ(バイト) |
|---|---|
| decompositionData0 | 4440 |
| decompositionData1 | 1562 |
| decompositionData2 | 200 |
| 分解データ3 | 940 |
| 分解インデックス | 1664 |
| msBidiIndex | 3286 |
| msBidiLut | 3486 |
| msBidiProps | 112 |
| msMirroringOffset | 112 |
| msDLPTrieData | 9814 |
| msDLPTrieIndex | 4096 |
| msGeneralPropsArray | 1056 |
| msGeneralPropsIndex | 10268 |
| msGeneralPropsLut | 13332 |
| MsScriptRangesTable | 2680 |
| 合計 | 57048 |
注: MsScriptRangesTableは 、MCU.Config.complexTextRendering が有効になっている場合にのみ含まれます。これはデフォルトで有効になっています。
リンカースクリプトをカスタマイズして、これらのデータテーブルを外部フラッシュメモリに配置するように設定することで、この内部フラッシュメモリをコードやその他の重要なデータ用に確保することができます。
アプリケーションの起動時に Monotype データテーブルのデータ整合性を検証するには、bool Qul::validateMonotypeDataTableChecksums (Qul::Flags<MonotypeDataTable> テーブル)API を使用できます。
以下に、サポートされている各種ツールチェーン向けにリンカースクリプトを変更する方法の例を示します。
GNUリンカー互換のリンカースクリプト (.ld)
MonotypeDataTables :
{
*(.rodata.decompositionData0)
*(.rodata.decompositionData1)
*(.rodata.decompositionData2)
*(.rodata.decompositionData3)
*(.rodata.decompositionIndex)
*(.rodata.msBidiIndex)
*(.rodata.msBidiLut)
*(.rodata.msBidiProps)
*(.rodata.msMirroringOffset)
*(.rodata.msDLPTrieData)
*(.rodata.msDLPTrieIndex)
*(.rodata.msGeneralPropsArray)
*(.rodata.msGeneralPropsIndex)
*(.rodata.msGeneralPropsLut)
*(.rodata.MsScriptRangesTable)
} > EXTERNAL_FLASHIARリンカースクリプト (.icf)
"MonotypeDataTables":
place in EXTERNAL_FLASH {
ro symbol decompositionData0,
ro symbol decompositionData1,
ro symbol decompositionData2,
ro symbol decompositionData3,
ro symbol decompositionIndex,
ro symbol msBidiIndex,
ro symbol msBidiLut,
ro symbol msBidiProps,
ro symbol msMirroringOffset,
ro symbol msDLPTrieData,
ro symbol msDLPTrieIndex,
ro symbol msGeneralPropsArray,
ro symbol msGeneralPropsIndex,
ro symbol msGeneralPropsLut,
ro symbol MsScriptRangesTable
};GHSリンカースクリプト (.ld)
GHSは個々のシンボルの配置をサポートしていないため、データテーブルを含むファイルの.rodata セクション全体を外部フラッシュに配置する必要があります:
.MonotypeDataTables :{
// decompositionData0, decompositionData1,
// decompositionData2, decompositionData3,
// decompositionIndex
"libQulMonotypeUnicode*.a"("*nfddat*.o")(.rodata)
// msBidiIndex, msBidiLut, msBidiProps, msMirroringOffset
"libQulMonotypeUnicode*.a"("*biddat*.o")(.rodata)
// msDLPTrieData, msDLPTrieIndex
"libQulMonotypeUnicode*.a"("*dlpdat*.o")(.rodata)
// msGeneralPropsArray, msGeneralPropsIndex, msGeneralPropsLut
"libQulMonotypeUnicode*.a"("*prp*.o")(.rodata)
// MsScriptRangesTable
"libQulWorldTypeSpark*.a"("*dat*.o")(.rodata)
} > EXTERNAL_FLASH上記のシンボル名(およびそれに対応する「TableSize」シンボル)のみが .MonotypeDataTables セクションに配置されていることを確認するには、生成された.map ファイルを確認してください。
テキストキャッシュを使用する場合は、フォントキャッシュのサイズを縮小する
テキストキャッシュを使用する場合、大きなフォントキャッシュを用意する必要性は低くなります。テキスト要素のアルファマップは、いずれにせよテキストキャッシュにキャッシュされます。そのため、フォントキャッシュには必ずしも毎フレームアクセスされるわけではなく、新しいテキスト要素が表示されたときやテキストが変更されたときにのみアクセスされます。
MCU.Config.fontCacheSize を設定することで、パフォーマンスに大きな影響を与えることなく、フォントキャッシュのサイズを大幅に縮小することが可能です。
MCU.Config {
fontCacheSize: 16384 // reduce the font cache size when the text cache is enabled
}一般的に、フォントキャッシュのサイズを縮小し、その分をテキストキャッシュに割り当てることで、パフォーマンスが向上します。詳細については、「テキストのキャッシュ」を参照してください。
アプリケーションのスタックサイズを縮小する
プロファイリングの結果によると、Qt for MCUs のサンプルやデモでは、スタックメモリの使用量は11 kBを超えません。安全を期して、デフォルトのスタックサイズは24 kBに設定されています。アプリケーションのベンチマークを実施し、QulPerf::maxStackUsage の値を確認することで、スタックサイズを適切に縮小し、メモリを節約できる可能性があります。
FreeRTOSこの最適化は、リンカースクリプトで固定のスタックサイズが設定されているプラットフォーム、またはQt Quick で の Ultraliteスレッドのスタックサイズを設定できる場合にのみ適用されます。
特定のQtライセンスで利用可能です。
詳細はこちらをご覧ください。