質問: swift - レイヤーなら小数点を指定できる? - スタック・オーバーフロー で、1ピクセルの線を描く基本的な原理を理解しました。 ちなみに1ピクセルの線は Retina Display 環境で幅1pxの線を描画する - Qiita も参考にしつつ ``` 1 / UIScreen.main.scale ``` で描画させました。 上記回答のコメントで > > 説明が長くなるので省きましたがiPhone X等の@3xのデバイスは完全に3倍のピクセルにマッピングされるわけではありません(ディスプレイはそこまで高密度ではなく、物理的なピクセルが足りないので) > > > とコメントを頂きました。上記質問では基本的な原理がわかったので、スタックオーバーフロー的には質疑を完結すべきと考え回答済みとしました。 たしかに`@3x`が出た当時、かなりピクセルとの関係(というか端末との関係?)が複雑でややこしかったため、理解しきれずにいた記憶があります。(おそらく当時理解していれば、上記の質問をすることはなかったでしょう...) いまさら感が強いですが `@3x` で 1ポイントがどのようになるのかわかる資料とその簡単な解説が知りたいです。(1ポイントで説明するのが説明しづらい場合は1ポイントでなくても結構です)
回答: > > iPhone X等の@3xのデバイスは完全に3倍のピクセルにマッピングされるわけではありません > > > ごめんなさい。「iPhone X等の@3xのデバイスは」と書きましたが「iPhone 8 Plus等」の間違いです。iPhone X系のデバイスはポイントに対してちょうど3倍の解像度のディスプレイが搭載されているので1/Scale幅の線はピッタリ1ピクセルで描画されます。 で、iPhone 8 Plus等のダウンサンプリングがされるデバイスですが、それはダウンサンプリングの結果によるので正確にこう、ということは(少なくとも私には)できません。 ただ仕組みを説明することはできます。 説明のために「論理ピクセル」という概念を導入します。 Retinaでない@1xのディスプレイ(もう存在しませんが)、@2xのRetina Display、iPhone X系の@3xのRetina Displayは、1ポイントがそれぞれ1ピクセル、2ピクセル、3ピクセルの論理ピクセルにマッピングされ、論理ピクセルはそのまま物理的なピクセルに対応できるのでその通り描画されます。 iPhone 6/7/8 Plus系のデバイスが搭載しているディスプレイはピッタリ3倍の解像度ではありません。 しかしソフトウェア上は@3xが要求されているので1ポイントはいったん3倍の論理ピクセルにマッピングされます。 その後、物理的なディスプレイは3倍のピクセルを持っていないので、自動的にダウンサンプリングされて実際のディスプレイに描画されます。 (参考) ^ 実際に1ピクセルのヘアラインを描画したディスプレイを比較した実験を公開されています。