それまで使っていたMac mini 2007とSXGAモニタ(1280x1024)に代えて、Mac mini 2011とWQHDモニタ(2560x1440)を買った頃。
同じ時期にScanSnapで自炊を始めたので、広いモニタ全体に全ページのサムネイルを表示し、クリックしたところを見開きで表示できるアプリを作りました。
どんなものだったか試すことができます(後述)。
試してみると分かりますが動作が遅く、あまり実用的ではありませんでした。
(もちろん、今のマシンで試したものより遅いです)
そしてそのまま、あまり使わずにいました。

もちろん、マルチスレッド化するという手はあります。
しかし、Core FoundationのPDF描画はマルチスレッドに対応していないようで、代わりになるライブラリを探す必要があります。
また、マシンは2コア4スレッド、ハイパースレッディングなので実際には倍ちょっとしか速くなりません。
なんか面倒なのでそのままにしていました。

M1 Macを買って、状況が変わりました。
8コアもあるのでマルチスレッド化を再検討しました。
ライブラリを探すと、MuPDFが対応していてサンプルコードもあったので、試してみました。
まずディスプレイリストを作ります(これはマルチスレッド非対応)。
ディスプレイリストのレンダリングはマルチスレッド対応なので、並列に描画する仕組みです。

はじめは読み進めている方向の数ページをプリフェッチする仕組みにしていたのですが、
メモリ16Gのマシン用に全ページをプリフェッチする機能を加えました。
PDFを開いて数秒(200ページ程度、M1の場合)待つとプリフェッチが終わり、GB単位でメモリを使いますが毎フレーム更新できる速度が出ます。
リフレッシュレートが60Hzなら(見開き表示なので)120ページ/秒でページめくりができます。
本をパラパラっとめくる感覚が実現しました。

WView-Prefix.pchを編集することで多少カスタマイズできます。
あらかじめ
$ brew install mupdf
でMuPDFをインストールしておき、
$ xcodebuild build -project WView.xcodeproj -configuration Release
でビルドしてください。

OS X 10.9以上

https://github.com/kwnr0/fast-mihiraki-PDFViewer

MuPDFを使わないシングルスレッド版を試す場合は、WView-Prefix.pchの#define MUPDFをコメントアウトしてビルドしてください。

操作方法

見開き表示のとき
左右クリック    ページめくり
ホイール      ページめくり
カーソルキー左右  ページめくり
カーソルキー上   最初のページへ
カーソルキー下   最後のページへ
スペース      一覧表示に切り替える
ホイールボタン   一覧表示に切り替える

一覧表示のとき
左クリック     クリックしたページを見開き表示する
カーソルキー    カーソルの移動
スペース      カーソルのページを見開き表示する
ホイールボタン   カーソルのページを見開き表示する

共通
コマンドキーとD  ページが進む方向を切り替える
コマンドキーとF  最初のページが単独か見開きかを切り替える
エスケープキー   閉じる
コマンドキーとQ  終了