🐥

Xamarin 画像読み込みライブラリ比較 2020

2020/12/05に公開

この記事はXamarin Advent Calendar 2020の5日目の記事です。

2022年5月時点でglidex.formsもXamarin.Forms.Nukeも更新されておらず最新のForms環境ではちゃんと動作しないことが多くお勧めできなくなりました。Xamarin.Formsでは画像読み込みライブラリの最適解はもはや存在しません。MAUIではキャッシュ機能は組み込まれるということなのでそれに期待するしかありません。

画像読み込みライブラリといえば FFImageLoading が有名で、私もずっと使っていました。
ところがFFImageLoadingは2019年5月が最終リリースで、もう1年以上更新がありません。リポジトリを見てみると変更は最近でもあるみたいですが、やや不安ではあります。

そこで、代わりはないかと調べてみるとAndroidはglidex.forms、iOSはXamarin.Forms.Nukeというものがありました。どちらもそれぞれのプラットフォームにあるライブラリを移植したものっぽいです。

どちらもFormsのImageHandlerを登録して標準のImageコントロールでそのまま使えるタイプのもので、既存のコードを変更することなく使えてかなり便利です。この手法の詳細はこちらの記事にありますので興味あればご覧ください。

ということで、実際に使用して比較してみました。

比較条件

FFImageLoadingはCachedImageコントロールを使う形ではなくImageHandlerを使う方式で比較しました。
以下のようなCollectionViewに画像はそれぞれ800KBほどのを20種類使用しました。

<CollectionView ItemSizingStrategy="MeasureFirstItem" ItemsSource="{Binding Images}">
<CollectionView.ItemsLayout>
    <GridItemsLayout Span="3" Orientation="Vertical" HorizontalItemSpacing="2" VerticalItemSpacing="2" />
</CollectionView.ItemsLayout>

<CollectionView.ItemTemplate>
    <DataTemplate>
	<Image HeightRequest="60" BackgroundColor="Gray" Aspect="AspectFill" Source="{Binding}" />
    </DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>

iOS

Android

結果

iOSでは、FFImageLoadingとNukeはほぼ同じくらいの速さですが、AndroidではGlideXが圧倒的に早いですね。AndroidのFFImageLoadingが標準より遅いのは、画像が大きすぎてGCが走りまくってるからだと思います。そしてどちらも標準では話にならない重さでした。重すぎて画面遷移まで引っかかってる感じです。

まとめ

画像読み込みにはAndroidではglidex.forms、iOSではXamarin.Forms.Nukeを使いましょう。
FFImageLoadingは出来ることは非常に多いのですが、今後の更新に不安が残りますね。

Discussion