このページでは

C

リソースの管理

このトピックでは、Qt Quick Ultralite アプリケーションが画像リソースを使用する方法について説明します。

フォントリソースはリソースシステムを通して追加されません。フォント処理の詳細については、テキストレンダリングとフォントを参照してください。

画像キャッシュのトピックも参照してください。

概要

Qt Quick Ultralite アプリケーションでリソースを使用するには、QmlProject API を使用して宣言する必要があります。

Resource Compiler(qulrccツール)はリソース宣言を使用して、インクルードするためのコンテンツを準備します。生のリソースデータに対して最適化を実行することもあります。例えば、画像の最適化として、色深度を下げたり、アルファマップに置き換えたり、アウトラインの透明部分を削除したり、スウィズリングを行ったりします。

リソースシステムへのファイルの追加

Qt Quick Ultralite アプリケーションにリソースを追加するには、ImageFiles.filesQmlProject プロパティを使用します。

ImageFiles {
    files: ["ui/spinner.png", "background.png"]
}

ImageFiles.files プロパティは、仮想リソース ファイルシステムにファイルを追加します。ファイルシステム内のリソースは、オプションの "qrc: "スキームを持つリソースURIを通して参照されます。

qrc:/
  |-- background.png
  |-- ui/
       |-- spinner.png

上記の例では、qrc:/ui/spinner.png がソースディレクトリのui/spinner.pngファイルに基づくリソースデータのリソース URI です。このURIをsource として、Image

Image {
    source: "qrc:/ui/spinner.png"
}

リソースURIに相対パスを使用する場合、パスは仮想リソースファイルシステムのルートからの相対パスとなります。URIのスキームは省略できます。以下の URI はすべてui/spinner.png を参照しています:

  • ui/spinner.png
  • /ui/spinner.png
  • qrc:ui/spinner.png
  • qrc:/ui/spinner.png
  • qrc:///ui/spinner.png

リソースプロパティ

オプションとして、QmlProjectImageFilesノードで利用可能なプロパティのリストから、ImageFiles.files を使ってリストされた画像一式のリソースプロパティを設定することができます。

ImageFiles {
    files: ["image.png"]
    MCU.resourceCompression: true
}

画像リソースは、画像がデバイスにどのように保存されるかを制御したり、さまざまな最適化をトリガーしたりする、多くのリソース・プロパティをサポートしています。プロパティの全リストはQmlProject Manualを参照してください。

次の例では、大きなbackground.pngはImageFiles.MCU.resourceCompressionを設定することで、圧縮された形式で保存されています。一方、spinner.pngは、実行時の回転のために最適化するために、ImageFiles.MCU.resourceOptimizeForRotationでタグ付けされています:

ImageFiles {
    files: ["spinner.png"]
    MCU.resourceOptimizeForRotation: true
}
ImageFiles {
    files: ["background.png"]
    MCU.resourceCompression: true
}
Image {
    source: "qrc:/background.png"

    Image {
        anchors.centerIn: parent
        source: "qrc:/spinner.png"
        transform: Rotation {
            NumberAnimation on angle { from: 0; to: 360; running: true; loops: Animation.Infinite }
        }
    }
}

ロスレス圧縮画像フォーマット

Qt for MCUs は、ImageFiles.MCU.resourceCompressionの代替として、Run-Length Encoding(RLE)圧縮形式をサポートしています。これは、画像の重要な部分が同じ色である場合に便利です。ImageFiles.MCU.resourceImagePixelFormatプロパティのRLEフォーマットオプションは、次のとおりです:RGB888RLE,XRGB8888RLE, およびARGB888RLE

サポートされる RLE フォーマットはプラットフォームによって異なります。したがって、AutomaticCompressedLossless オプションを使用して、プラットフォームのMCU.Config.platformOpaqueCompressedLosslessResourcePixelFormatおよびMCU.Config.platformAlphaCompressedLosslessResourcePixelFormat設定に応じて、理想的なフォーマットを自動的に選択します。

AutomaticCompressedLossless を使用する利点は、画像を画像キャッシュに解凍することなく、ブレンド中にその場で画像をデコードできることです。つまり、ImageFiles.MCU.resourceCompressionを使用する画像に比べて、必要な揮発性メモリが少なくて済みます。

