雪花臺灣

Android 做到 iOS 如絲般柔滑的過渡動畫真的很難嗎?


我是做安卓的,我個人認為有些困難,IOS的流暢只是一個感覺,實際的表現主要是幀率穩定和非線性動畫,而且還牽扯到IOS的底層實現,包括OC天然的高效率等等因素,至於什麼墓碑機制啊,統一推送啊,我覺得都不是主要原因,可能在之前是主要原因,但是隨著安卓設備硬體的不斷提升,這些真的不是最重要的因素了,就算安卓是真後臺,來個7,8個應用後臺運行,對現在的安卓機都不叫事,不存在系統喫緊的原因,我個人認為主要因素主要有3點

1. IOS的響應優先順序不一樣,我記得IOS會優先處理touch事件,然後就是動畫之類的媒體事件,包括圖形處理,而安卓對於touch或者說圖形圖像處理的層級相對靠後,我覺得這是一個原因(這裡我說一下,首先,我也不是搞底層優化的,只是之前看過一篇文章,他的意思好像是說媒體或者圖形處理會優先響應觸摸事件,確實之前的說法不太妥當,touch事件肯定是要第一時間響應的,只不過是有延遲的差異,因為目前安卓版本更新很頻繁,如果有一些知識我沒有及時更新,還請諒解)

2. 再一個就是蘋果很聰明的用了很多非線性動畫,包括很多精美的動畫默認就是封裝好的,是控制項自帶的效果,比如ListView(安卓的類名)彈性滾動等等,這些動畫在很大程度上會給你很流暢順滑的感覺,而安卓大部分控制項只是實現功能,如果你想在交互層面錦上添花就要自己去實現你想要的效果自定義控制項,這就參差不齊了,很多安卓現在比較常用的交互邏輯,完全都是借鑒IOS的原生控制項效果,有的時候真的不得不佩服蘋果,很多細節考慮的很周全,因為人家原生的控制項就足夠精美高效,讓開發者開發出來的應用在用戶使用邏輯上達到高度的統一,不過在比較新的一眾Material Design控制項中,比如Recyclerview等等,安卓也原生加入了些靈動的動畫效果,但是總感覺小巫見大巫,IOS的啟動速度一向不是優勢,而安卓一直在這方面很強勢,參考小白的測試數據,所以我覺得流暢順滑和速度並不是成正比的,啟動不快的IOS一樣給人留下很順滑的感受。

3. 我覺得就是OC的開發語言,java是虛擬機機制,需要轉換位元組碼,換成機器能讀懂的指令,而且在之前都是邊解釋邊運行,效率可想而知,不過在5.0後出了ART模式,本質就是想解決這個問題,可以在初次使用時全部解釋完,但是我覺得效果不是很好,最近華為也出了方舟編譯器,其實原理都一樣的,OC我不太懂,但畢竟是C語言系的,在C的基礎上加了面向對象的概念,更易用,雖然java天生就是面向對象的,但是C和java本就是完全兩種語言和運行模式,OC的高效不言而喻,這肯定也是一個主要原因

剩下的就都是普羅大眾都知道的一些東西,什麼IOS封閉啊,APP質量高啊之類的,蘋果的流暢確實是不容易,我作為一個安卓開發人員其實很喜歡蘋果的設備,目前用P30,準備下一個手機換個蘋果的,就說這麼多吧,歡迎指正和探討

-----------------手動分割線-----------------

