WinForms は .NET 1.0 の時代から GDI+ で描画してきました。GDI+ は CPU で描きます。格子線も、塗りつぶしも、表示しているすべてのセルの文字も、フレームのたびにプロセッサーが画面に描いています。1440p のモニターでスプレッドシートを最大化すると、見えているセルは 1,000 を超え、その費用をスクロールのたびに払うことになります。WinForms のアプリで大きなシートをスクロールすると、どこか重く感じるのはこのためです。
ReoGrid One 5.2 では、WinForms 版のコントロールに 2 つ目の描画方式として Direct2D を加えました。 セルは GPU で描き、文字は DirectWrite で組みます。設定はプロパティ 1 つで、スクロール時の全面再描画は 3.6 ms から 1.0 ms に縮まります。
弊社で調べた範囲では、これにより ReoGrid One は Direct2D によるハードウェアアクセラレーションを備えた世界初の WinForms 向けスプレッドシートコンポーネントになりました。
「世界初」について — 2026 年 10 月に WinForms 向けの主要な商用スプレッドシートコンポーネントを調べた範囲では、Direct2D で描画する製品は見つかりませんでした。自社の WinForms 版スプレッドシートが自社の DirectX 描画に対応していないことを明記している製品もあります。ハードウェアアクセラレーションそのものは新しい技術ではなく、WPF は DirectX で描画しますし、WinForms のデータグリッドには DirectX で描画できる製品もあります。「世界初」は WinForms 向けスプレッドシートコンポーネントとしての意味です(2026 年 10 月時点、当社調べ)。
5.2 では Direct2D のほかにも多くの場面が速くなりました。WPF と Avalonia は 1 フレームの描画が数倍速くなり、結合セルやチェックボックスの多いシートは描画時間が数分の一になり、複数シートのブックへの値の書き込みは約 2 倍速くなりました。この記事では、それぞれを実測値とともに紹介します。
概要
| プラットフォーム | 計測した内容 | 変更前 | 5.2 | |
|---|---|---|---|---|
| WinForms | スクロール時の全面再描画、1400×900 のウィンドウ | 3.6 ms(GDI+) | 1.0 ms(Direct2D) | 約 3.5 倍 |
| WPF | スクロール時の 1 フレームの UI スレッド時間、1400×900 | 約 10 ms | 約 1.5 ms | 約 7 倍 |
| Avalonia | 150% で最大化したウィンドウ、毎フレーム 108 セルを更新 | 15 fps | 120 fps | 8 倍 |
| 共通 | 結合セル 50,000 件を持つ 10 万行のシートの 1 フレーム(GDI+) | 148〜160 ms | 9.4 ms | 約 16 倍 |
「変更前」は 5.1 です。ただし Avalonia のフレームレートは 5.0.0 で計測したもの、WinForms は既定の描画方式である GDI+ との比較です。時間は 1 フレームあたりで、小さいほど速いことを表します。計測の方法と環境は記事の最後にまとめています。
Direct2D を有効にする
コントロールのプロパティを 1 つ設定します。
using unvell.ReoGrid.WinForms;
grid.Renderer = GridRenderer.Direct2D;
// Direct2D を使えない環境では、GDI+ のまま描画を続ける
if (grid.ActiveRenderer != GridRenderer.Direct2D)
Console.WriteLine("GDI+ で描画しています");
アプリのコードはそのままお使いいただけます。ワークブック・ワークシート・編集の API はどちらの描画方式でも同じように動き、実行中の切り替えも、セルの編集中を含めていつでもできます。
描画方式が違っても、結果は一致する
Direct2D に切り替えて変わるのは描き方だけで、描かれるシートはそのままです。そのために次の点を揃えています。
- 格子線と罫線は、100〜200% のどの倍率でも GDI+ と同じピクセルに描かれます。 1 ピクセルの線は 1 ピクセルのままです。
- セル内エディタ、列幅・行高の自動調整、はみ出し表示は、描画と同じ方式で文字を測ります。 入力中の文字はセルに表示される位置と揃い、自動調整した列幅は実際に描かれる文字にぴったり合います。
- 文字は DirectWrite のアンチエイリアスで描かれるため、GDI+ とは見た目がわずかに異なります。
- 印刷(
CreatePrintDocument)とRenderTo(graphics, …)は、どちらの描画方式を選んでいても GDI+ で描きます。 - 表示中の画面を画像にするときは、
RenderToBitmapが選択中の描画方式のまま描きます。ウィンドウを使わずに描けます。
using System.Drawing.Imaging;
// 論理サイズ 800×500 を 1.5 倍(1200×750 px)で。描画方式は ActiveRenderer に従う
using var bitmap = grid.RenderToBitmap(800, 500, scale: 1.5f);
bitmap.Save("sheet.png", ImageFormat.Png);
動作条件
Direct2D は x64 と x86 のプロセスで動作します。GPU を使えない環境では、Direct3D のソフトウェア描画(WARP)で動作します。ARM64 のプロセスは、現時点では GDI+ で描画します。
Direct2D を使えない環境では、Renderer を Direct2D にしても GDI+ で描画を続けます。どちらで描いているかは ActiveRenderer で確認できます。
詳しくは WinForms のリファレンスを参照してください。
どれだけ速くなるか
| 場面(WinForms) | GDI+ | Direct2D |
|---|---|---|
| スクロール時の全面再描画、1400×900 のウィンドウ | 3.6 ms / フレーム | 1.0 ms / フレーム |
1 フレームで描くセルが多いほど差が開くため、画面全体を描き直すスクロールでいちばん大きな差が出ます。すべてのセルが毎フレーム変わる画面については、後述の「ライブデータ」の節をご覧ください。
WPF と Avalonia — 変わらないセルの描画がほぼゼロに
WPF と Avalonia も 5.2 で速くなりました。値が同じままのセルは、ほとんど時間をかけずに再描画します。 1 フレームの時間は、画面に見えているすべてのセルではなく、変わったセルの数で決まるようになりました。
パッケージを更新してリビルドすれば、そのまま効果があります。
WPF — 1400×900 のウィンドウに数値(2,000 行 × 12 列)を表示し、300 フレームスクロール:
| 5.1 | 5.2 | |
|---|---|---|
| 1 フレームの UI スレッド時間 | 10.0〜10.3 ms | 1.1〜1.5 ms |
| 画面に届くフレームの間隔 | 15.2 ms | 8.5〜8.7 ms |
Avalonia — 100 行 × 20 列の数値を表示した画面、1 フレーム:
| 5.1 | 5.2 | |
|---|---|---|
何も変わらない("0.00" 書式) | 25.7 ms | 4.9 ms |
108 セルが変わる("0.00") | 24.4 ms | 5.1 ms |
| 108 セルが変わる(書式なし) | 71.1 ms | 8.6 ms |
| すべてのセルが変わる(書式なし) | 73.1 ms | 28.2 ms |
| 1 フレームで確保するメモリ(何も変わらないとき) | 16.2 MB | 1.9 MB |
実際の画面でも、150% で最大化した Avalonia のウィンドウ(68 行 × 20 列)で毎フレーム 108 セルを更新する場合、15 fps から 120 fps になりました。
この最後の例こそ、今回のリリースが狙った画面です。株価やセンサーの値、生産数を映すライブボードでは、数十のセルが刻々と変わり、残りは止まっています。5.1 では止まっているセルも変わるセルとほぼ同じ費用がかかっていましたが、5.2 ではごくわずかです。1 フレームで確保するメモリも 9 割近く減ったので、ガベージコレクションの負担も大きく軽くなります。
ライブデータ — 毎フレーム変わる数値
グリッドにとっていちばん厳しいのは、見えているすべてのセルが毎フレーム変わる場面です。書式なし(General)の数値は Excel と同じく列幅に合わせて表示します。収まる桁まで丸め、整数部も入らなければ指数表記にします。
5.2 で、2560×1440・100%、58 行 × 20 列 = 1,160 セルを表示し、そのすべてが毎フレーム変わる場合(書式なし):
| 描画方式 | 1 フレームの時間 |
|---|---|
| WinForms(Direct2D) | 9.1 ms |
| WinForms(GDI+) | 11.2 ms |
| Avalonia | 11.8 ms |
| WPF | 27.4 ms(35 fps) |
Direct2D なら、この場面でも 60 fps の 1 フレーム(16.7 ms)に十分収まります。"0.00" のような書式付きの数値なら同じ場面が Direct2D で 6.4 ms、時刻の列と 8 セルが毎フレーム変わる、より一般的なライブ画面なら 2.4 ms です。
結合セルやセル型の多い大きなシート
見出し行を結合してグループ分けした帳票や、各行にチェックボックスを置いたチェックリストでは、1 枚のシートに大量の結合セルやセル型が並びます。5.1 では、1 フレームの描画時間が、画面のずっと外にあるものも含めてシート全体の件数に比例して増えていました。5.2 では、表示している範囲の分だけで済みます。 コードから結合やセル型を設定する処理も同じく速くなりました。
100,000 行 × 20 列のシートで 100 行 × 20 列を表示し、GDI+ で描画した場合:
| 5.1 | 5.2 | ||
|---|---|---|---|
| 2 行の結合 50,000 件 | 作成 | 945 ms | 11.6 ms |
| 1 フレームの描画 | 148〜160 ms | 9.4 ms | |
| チェックボックス 30,000 件(セル単位で設定) | 設定 | 1,713 ms | 3.7 ms |
| 1 フレームの描画 | 36〜45 ms | 9.3〜9.5 ms |
150 ms かかっていた 1 フレーム(7 fps 未満で、スクロールが目に見えて引っかかります)は 10 ms 未満になり、作るのに 2 秒近くかかっていたシートは数ミリ秒で準備できます。
複数シートのブックへの書き込みを高速化
シートが複数あり数式の無いブックでは、値の書き込みが約 2 倍速くなりました。3 シートのブックに 2,000,000 個の値(100,000 行 × 20 列)を書き込む時間は 48.6 ms から 22.4 ms になり、1 シートのブック(18〜19 ms)に近い速さです。こうしたブックでは、取り込みや一括投入など、コードからシートを埋める処理が UI の有無を問わず速くなります。
そのほかの 5.2 の変更
5.2 では表示も Excel により近づきました。
- 列幅に収まらない数値は、Excel と同じく収まる桁まで丸め(整数部も入らなければ指数表記)、書式付きの数値は
####を表示します。どちらも隣のセルにはみ出さずに表示します。 - セルに収まらない文字は「…」で省略せず、配置を保ったままセルの端で切ります(左揃えは先頭、右揃えは末尾、中央揃えは中央が見えます)。WinForms(GDI+ / Direct2D)・WPF・Avalonia・PDF 出力のすべてで同じです。
- 結合セルは外周の罫線だけを描きます。 xlsx では結合範囲の各セルがそれぞれ罫線を持っていることがよくありますが、その場合も同じです。PDF と印刷も同じです。
- WinForms のドロップダウンの一覧(ドロップダウン型セルとリストの入力規則)はポップアップで開き、画面の下に入らないときはセルの上に開きます。グリッドの端で切れずに一覧全体を表示します。
変更の一覧はリリースノートにあります。XlsxReader.OpenVirtual で開いたブックについての修正もそちらを参照してください。
計測の方法
| 項目 | 計測環境 |
|---|---|
| CPU | AMD Ryzen 9 9900X(12 コア / 24 スレッド) |
| GPU | NVIDIA GeForce RTX 3080 Ti(Direct2D の数値) |
| OS | Windows 11 |
| ランタイム | .NET 10 |
- 「1 フレームあたり」は、コントロールが 1 フレームの描画にかけた時間です(
OnPaint/OnRenderの中央値)。小さいほど速いことを表します。WPF の「画面に届くフレームの間隔」は、実際に画面に表示されたフレームの間隔です。 - 「5.1」は 5.1.0 のリリース版です。 Avalonia の 15 fps → 120 fps は 5.0.0 との比較です。
- WinForms の GDI+ と Direct2D の比較は、1400×900 のウィンドウを全面再描画しながらスクロールし、300 フレームを 2 回計測しました。
- Avalonia の 1 フレームあたりの数値は、Avalonia のヘッドレス環境(Skia)で、100%・100 × 20 の画面を画面外に描いて計測しました。fps は実際の画面で計測しています。
数値はお使いのハードウェア、ウィンドウの大きさ、データによって変わります。描画方式どうし、バージョンどうしの差の大きさは、ほかの環境でも同じように現れます。
アップグレード
5.2 はそのまま差し替えられる更新です。パッケージのバージョンを上げてリビルドしてください。
dotnet add package unvell.ReoGrid.One --version 5.2.0 # WinForms
dotnet add package unvell.ReoGrid.One.Wpf --version 5.2.0 # WPF
dotnet add package unvell.ReoGrid.One.Avalonia --version 5.2.0 # Avalonia
パッケージは UNVELL のパッケージフィードから配布しています。フィードの登録方法はインストールを参照してください。WPF と Avalonia の高速化はリビルドした時点で効きます。WinForms では grid.Renderer = GridRenderer.Direct2D; の 1 行を加えると GPU での描画に切り替わります。
5.2 は、ライセンスに含まれる 12 か月のアップデート期間と年間更新の対象で、お手持ちのライセンスキーのままお使いいただけます。評価にはトライアルキーを適用してください。
まとめ
20 年以上にわたって、WinForms アプリのスプレッドシートは CPU がセルを 1 つずつ描いてきました。ReoGrid One 5.2 では、それを GPU に任せられます。WPF と Avalonia では、変わったところだけを描き直すようになりました。大きなシートのスクロールが引っかかる WinForms の画面や、データの更新に描画が追いつかないライブボードをお持ちなら、ぜひ 5.2 をお試しください。