しかし、平均圧縮率はそれほど良くなく、変換された画像はサポートされていません。また、ほとんどのプラットフォームでCPUフォールバックを使用するため、ブレンド性能に悪影響を及ぼす可能性があります。半透明のピクセルを多く含む画像や、計算されたItem::opacity の値が1より小さい場合、CPUは通常ブレンディングに時間がかかります。RLE ピ ク セル形式のハー ド ウ ェ ア加速ブ レ ンデ ィ ン グ をサポー ト す る プ ラ ッ ト フ ォームについては、 「サポー ト さ れてい る 機能」 の表を参照。

次の表は、2 つの画像例と、それらの非圧縮サイズと圧縮サイズ(RLE または PNG)を示しています。最初の画像は、同じピクセル値を含む領域が連続しているため、非常によく圧縮されます。このような画像をImageFiles.MCU.resourceCompressionを使用してPNGに圧縮すると、圧縮率はさらに向上しますが、画面に描画する前に画像キャッシュに展開する必要があります。

画像

非圧縮82.9 kB82.9 kB
RLE圧縮23.2 kB72.6 kB
PNG圧縮6.7 kB27.5 kB

ブレンドのパフォーマンスを向上させるために、PNG圧縮とRLE圧縮のどちらを使用するかについて、いくつかの有用なヒューリスティックを紹介します:

  • OnStartup キャッシュポリシー- アプリケーションに十分なフラッシュメモリと揮発性メモリがあるプラットフォーム。
  • RLE圧縮 - 中間バッファなしでハードウェアアクセラレーションによるブレンディングをサポートするプラットフォーム。パフォーマンスのオーバーヘッドが許容できるのであれば、ハードウェアアクセラレーションなしのプラットフォームでも使用できます。
  • ImageFiles.MCU.resourceCompressionによるPNG圧縮 - すべての非圧縮画像リソースを保存するのに必要なメモリが十分でないプラットフォーム。画像キャッシュが、画面に表示されるすべての画像を同時に収めるのに十分な大きさであれば、必要な画像はすべて揮発性メモリにあるため、アニメーションのパフォーマンスは良好になります。
  • AutomaticCompressedLossless または、キャッシュなしで非圧縮画像をフラッシュメモリに保持します。揮発性メモリが限られているプラットフォームでは、PNG圧縮はオプションではないので、この2つのテクニックのどちらかが理想的です。

ここでは、指定した画像リソースに対して可逆圧縮の使用を有効にする方法を説明します:

ImageFiles {
    files: ["example.png"]
    MCU.resourceImagePixelFormat: "AutomaticCompressedLossless"
}

メモリ内のリソース配置

デフォルトでは、リソースはQulResourceData という名前の予約済みメモリセクションに配置されます。ImageFiles.MCU.resourceStorageSectionプロパティを設定することで、リソースを別の記憶セクションに配置することができます。ImageFiles.MCU.resourceCachePolicyプロパティは、リソースが揮発性メモリにロードされるタイミングと方法を制御します。異なる種類の揮発性メモリ(例えば、RAM、VRAM、またはHyperRAM)が使用可能な場合、ImageFiles.MCU.resourceRuntimeAllocationTypeプロパティを使用して、指定されたリソースに使用する揮発性メモリ領域を選択することができます。

次の例では、Arrows という名前のメモリ・セクションに3つの画像が格納されています。

ImageFiles {
    files: [
        "images/arrow-0.png",
        "images/arrow-45.png",
        "images/arrow-90.png",
    ]
    MCU.resourceStorageSection: "Arrows"
}
Arrows :
{
    . = ALIGN(4);
    *(Arrows)
} > QSPI_FLASH

セクション名は、リンカースクリプトで同名のセクションが定義されている限り、自由に選ぶことができる。セクションの開始アドレスは、同じセクション内のリソースの中で最大のアライメント要件に合わせ る必要がある。

Arrows :
{
    . = ALIGN(4);
    *(Arrows)
} > QSPI_FLASH

OTAリソースの更新

あるリソースをOTA(Over-the-Air)アップデートしたい場合、上記の「メモリ内のリソース配置」にあるように、これらのリソースを特定のメモリ・セクション(例えばOTAResourceSection )に配置する必要があります。

ユーザーがホスト上で OTA アップデートの一部であるイメージを更新すると、指定されたターゲッ ト・アプリケーション用にOTAResourceSection のバイナリ・コンテンツを再生成することができます。