感謝大家的點贊和評論,我再補充一些我認為比較大的影響因素,上面的回答說到啟動速度,確實是安卓領先,但是我覺得以蘋果的硬體和軟體的實力,達到啟動速度快的目的並不難,我甚至認為蘋果是有意為之的,故意讓啟動中間加一些動畫,還是那句話,流暢和順滑真的不是一個快就完事了,是一系列的從無到有,從慢到快的漸變過程,我覺得安卓的動畫太死性,因為一般用的屬性動畫,就是從A點到B點的一個位移,如果想達到IOS的彈性效果,就要加入差速器,但是我試過,流暢度還是比不了IOS,而且還有一點不可否認,就是蘋果的設備少,相對應的軟體就可以最大程度的去匹配硬體,這就跟為什麼PS4的硬體水平往往都落後於同期的PC很多,但是玩遊戲的流暢度和體驗永遠比PC強好多,因為PS4就這一款硬體,所有的軟體開發商相對好做適配,而PC,幺蛾子太多,硬體玲琅滿目,還能DIY,這就跟安卓和IOS的情況很像,IOS同年幾乎只有一兩款設備更新,而且硬體完全一致,核心都由蘋果設計,比如CPU等等,而安卓那真是不要太多,光CPU就有很多廠商可以提供,而且手機廠商還要對系統做二次開發和適配,加入很多自己的業務內容,這在本質上就已經算是污染了操作系統,而這也是谷歌想做的,就是自己出個"架子",然後大家各取所需去改造去添加你想要的"肉",尤其是國內連谷歌服務都用不了,真的就只剩一個架子了,所以能單獨做軟體優化也是一個很重要的原因,這也是為什麼說蘋果的硬體和軟體結合的最完美,因為都是單對單,永遠剛好夠用,達到利益和產品使用的平衡點,蘋果的內存,蘋果的電池,甚至蘋果的充電器都落後安卓N個時代,但一樣擁有比安卓更好的體驗,這種以小博大的感覺,就像中國太極的四兩撥千斤,沒有哪個股東不喜歡這種企業,所以蘋果的價格貴不是沒有道理,因為只此一家,總之,蘋果的系統體驗真的不是一個開發人員就能左右的事情,這其實體現了完全兩種不同的商業模式,兩種理念,當然,目前隨著高通一統天下,安卓的優化相對而言,少了很多選項,而且你也可以看到廠商都會對高通的晶元做優化,沒辦法,因為安卓就是SOC企業在牽著手機廠商在走,而IOS完全是蘋果在牽著其他企業在走,你說能一樣嗎?????


鏡像問題回答 — 為什麼 iOS 的過渡動畫看起來很舒服? ,其中有一些安卓頑疾已經在 Android Q 修復了。

我為解決問題做的努力 — 開源動畫框架 Animer,在控制和速度狀態上嘗試解決一些問題

https://github.com/MartinRGB/Animer?

github.com

以下原回答:

設計開發人員素質 框架本身缺陷 國內用戶審美,整個鏈條的問題。

而且就連從業者,聽到動畫就說要絲滑流暢,那到底什麼叫絲滑呢?什麼叫流暢呢?一直用這種很虛的詞在描述,能進步就怪了。應該用「無延遲,符合自然規律,交互反饋真實」這種術語。

職業學校畢業的木匠用不怎麼好的工具,還被要求每天做一件木工藝品給對木工不怎麼瞭解的消費者,流水線能做好就怪了。

隔壁木匠一個月做一個,工具又快又新,而且消費者是行家,聽說這木匠專門學了好久木工專業。


不是不能做,但的確有些困難,主要是幾個原因:

1、安卓APP項目的工程量一般要比同一個iOS項目大很多,因為安卓本質上是一個半成品,安卓開發在做項目的時候還要解決很多本應該Google解決的問題,另外安卓系統是一個超高設備兼容性系統,iOS雖然也有一定設備兼容能力,但和安卓比兼容需求小很多,所以安卓的GUI框架受到了高設備兼容性的制約,開發起來很不方便。

所以,安卓開發在做項目的時候,得把大量精力放在其他東西上面,也就沒有足夠時間去優化交互動畫等效果,除非公司大到有一個專門的UED組。

2、安卓APP的UI結構一般是樹狀結構佈局,而iOS一般是層疊結構佈局,當然安卓也可以做層疊、iOS也能做樹狀,但由於開發習慣問題,一般最後都會做成這樣。樹狀結構有個問題就是有時會很難實現一些跨結構的視圖動畫效果,而層疊相對好做很多。

所以往往會出現,一個APP的佈局寫好了,然後來了個交互效果,開發一看,我艸,沒法搞,搞不好要重新佈局,md不幹了,做不了。

