C
メモリの最適化
以下の最適化機能やテクニックを1つ以上使用することで、フラッシュとRAMのフットプリントを削減できます:
リソース圧縮の有効化
PNG圧縮
ImageFiles.MCU.resourceCompressionを設定すると、PNG圧縮で画像を保存できます。画像は必要なときにキャッシュに展開されます。これにより、バイナリのサイズは小さくなりますが、解凍のオーバーヘッドが追加されます。Qt Quick UltraliteアプリケーションでPNG圧縮を使用する方法の詳細については、ImageFiles.MCU.resourceCompressionを参照してください。
RLE圧縮
ImageFiles.MCU.resourceCompressionを使用する画像とは異なり、RGB888RLE 、XRGB8888RLE 、ARGB888RLE ピクセル形式のRLE画像は、実行時にデコードされます。これによりメモリ使用量は大幅に削減されますが、このような画像の変換(拡大縮小、回転、せん断、透視)はサポートされません。
詳しくはロスレス圧縮画像フォーマットを参照してください。
フレームバッファのサイズ
低い色深度やシングルバッファリングを選択することで、フレームバッファのサイズを最適化できます。フレームバッファサイズの要件についての詳細は、フレームバッファの要件を参照してください。
また、お使いのプラットフォームがハードウェアレイヤーをサポートしている場合は、ハードウェアレイヤーを使用してパフォーマンスを向上させることもできます。詳しくは、ハードウェアレイヤーを使用してパフォーマンスを向上させるを参照してください。
フォントの品質
font.quality プロパティは、低品質のグリフをレンダリングするためのヒントを提供することで、よりきめ細かい最適化を可能にします。QML のフォント品質をFont.QualityVeryLow に設定することで、これらのグリフで消費されるメモリを節約することができます。詳しくはMCU.Config.defaultFontQualityを参照してください。
翻訳からソース言語の文字列を省略する
使用例によっては、翻訳のソース言語文字列がまったくレンダリングされないことがあります。特にIDベースの翻訳を使用する場合、アプリケーションはソース文字列を表示する必要はありません。TranslationFiles.MCU.omitSourceLanguageQmlProject プロパティを使用して、アプリケーションのバイナリからソース文字列を除外します。
Monotype Spark フォントエンジンのメモリーの最適化
MCU.Config.fontEngineを"Spark "に設定してMonotype Sparkフォントエンジンを使用する場合、適用できるフォントエンジン固有のメモリ最適化がいくつかあります:
フォントファイルから未使用のグリフを削除する
フォントマップフォントファイルで Monotype Spark フォントエンジンを使用する場合、Qt Quick Ultralite に同梱されている Monotype の FontmapEditor ユーティリティを使ってフォントファイルのサイズを小さくすることができます。このユーティリティを使うと、フォントエントリに対して unicode の範囲を指定し、未使用のグリフを削除することができます。これは、アプリケーションが必要とするグリフのサブセットが前もってわかっている場合に便利です。特 に日中韓フ ォ ン ト フ ァ イ ルの場合、 未使用グ リ フ を除去す る こ と でサ イ ズが大幅に節約で き る こ と があ り ます。
この機能の使い方の詳細については、FontmapEditor のドキュメントを参照してください。
注: この機能は FontmapEditor バージョン 3.1.1 で使用できます。
Monotype データテーブルを外部フラッシュに配置する
Monotype Spark フォントエンジンを使用する場合、ユニコードおよびシェーピングエンジンで使用されるいくつかのデータテーブルがアプリケーションにリンクされます。これらは合計で約 57 KB のフラッシュメモリーを消費します。
以下に、関連するデータテーブルのシンボル名とバイト単位のサイズを示します:
| データテーブルのシンボル名 | サイズ(バイト |
|---|---|
| 分解データ0 | 4440 |
| 分解データ1 | 1562 |
| 分解データ2 | 200 |
| 分解データ3 | 940 |
| 分解インデックス | 1664 |
| msBidiインデックス | 3286 |
| msBidiLut | 3486 |
| msBidiプロップス | 112 |
| msミラーリングオフセット | 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> tables) 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 ファイルを調べます。
テキストキャッシュ使用時のフォントキャッシュサイズを小さくする
テキストキャッシュを使用する場合、大きなフォントキャッシュを持つ必要はあまりありません。テキスト要素のアルファマップは、いずれにせよテキストキャッシュにキャッシュされます。そのため、フォントキャッシュは必ずしも毎フレームアクセスされる必要はなく、新しいText要素が表示されるときや、テキストが変更されるときだけアクセスされます。
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 の値をチェックすることで、スタック・サイズを適宜小さくすることで、メモリが節約できるかもしれません。
この最適化は、リンカ・スクリプトで固定スタック・サイズが設定されているプ ラットフォーム、またはQt Quick Ultraliteスレッド・スタック・サイズを設定できるFreeRTOS にのみ適用されます。
特定の Qt ライセンスの下で利用可能です。
詳細をご覧ください。