このようなバイナリ生成はResource Compilerによって実行され、CMake を介して次のように呼び出すことができます:

cmake --build . --target <application>_resource_binaries

アプリケーション全体を再コンパイルする必要はありません。リソース・バイナリはqul_resources_<section_name>.bin という名前で(たとえばqul_resources_OTAResourceSection.bin )、ターゲット・アプリケーションのビルド・フォルダにあります。

イメージの一部はキャッシュされるか(OnDemand )、ImageFiles.MCU.resourceCachePolicy を使用して起動時にプリロードされる(OnStartup )ため、OTA アップデートのイメージをアプリケーションで有効に使用するには、Qt Quick Ultralite アプリケーションを再起動する必要があります。

アプリケーションの起動中、Qul::initResources ()の戻り値を使用して、リソースの初期化が成功したかどうかを判断できます。失敗した場合は、更新されたリソース・データが破損しているか、アプリケーションが元々ビルドされていたリソース・データと互換性がないことを示している可能性があります。互換性を保つためには、リソースパスはすべて元のリソースデータと一致していなければなりません。変更できるのは、リソースの設定と実際の画像コンテンツだけです。

注意: OnDemand キャッシュ ポリシーまたはImageFiles.MCU.resourceCompression を使用する画像については、アプリケーションが元々ビルドされていたリソース キャッシュのサイズに収まるようにしてください。

リソースデータのチェックサム検証

リソースの初期化中にリソースのバイナリ・データのチェックサム検証を行うには、まずQul::enableResourceChecksumVerification() 関数を使用してリソースのチェックサム検証を有効にする必要があります。

リソースデータのバージョン管理

リソース・バイナリ・データのメジャー・バージョンとマイナー・バージョンを指定することも可能です。その場合、Qul::initResources ()は読み込まれたリソース・データのメジャー・バージョンとマイナー・バージョンを、アプリケーションが最初にビルドされたときのメジャー・バージョンとマイナー・バージョンと比較します。

読み込まれたリソース・データのメジャー・バージョンがアプリケーションのメジャー・バージョンより低い場合、または読み込まれたリソース・データのメジャー・バージョンは一致するがマイナー・バージョンがアプリケーションのマイナー・バージョンより低い場合、Qul::ResourceInitializationError::VersionTooLow

読み込まれたリソース・データのメジャー・バージョンがアプリケーションのメジャー・バージョンより高い場合、Qul::ResourceInitializationError::VersionTooHigh

ロードされたリソース・データのメジャー・バージョンがアプリケーションのメジャー・バージョンと等しく、ロードされたリソース・データのマイナー・バージョンがアプリケーションのマイナー・バージョン以上である場合、そのバージョンは有効であるとみなされます。

バージョンは、ResourceStorageSection.majorVersionおよびResourceStorageSection.minorVersionAPIなどを使用して、.qmlproject ファイルで手動で指定する必要があります:

MCU.Config {
        ResourceStorageSection
        {
            name: "OTAResourceSection"
            majorVersion: 2
            minorVersion: 1
        }
}

備考

  • 新しいバイナリ・データを生成する以外に、Qt Quick Ultraliteは、データをフラッシュ・メモリに書き換えるための直接的なメカニズムを提供していません。アプリケーション固有のソリューションを実装する必要があります。
  • リソースのバイナリー・コンテントはリトルエンディアン・フォーマットです。
  • ファイル名はQMLアプリケーションで元々使用されていたものと一致させる必要があります。そうでないとリソース検索に失敗します。
  • 他のメモリ領域への上書きを避けるため、OTA アップデートのセクション部分は Flash の最後に配置する必要があります。
  • フラッシュ・メモリはブロックごとに消去し、書き換える必要があります。バイナリ・データが正確なブロック境界で始まり、ブロック境界で終わらない場合、消去されるメモリ・ブロックの古いデータを読み出す必要があるかもしれません。使っているフラッシュ・ツールやライブラリーが自動で処理しない場合は、この点を考慮に入れてください。

スプライト・アニメーションのリソース・プロパティ

スプライト・アニメーションには、コンパイル時にいくつかの前処理が必要です。リソース・プロパティは、処理に有用な情報を与え、リソースの最適化を可能にします。