3、安卓渲染的性能問題,這個其實現在差距已經不是非常大了,但在低版本和一些極端情況(大廠的一些超複雜佈局,比如我這某APP的首頁)下差距依然比較明顯,理論上是可以優化的,但誰去做,誰有時間做,有沒有必要做,是個問題。很多APP的首要任務並不是讓交互絲滑,而是儘可能快得完成功能,搶佔市場,至於用戶用APP的時候有一點點卡不是個問題。

4、另外很多安卓APP會關閉硬體加速,因為安卓打開硬體加速會造成一些問題,比如渲染各種不正常,耗電高等等問題,但關閉後,安卓APP渲染性能會下降相當多,我個人是不建議關閉的。


雖然這樣說會被很多人罵,但是還是先說結論:Android使用的渲染引擎Surface爛!你看谷歌自己都不用這麼爛的渲染引擎,Flutter用chrome引擎日常渲染自己的動畫多流暢,能在iPhone 4s上跑60幀哦,能在Galaxy S3上跑六十幀哦。言下之意是什麼???

開個玩笑,雖然是玩笑,但是結論還是不變。原因並不是谷歌不努力或者Android組水平低而是Linux那個宏內核設計(其實Linux壓根就沒有一個「有著給正常人類使用的用戶界面」的髮型版吧)。谷歌重啟爐竈搞Fushia有很大一部分原因就是Linux的掣肘越來越嚴重。看一張Android渲染架構:

Linux開源使得谷歌為了保護OEM不得不引入一個HAL層,畢竟你谷歌開源,我OEM可不願意開源我的驅動。這使得谷歌無法真正意義上推出一個高效的數據同步模塊,用谷歌的原話就是:

Since Android graphics offer no explicit parallelism, vendors have long implemented their own implicit synchronization within their own drivers. This is no longer required with the Android graphics synchronization framework. See the Explicit synchronization section for implementation instructions.

多層漢堡結構帶來的性能損失,兼容性的要求加上宏內核本身實時性就差就是得無論谷歌怎麼改,同等硬體水平,圖形性能就是比其他平臺差。歸根結底,Linux最初被大規模採用的時候方向就是高性能計算,然後一路技能樹就是這麼點的。現在非要讓Linux來保證高可靠性和高實時性,真的是強人所難啊。具體可以看到Android雖然最近支持了vulkan API,但是實現方式卻……

還有一方面的願意很好理解,谷歌不掌控硬體,沒辦法像蘋果一樣可以魔改底層硬體API。這部分的損失有多大可以參考同等硬體指標下,注意是同等硬體指標下遊戲主機完爆PC。同時,因為沒有統一的介面也就因為著優化嚴重依賴開發者,看看喫雞這一路的優化歷程你就知道這有多艱難。除了遊戲有多少Android App有專門的性能優化組?

動畫卡了為什麼要去優化,只要罵iOS動畫是騙人不就完了?Flutter?那玩意根本沒人用!閑魚?正常人誰他媽上閑魚!滾!


需要提到的是ios所有過渡動畫全部是蘋果公司提供的系統原生工具製作,高度統一。

縱觀安卓,原生提供動畫本來就生硬,大部分動畫依靠安卓軟體開發者自己diy,類似於同人作,既然是同人作,就不可能像ios一樣高度統一。而且安卓動畫缺少「Easing」,讓原來就缺少統一的骨偶動畫看起來更加的不自然。

線性動畫分為直線和曲線。①安卓過渡動畫機械生硬是因為使用的是勻速直線運動的動畫(機械不自然),速度變化就像一條直線,沒有起伏。②最新原生安卓和蘋果ios的動畫效果好的重要原因是因為使用了曲線緩和動畫(有加速和減速的過程)。速度變化像曲線一樣有變化。③他這裡把名字弄錯了,把曲線緩和動畫叫做非線性動畫,實際上曲線也是線性動畫。安卓官方把這種有加速和減速過程的動畫叫「Easing」曲線緩和,被愛否科技說成是非線性動畫,於是其他人也跟著這麼叫,實際上直線曲線都是線性。

下面的視頻是華為p30pro首發EMUI10體驗視頻,非線性動畫,堪比ios高度流暢。

https://www.bilibili.com/video/av63387734?from=searchseid=2982694682560286294


推薦閱讀:
相關文章