にゃみかんてっくろぐ

猫か百合を見守る壁になりたい

.NET 5: System.Drawing.Common と ImageSharp 、 Windows と Linux でテキストレンダリングの差をみてみる

クロスプラットフォーム。プラットフォーム間の差異に悩まされる地獄だ。

ということで、 .NET 5 でのテキストレンダリングの差を調べてみた。フォントは等幅な Roboto Mono とプロポーショナルな Roboto を用いた。

System.Drawing.Common 5.0.2

Windows の GDI+ API を使うライブラリ。ただし、 Unix 系でも Mono のオープンソース実装 libgdiplus を入れると動作する。ソースコードを拝見すると、 GdiplusNative.Unix.cs といったファイルがあって大変そうだ…

TextRenderingHint プロパティレンダリングモードが指定できるので、すべて試した。

Roboto Mono

f:id:no_clock:20210524013156p:plain
Windows 10 20H2 (200 % 拡大)

f:id:no_clock:20210524013210p:plain
Ubuntu 20.04.1 LTS / libgdiplus 6.0.4+dfsg-2 (200 % 拡大)

f:id:no_clock:20210524012841p:plain
不透明度 50 % で重ねた (200 % 拡大)

全く同じ結果は得られなかったが、 AntiAliasGridFit と ClearTypeGridFit はかなり近い。

Roboto

f:id:no_clock:20210524221129p:plain
Windows 10 20H2 (200 % 拡大)

f:id:no_clock:20210524221205p:plain
Ubuntu 20.04.1 LTS / libgdiplus 6.0.4+dfsg-2 (200 % 拡大)

f:id:no_clock:20210524221221p:plain
不透明度 50 % で重ねた (200 % 拡大)

結構な差が出てしまった。

SixLabors.ImageSharp 1.0.3 / SixLabors.ImageSharp.Drawing 1.0.0-beta11

クロスプラットフォームライブラリ。 System.Drawing 名前空間のドキュメントにも「代替手段」として例示されている。

図形や文字を描画するための SixLabors.ImageSharp.Drawing はまだベータ版で、 Getting StartedAPI 変えるかもよと注意書きが入っている。

カーニング (TextOptions.ApplyKerning) とアンチエイリアス (GraphicsOptions.Antialias) の有無をそれぞれ変更して試した。

Roboto Mono

f:id:no_clock:20210524031007p:plain
Windows 10 20H2 (200 % 拡大)

f:id:no_clock:20210524031028p:plain
Ubuntu 20.04.1 LTS (200 % 拡大)

f:id:no_clock:20210524031040p:plain
不透明度 50 % で重ねた (200 % 拡大)

同じ結果が得られた。

Roboto

f:id:no_clock:20210524221146p:plain
Windows 10 20H2 (200 % 拡大)

f:id:no_clock:20210524221241p:plain
Ubuntu 20.04.1 LTS (200 % 拡大)

f:id:no_clock:20210524221302p:plain
不透明度 50 % で重ねた (200 % 拡大)

プロポーショナルフォントでも同じ結果が得られた。

処理時間

こうなると 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