先週確認したreleasenotesにあったように、High Sierra(macOS 10.13)ではlayerの描画作法が変わったようで、CALayerをいじって表現しているところでおかしな挙動を示していた。
その後releasenotesのその先も読んではみたが、確かに今までNSViewに頼っていた抽象操作を、いくらかCALayerレベルまで具象層に落として書き直しが必要だというのは判明したのだけれど、アルファの再描画で確信を得られず。NSViewのbooleanフラグが多すぎてもはや2^n 順列組み合わせで挙動がふらついたり、その説明はついぞ見つからなかったり、おかしな挙動から抜本的な脱出はできなかった。
で、自分でundocumentedなところを調べてるうちに、ふと前回upした動画のオススメ欄を見てみると、こんな動画が。。。
(投稿者にお礼のコメントは入れたけど、埋め込みの許可はまだ得られてないので、後日このブログからは☝️消えるかもしれません)
たしかにこの現象は少なくともうちの10.13環境でも再現する。
ということはつまり、AFPSが絡んでるかもしれないとはいえ、そうそう支配的には見えず、FinderやらDockの描画つまりベンダーが提供するappのグラフィック処理ですでにエグいバグが潜んでいるのではないかと。
ここで僕はNSImageに関連する再描画でアルファが悪さをしているというpivotを立てることにした。
まずview hierarchy図でいうとAppSumonerはざっくりこういう構造をとっている
viewの②以降は素材であろうとplaceholderであろうと、すべてアルファ 0.0で透過させている。
前回2本目の動画は①描き残しはfixしたものの、今度は③内のアルファブレンディングの再描画ができず③の中で描き残しが発生し続けていた。
これも②描き残し対応施策で回避できるかと前回の結論として思ってたが、そう甘くはなく、NSImageViewは実はNSViewとは関係のないキメラのような存在なので、NSImageViewではなく、NSViewのlayerにNSImage、CGImageを直接view, layerのsetNeedsDisplayからのメッセージからdraw系で描き込んだりしても目に見えた変化は見られなかった。
つまり②以降のview全てをsubclassレベルで完全に合わせ込んでも期待値とはほど遠く、やけになってやってみたのがこれ。
よほどcrazyな絵面だが、②のbgColorを赤、アルファを1にした。
②も③も描き残しは見られない。
これはCocoa(AppKit)のソースは公開されていないんで全くの憶測だけど、調査過程で発見した動画や、CGImage再描画でも回避できないというのはどうやらアルファの重ね合わせでなんらか持ってるんではないかと。。。
eGPU対応とかで、前提が崩れた?NSNextStepFrameのbgColorとか絡んできてた時点で。。。いやわかんない。全て推測の域は決して超えない独り言。
これは放っておけば、ある日のアップデートで昔のコードが期待通りに動くようになるかもしれないし、もうNS\w+Viewでのグラフィックサポートは諦めて、macOSはmakeBackingLayerとLayer hierarchyと各種drawでやりくりするか、どっぷりそれなりのグラフィックフレームワークLayer作れといっているのか。Apple自身がいままさに考え中なのか。
もちろん僕のやり方ではないやり方で、AppKitとして"正しい"方法があるのかもしれないことは今日時点棄却できない。
ということで、iOS, macOS developerプログラム費用をAppleに払わせるという背徳感のためだけに存在するアプリは、いったん👇くらいまでは10.12と等価に見えるところまでアレンジできました。
あとタイミングとか画像の切り替わり調整、テストしたらHigh Sierra Readyと書けるか、書けるといいな、もう結構な時間を使っているので是が非でも書きたい。
May be Coming soon.

0 件のコメント :
コメントを投稿