.NET 5: System.Drawing.Common と ImageSharp 、 Windows と Linux でテキストレンダリングの差をみてみる
クロスプラットフォーム。プラットフォーム間の差異に悩まされる地獄だ。
ということで、 .NET 5 でのテキストレンダリングの差を調べてみた。フォントは等幅な Roboto Mono とプロポーショナルな Roboto を用いた。
- System.Drawing.Common 5.0.2
- SixLabors.ImageSharp 1.0.3 / SixLabors.ImageSharp.Drawing 1.0.0-beta11
- 処理時間
System.Drawing.Common 5.0.2
Windows の GDI+ API を使うライブラリ。ただし、 Unix 系でも Mono のオープンソース実装 libgdiplus を入れると動作する。ソースコードを拝見すると、 GdiplusNative.Unix.cs といったファイルがあって大変そうだ…
TextRenderingHint プロパティでレンダリングモードが指定できるので、すべて試した。
Roboto Mono
全く同じ結果は得られなかったが、 AntiAliasGridFit と ClearTypeGridFit はかなり近い。
Roboto
結構な差が出てしまった。
SixLabors.ImageSharp 1.0.3 / SixLabors.ImageSharp.Drawing 1.0.0-beta11
クロスプラットフォームライブラリ。 System.Drawing 名前空間のドキュメントにも「代替手段」として例示されている。
図形や文字を描画するための SixLabors.ImageSharp.Drawing はまだベータ版で、 Getting Started に API 変えるかもよと注意書きが入っている。
カーニング (TextOptions.ApplyKerning) とアンチエイリアス (GraphicsOptions.Antialias) の有無をそれぞれ変更して試した。
Roboto Mono
同じ結果が得られた。
Roboto
プロポーショナルフォントでも同じ結果が得られた。
処理時間
こうなると ImageSharp を使わない理由はないように見えるが、処理時間に大きな差がある (以下 10 回の平均値)。
プラットフォーム | System.Drawing.Common | SixLabors.ImageSharp |
---|---|---|
Windows 10 20H2 | 27 ms | 419 ms |
Ubuntu 20.04.1 LTS | 59 ms | 282 ms |
詳しく見てみると、 4 行あるテキストの 1 行目のレンダリングだけが遅い。フォントの読み込みだろうか。
タイミング | 経過時間 (Windows 10 20H2) |
経過時間 (Ubuntu 20.04.1 LTS) |
---|---|---|
新規画像生成 (640x480, 白塗りつぶし) |
38 ms | 43 ms |
FontCollection, Font 作成 | 60 ms | 72 ms |
1 行目レンダリング | 365 ms | 228 ms |
2 行目レンダリング | 368 ms | 231 ms |
3 行目レンダリング | 372 ms | 234 ms |
4 行目レンダリング | 375 ms | 238 ms |
PNG 画像出力 | 419 ms | 282 ms |