為什麼 iPhone 6 Plus 要將 3x 渲染的 2208x1242 解析度縮小到 1080p 屏幕上?

------2014/9/24 修改原題者加入------

John Gruber 之前預測 iPhone 6 Plus 解析度為 2208x1242 John Gruber (Daring Fireball) 對 iPhone 6 解析度的計算推測靠譜嗎?,事實上 6 Plus 渲染的解析度也的確如此 PaintCode,那麼為什麼還要縮小到 1080p 解析度,失去開發者追求的 pixel perfect 呢?

此外,這樣做幾個可能的理由也不成立:

成本/良品率/開口率過低導致顯示效果不佳:哪怕不考慮 G3,Nexus 5 一年前已達到 445ppi,6 Plus 即便使用 2208x1242 也僅為 460ppi。

性能:渲染解析度並未降低。

修改者目前只能想到是功耗考慮。


對於6+之前的手機,pt和px的比例為1:2。而6+出來之後,這一比例達到了1:3。同時解析度達到了1242x2208(使用ip6+截圖,再傳到電腦上看,就是這個解析度),而iphone實際解析度為1080x1920。解析度的比率為1.15:1。

對於ppi,6+之前均為326,而6+之後變為401。

素材資源發生的變化@3x

在實際開發中,素材通常是UI美眉負責提供。從@2x到@3x,素材的解析度提高了1.5倍。例如一個@2x的素材大小為44x44,那麼相應的@3x大小解析度為66x66。

文件命名的方式依然沒變:${IMG_NAME}@3x.png這種形式了。命名好的文件丟入資源文件夾內,只要代碼保持一致,文件名稱不變即可。

UI到代碼

由於ip6+點(point)和像素(pixel)的關係為1:3,因此,當UI設計稿基於1242x2208解析度【iphone6+】圖給定UI設計稿時,程序員進行實際換算為設計稿的1/3。

假設上圖是一個設計稿,基於1242x2208。UI美眉給了兩個按鈕間距為30px。為了實現以上效果,則可以在代碼中寫:

btn2.frame = CGRectMake( GetX(btn1.frame)+GetWidth(btn1.frame)+30.f/3,

GetY(btn1.frame),

GetWidth(btn1.frame),

GetHeight(btn1.frame)

);

由於實際間距為30px,因此在代碼中應該做除3的處理,保證間距效果。當然,如果設計搞給的不是ip6+的圖,那麼這裡的30.f/3還是應該按照以前的老規矩:30.f/2。

代碼到UI

從UI到代碼,只要在明確UI給出的設計圖是基於哪部手機(具體來說是哪種解析度)即可。但是,對於已經寫好的代碼,在不同的UI上表現是否相同呢?還是給出類似上面的代碼:

btn2.frame = CGRectMake( GetX(btn1.frame)+GetWidth(btn1.frame)+10.f,

GetY(btn1.frame),

GetWidth(btn1.frame),

GetHeight(btn1.frame)

);

有兩個btn,btn1和btn2之間的水平間距是10。現在問題來了:這兩個btn之間的距離在不同手機上看起來是相同的么?我們進行實際的換算:

因此,相同的代碼,在iphone6+和非iphone6+(ip4, 5, 6)的手機上表現是不同的:

在非iphone6+中,間距為20px;在iphone6+中,間距為30px。糟了,那間距在不同手機上相差了10個像素?外觀就有差距了,如何調整?

【其實不用太過擔心】,他們的間距【看起來】依舊相同。還是給出一個表格:

繼續回顧以前的討論:

·解析度縮放

ip6+的實際解析度為1080x1920,和1242x2208的解析度的比例為1:1.15。那麼30px在實際距離變為了:30/1.15 = 26.0870

可以看到差不多在26個px左右,間距【看起來】變小了一些。

·ppi影響

ppi,每英寸像素個數。ip6+的ppi為401,而非ip6+的ppi為326。相同屏幕物理距離,ip6+會顯示更多的像素;或者,相同px長度,在ip6+上【看起來】更短。它們之間的比例:401/326 = 1.2301

·【看起來】

現在我們計算30個px在ip6+上與以前ip手機相比【看起來】有多長:30/(1.15*1.2301) = 21.2078

換算完畢之後,pt為10,在ip6和ip6+上面的間距【看起來】變成了:

20px和21.2px在高分屏上,並且是用肉眼觀察,它們的區別是很不明顯的。那麼結論就是,相同的UI代碼,在不同的手機上的表現是基本相同的。對於在以前手機上寫死的相對距離,不用過於擔心在ip6+上的排序會亂掉。

