Mavericks の Safari のタブとプロセスについて

MacSoft

[D] Mavericks Safariを以前のサクサク軽快Safariに戻す方法 - Drift Diary XV

不覚にも昨日まで気づかなかったんですが、気づいたらMavericksのSafari 7ってタブ毎にプロセスを生成するGoogle Chromeスタイルにアーキテクチャが変わってたんですね。

(中略)

いくらMarvericksで圧縮メモリー機能を搭載して、実メモリの1.5倍程度はメモリーが有効に使えるようになったとはいえ、タブ毎に軽く100MBくらいメモリー取られると10タブで1GBですよ。さすがにちょっと富豪すぎ。

(中略)

もちろん将来的にもっともっとメモリーやCPUがリッチになっていけば、タブ毎にプロセス作るなんて無視できるコストになると思うけど、現状は明らかに重くなってるもん。

(中略)

前述したようにもっとハードウェアのリソースが潤沢になってくればタブ毎にプロセスを立ち上げるモデルのほうがメリットが強くなってくるし、新しい実装のほうが進化を続けていくのは当然のことなので、将来的にこのような設定は不要になるとは思いますが、「まだデフォルトで有効にしなくても良かったんじゃない?」という気もします。

Mavericks の Safari が複数のプロセスでタブを管理するようになったのは知っていたけど、この記事を読んで「1 タブ 1 プロセスというほどたくさんのプロセス起動していたっけ」と疑問が。Activity Monitor で数えてみたところ、“Safari Web コンテンツ”の数は 20 個。そのとき開いていたタブは 77 個なので、タブの数よりずっと少ないことになる。

ということは、 Safari ではタブが 20 個を超えるまでは同じ数のプロセスでそれを負担し、さらに増えるとプロセスあたりのタブ数が増えていく仕様かもしれない。とするとその最大数を定義する隠し設定があるに違いない!

...探してみると、ありました。DebugMaximumNumberOfWebProcesses がそのキー。これに値 6 を設定して Safari を起動したところ、しっかり 6 プロセスで 77 タブを支えるようになった。

つまりこの値を調整すれば、この記事で比較している“旧 WebKit2 プロセスモデル”と“Chrome プロセスモデル”のいいとこ取りができるかも!

とは言え自分の環境ではむしろ Mavericks にして Safari が軽くなった印象があったし、この設定を使ってもタブの数が多いせいかほとんどメモリ消費は減らなかった。常にタブを大量に開いている偏った環境での話なのであまり参考にならないと思うけど、人によっては効果があるかも。

(隠し設定なので問題が発生する可能性があります。設定するなら自己責任で。)

2014.3.22 追記

設定のやり方を記事にしました

ZMHistoryPanel 1.0.1

Products

ZMHistoryPanel のバージョン 1.0.1 をリリース。今回の変更は Sketch への対応。

同じ操作を繰り返したときにその数だけ取り消しアクションが記録されると、直前の(とユーザが思っている)状態に戻りたいと思っても何度も取り消しを繰り返さなければいけない。

Cocoa の NSUndoManager はそのための対策がある。-[NSUndoManager setGroupsByEvent:] で YES を渡しておけば NSRunLoop のモードの仕組みを使用して自動的にまとめてくれるのだ。オブジェクトをドラッグして移動してもマウスが 1px 動くごとに取り消し回数が増えるのではなく、マウスボタンを押してから離した時点までが一つのアクションとして記録される。

しかしそれでも十分ではない。矢印キーをポンポンと押してオブジェクトの位置を移動したときなどはイベントの固まりがそれぞれ独立しているため、前述の仕組みは通用しない。

調べてみると時差のあるアクションを上手くまとめる実装方法はいくつかあるようだけど、例えば Cocoa 標準のテキストビューである NSTextView では一文字打つごとに取り消しアクションが記録されると実用的ではないのでイベント発生時間などを考慮しながらほどよくグループ化する仕組みがあるみたい。

Sketch のようなドローソフトではまさにそんな工夫が必要な部分が多い。このプラグインのバージョン 1.0 が Sketch と相性が悪かったのは、Sketch が NSUndoManager そのもの(のサブクラス)を拡張してグループ化の仕組みを入れていたためだった。

今回のバージョンでは Sketch で自然に使えるようにできるだけ対策してあるけど、取り消し/やり直しを何回かしているとリストのアクションが増えたり減ったりしてちょっと混乱する。こういう理由なので、気にしないようにしてください。

ZMBorderlessToolbar 1.0

Products

昨日の勢いでもう一つ SIMBL プラグイン。ツールバーのボタン部分の描画をスキップする ZMBorderlessToolbar をリリース。

OS X 初期はどのツールバーにもアイコンが直接並んでいた。細部まで書き込まれた半リアルのアイコンはカラフルで美しかったけど、OS X がまだ Jaguar だった頃に Safari Beta が登場してからはシンプルな形状のブラック単色のアイコンが統一された角の丸いボタンに包まれて使われることが多くなった。
(今でもカラーを持つアイコンは使われていて、それぞれどう使い分けられているのかという分析は 1024 さんの記事が詳しい。)

ボタンの枠は押せることをユーザに認識させる重要な役割があるけど「膨らんだツールバーの上に刻まれた見た目のものがあればそれは押せるだろう」ということなのか、Reeder などのアプリケーションはツールバーボタンの枠を省略するようになった。iTunes や iPhoto などの Apple 製アプリケーションも最近はそうなっている。

だから次の OS X では全体的にそうなるのではないかと予想したのだけど、Mavericks では従来のまま変化がなかった。

そこでこのプラグイン。ボタンがツールバー上にあるときだけ枠の描画をスキップするのだ。

一部実装上の関係で位置やサイズのバランスがおかしくなるけど、なかなかすっきりする。

実はこのプラグインは半年以上前に完成していてずっと使ってきたのだが、これに慣れると枠だらけのツールバーはだいぶ複雑に見えてしまう。

ZMHistoryPanel 1.0

Products

Pixelmator を使ってみて Photoshop より不便に感じることはいくつもあるけど、そのうちの一つがヒストリーパネルが存在しないことだった。

Pixelmator Team がヒストリー機能を追加するつもりなのかわからないし、勝手に SIMBL プラグイン作って解決できないかなと思ってやってみたらできてしまった。

アプリケーションにヒストリーパネルを追加する SIMBL プラグイン、ZMHistoryPanel をリリース!今回は ScreenFlow でビデオも作成。

→ 続きを読む