アニメーション・ソースとしてのディレクトリ

スプライトアニメーションソースは、AnimatedSpriteDirectory QML型が読み込んでレンダリングできる一連の画像ファイルを持つディレクトリにすることができます。このような画像ファイルには、コンパイル時にディレクトリ名を特定できるように、.qmlproject ファイルにImageFiles.MCU.resourceAnimatedSpriteとタグ付けしてください。

    ImageFiles {
        files: [
            "loading/01.png",
            "loading/02.png",
            "loading/03.png",
            "loading/04.png"
        ]
        MCU.resourceAnimatedSprite: true
    }

これにより、画像ファイルのディレクトリを特定し、AnimatedSpriteDirectorysourcePath として使用することができます。次の例は、その方法を示しています:

import QtQuickUltralite.Extras

AnimatedSpriteDirectory {
    sourcePath: "loading"
}

スプライト・アニメーションのリソース最適化

スプライトアニメーションの別々のイメージファイルは、コンパイル時に一連のイメージを分析した後、リソースストレージを最適化する機会を提供します。Resourceコンパイラ(qulrccツール)は、画像から共通部分を見つけ出し、それらを再利用することで、メモリフットプリントを削減します。

AnimatedSprite QMLタイプの画像ソースにImageFiles.MCU.resourceAnimatedSpriteFrameWidthと ImageFiles.MCU.resourceAnimatedSpriteFrameHeightを指定することで、別フレームの利点をすべて得ることができます。

Qt Quick Ultralite sprite_animations Exampleではqt-image-sequence.pngは16フレームあります。イメージソースにImageFiles.MCU.resourceAnimatedSpriteFrameWidthと ImageFiles.MCU.resourceAnimatedSpriteFrameHeightを設定すると、リソースコンパイラが内部で16フレームを生成します。

フレーム#0

フレーム#1

フレーム#2

フレーム#3

フレーム#4

フレーム#5

枠 #6

枠 #7

枠 #8

枠 #9

枠 #10

枠 #11

枠 #12

フレーム#13

フレーム#14

フレーム#15

この前処理により、アプリケーションは画像ソースよりもはるかに小さい画像サイズの各フレームのみをロードするため、画像ソースの実行時のメモリ領域が削減されます。また、Resource Compilerは、フレームシーケンス間で共通部分を共有することで、同じ最適化を適用します。

外部ストレージからのリソース

MCU.resourceAsFileプロパティを使用して、外部ストレージから読み込むリソースを設定できます。

ImageFiles {
    files: [ "2008.png" ]
    MCU.prefix: "logos"
    MCU.resourceAsFile: true
    MCU.resourceCompression: false
}

有効にすると、画像は処理されますが、アセットには含まれません。代わりに、デバイス上のファイルシステムに手動でコピーする別のファイルとして作成されます。

これらのリソースを使用するには、file:// プロトコルを使用する必要があります。

Image {
    source: "file://logos/2008.png"
}

画像パスにプレフィックスを追加したり、RLE圧縮を有効にするなど、他のアセットプロパティも適用できます。

注意: ローカルファイルシステム上のリソースへのアクセスを可能にするFilesystem プラットフォーム API は、テクノロジープレビューの状態です。今後のリリースで変更される可能性があります。

外部ストレージからのアセットのロードには、潜在的なセキュリティ上の脅威があります。

警告 外部ストレージからアセットをロードすると、デバイスに対する攻撃ベクトルが作成されます。

Qt Quick Ultralite は、アセットおよびアセットがロードされるファイルシステムを検証しません。外部ストレージ上の操作されたデータは、デバイスを侵害するために使用される可能性があります。

ファイルシステムからロードされたデータが有効であることを確認するのはユーザーの責任です。これは、物理的にアクセスを遮断するか、ブートフェーズ中に暗号的に検証することで達成できる。

想定される攻撃対象

  • 画像データが無効な場合の PNG および RLE デコーダー。
  • 無効なデータブロックがある場合のファイルシステムの実装。
  • サイズが大きすぎる画像や、データが宣言されたサイズと一致しない画像のレンダリングとメモリ管理。

ImageFiles.MCU.resourceImagePixelFormatMCU.Config.binaryAssetOptionsImageFiles.MCU.prefixImageFiles.MCU.resourceCompressionも参照してください


詳細はこちら。