從ip6+的處理上可以看出,蘋果手機在設計時可能考慮到了開發者的方便


新的資料在APPLE官網已經放出來了。這也間接證實了,iPhone6 Plus實際渲染出的是2208 x 1242尺寸的畫面。

iOS Human Interface Guidelines: Launch Images

Launch Images

......

Although it』s best to use a launch file for iPhone 6 and iPhone 6 Plus, you can instead supply static launch images if necessary. If you need to create static launch images for these devices, use the following sizes:

For iPhone 6:

  • 750 x 1334 (@2x) for portrait

  • 1334 x 750 (@2x) for landscape

For iPhone 6 Plus:

  • 1242 x 2208 (@3x) for portrait

  • 2208 x 1242 (@3x) for landscape


如何評價 5.5 寸屏幕的 iPhone 6 Plus?這個問題下 @Bill Cheng 的答案里也提到了,他答案里給出的StackOverFlow的鏈接上已經有人給出解釋了。鏈接在這裡iPhone 6 Plus resolution confusion: Xcode or Apple"s website?

簡單解釋下:

iPhone 6+除外,其他所有iPhone的DPI是一致的,都是326,用@2x的素材。

但是6+的實際DPI是401,理論上蘋果應該用401/326 * @2x=@2.46x的素材。但是這個奇葩的比例對開發者而言很難切圖。所以蘋果為方便開發者用的是@3x的素材,然後再縮放到@2.46x上,實際上是縮放到2.46/3=83%。實際上蘋果選取了一個接近比例的87%。

這樣算下來,物理解析度和虛擬分比率的比例是87%,也就是1920/0.87=2208,1080/0.87=1242.

好處就是開發者更方便,比如準備素材時,字型大小可以直接調成3x的。


以下是個人的假設和推斷,如有錯誤,歡迎指正~~

1、前提條件假設:蘋果要出一款5.5英寸的手機,並且解析度為市面上常見的1920*1080

2、因此可以推斷出ppi為401,進而推算出切圖的係數為@2.46

3、從方便開發角度來說,蘋果要保證切圖係數為整數,所以係數最好是3,可以推出理想的ppi為489,進而推算出理想解析度約為2344*1319

由於最後得出的解析度,不好渲染到1920*1080的屏幕上,所以蘋果發現了2208*1242這個折中的解析度(十分接近理想解析度),因為渲染到屏幕上時只要縮小1.15倍,正好是1920*1080。


這個問題困擾了我一個下午,完全是被誤導了...

以下回答回頭看了下是對最高票答案的數據補充

Iphone 6 PLUS 按照實際的PPI以及物理點尺寸只能顯示這麼多像素(1920*1080),更準確的應該是 寬度401/163*414=1018.49 高度 401/163*736 = 1810.65

某些人根據蘋果用@3x的素材設置意淫了一個像素2208*1242的解析度,是根據一個不準確的設置去否定一個正確的解析度

其實蘋果只是為了不想讓開發者開發一套(@1x @2x @2.46x)的素材而改成了@1x @2x @3x的素材

所以,結論:在iphone 6 plus的解析度就應該是1920*1080(準確是1810.65*1018.49),按照ipone6 plus的PPI需要開發者做一套 @2.46x 的素材,所以蘋果為方便開發者用的是@3x的素材,然後再縮放到@2.46x上

附上iphone各個版本PPI以及解析度數據


補一個圖文版關於解析度的說明:

http://www.paintcodeapp.com/news/iphone-6-screens-demystified

對於為什麼是這樣。我的理解是在保持長寬比一致的情況下,對開發者更友好。從iPhone6和 iPhone6 plus 的模擬器上看,現有的 app 都不需要適配就能顯示的不錯。那對更大屏的支持,開發者只需要多提供一套3x 的圖片就行。

下圖就是 xcode 里的 image.xcassets的截圖:


沒有喬布斯的「現實扭曲立場」,Apple 再也不能像當年說服康寧那樣說服LCD生產商生產@3x的2208x1242解析度的屏幕了,只能靠iPhone6的暢銷來說服LCD廠商,或者繼續妥協。


推薦閱讀:

如何系統學習iOS網路編程?
想用業餘時間學習 iOS 開發,零基礎,有沒有推薦自學用的書?
QQ 音樂 iOS 新版能夠在鎖屏界面顯示動態歌詞,如何做到的?
零編程基礎,學習 iOS 開發應該採取什麼路徑?
27歲,想轉行做軟體。從頭開始學JAVA IOS開發 運維 等等其中之一求指教?

TAG:解析度 | iOS開發 | 屏幕技術 | iPhone6 | iPhone6Plus |