App瘦身、性能優化總結

来源:https://www.cnblogs.com/jukaiit/archive/2019/03/26/10506009.html
-Advertisement-
Play Games

App瘦身 資源瘦身 使用tinypng壓縮PNG圖片。視頻可以通過 Final cut等軟體進行解析度壓縮。音頻則降低碼率即可。 非必須資源文件可以放到自己伺服器上 啟動圖使用 LaunchScreen.storyboard,啟動圖在一個項目資源中占比其實蠻大的,但是使用 LaunchScreen ...


App瘦身

資源瘦身

  • 使用tinypng壓縮PNG圖片。視頻可以通過 Final cut等軟體進行解析度壓縮。音頻則降低碼率即可。

  • 非必須資源文件可以放到自己伺服器上

  • 啟動圖使用 LaunchScreen.storyboard,啟動圖在一個項目資源中占比其實蠻大的,但是使用 LaunchScreen.storyboard 只需要設置一張ImageView即可。

  • IconFont的使用很方便,項目中圖標太多或者隨時需要轉換圖標顏色的話,建議使用

放棄使用 Realm

Realm,據說是目前是性能最好的移動端資料庫。但是在三方庫中可以看到,Realm 的支持占了很大的比重,大約在 8M 左右。但是如果使用 FMDB 話只需要192KB,而 CoreData 幾乎可以忽略不計。

刪除重覆代碼

重覆代碼的審核、無用的開源庫刪除

性能優化

imageWithContentsOfFile 、 Assets.xcassets

  • 對於大的圖片且偶爾需要顯示的應放到工程目錄下,不要放到Assets.xcassets中;並使用imageWithContentsOfFile載入不讓系統緩存

  • 對於經常需要展示的小圖片放到Assets.xcassets中讓系統緩存,使用imageNamed載入

儘量使用非逃逸閉包

非逃逸閉包是有利於記憶體優化的,所以儘量使用非逃逸閉包

NSSet、NSArray

NSSet(用hash實現)和NSArray功能性質一樣,用於存儲對象,屬於集合。但是和NSArray不一樣的是它屬於 “無序集合”,在記憶體中存儲方式是不連續的,而NSArray是“有序集合”它記憶體中存儲位置是連續的。

所以在集合中尋找一個元素的時候使用NSSet,而如果需要迴圈集合中的所有對象來找到所需要的目標則使用NSArray

頁面卡頓

屏幕顯示圖像的原理

  • CPU(中央處理器)

對象的創建和銷毀,對象屬性的調整、佈局計算、文本的計算和排版、圖片格式轉碼和解碼、圖像的繪製(Core Graphics)

  • GPU(圖形處理器)

紋理的渲染(OpenGL)

  • FrameBuffer(幀緩存)

image.png

  • 1、CPU計算控制項的位置、大小

  • 2、計算完成後CPU會將這些數據提交給GPU來進行渲染

  • 3、GPU將收到的數據轉成屏幕能顯示的數據格式,緩存到在FrameBuffer

  • 4、然後視頻控制器從FrameBuffer讀取的數據顯示在顯示器上

卡頓產生的原因和解決方案image.png

由於垂直同步的機制,如果在一個 VSync 時間內,CPU 或者 GPU 沒有完成內容提交,則那一幀就會被丟棄,等待下一次機會再顯示,而這時顯示屏會保留之前的內容不變。這就是界面卡頓的原因。

從上面的圖中可以看到,CPU 和 GPU 不論哪個阻礙了顯示流程,都會造成掉幀現象。所以開發時,也需要分別對 CPU 和 GPU 壓力進行評估和優化。

卡頓優化-CPU

  • 1、儘量用輕量級的對象,比如用不到事件處理的地方,可以考慮使用CAlayer取代UIView

  • 2、不要頻繁地跳用UIVIew的相關屬性,比如frame、bounds、transform等屬性,儘量減少不必要的修改

  • 3、儘量提前計算好佈局,在有需要時一次性調整對應的佈局,不要多次修改屬性

  • 4、Autolayout會比直接設置frame消耗更多的CPU資源

  • 5、圖片的size最好剛好跟UIImageView的size保持一致

  • 6、控制一下線程的最大併發數量

  • 7、儘量把耗時的操作放到子線程

  • 8、文本處理(尺寸的計算,繪製)

  • 9、圖片處理(解碼、繪製)

卡頓優化-GPU

  • 1、儘量減少視圖數量和層次

  • 2、GPU能處理的最大紋理尺寸是4096x4096,一旦超過這個尺寸,就會占用CPU資源進行處理,所以紋理儘量不要超過這個尺寸

  • 3、儘量避免短時間內大量圖片的顯示,儘可能將多張圖片合成一張圖片顯示

  • 4、減少透明的視圖(alpha<1),不透明的就設置opaque為yes

  • 5、儘量避免出現離屏渲染

離屏渲染

指的是在GPU在當前屏幕緩衝區以外開闢一個緩衝區進行渲染操作

導致產生離屏渲染的原因:

  • shouldRasterize(光柵化)

  • shadows(陰影)

  • edge antialiasing(抗鋸齒)

  • group opacity(不透明)

  • 圓角(當和maskToBounds一起使用時才會觸發)

  • 漸變

可通過 Instruments 的 Core Animation 檢測離屏渲染。

TableView 調優

  • 提前計算好cell的高度,緩存在相應的數據源模型中,減少CPU的計算時間

  • 儘可能的降低Storyboard、Xib等使用度

  • 非同步繪製

  • 減少層級

  • Cell中的view儘可能不要使用透明

  • 避免離屏渲染


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 序列 Oracle 12C 之後,Oracle 之中提供的是一種手工的自動增長列控制,而這樣的控制在 Oracle 之中使用序列(對象)完成。 序列的創建: 可是該如何實現行的自動編號呢? 迴圈序列: 1、3、5、7、9 五個數據之間迴圈顯示 DROP SEQUENCE myseq ; CREATE ...
  • MySQL資料庫的最基礎的內容:創建資料庫,創建數據表,插入記錄,查看記錄等 ...
  • 1、背景說明 很多時候我們需要通過一張中間表的數據去更新另外一張表,而不僅僅是通過固定數值去更新,尤其是當數據量很大的時候,簡單的複製粘貼就不大可行了。 2、MYSQL版本 如下圖所示: 3、表示例 Student表: 中間表Temp: 我們需要用中間表的name、sex、age欄位來更新Stude ...
  • 錯誤: ORA-28040--No matching authentication protocol 原因:客戶端版本與伺服器端版本不一致導致,比如客戶端是11g,而伺服器端是12c 解決:最根本的解決辦法是安裝與伺服器端版本一致的客戶端 網上也有其他的辦法,如修改sqlnet.ora文件追加下列配 ...
  • 背景 在13年的時候,我開始負責整個公司的搜索引擎。嗯……,不是很牛的那種大項目負責人。而是整個搜索就我一個人做。哈哈。 後來跳槽之後,所經歷的團隊都用Elasticsearch,基本上和緩存一樣,是項目必備的工具。目前靜兒在做的項目中也在用,正好系統學習一下。畢竟靜兒的夢想就是打造自己的搜索引擎。 ...
  • 1、背景&解決方法 最近碰到一個需求,app監聽特定的廣播,接收到廣播後啟動自己再進行處理。需求很簡單,靜態註冊就好,不過,在自測的時候遇到一個問題,app安裝後沒啟動過的狀態下,什麼廣播都收不到!なにもない! 後來,網上各種查,找到了“罪魁禍首”:Android 3.1以後新增的stopped機制 ...
  • 在大多單位的引流或業務操作中,基本上都需要使用安卓的高端技術Xposed框架,近期,我們單位購買了一批新的安卓4.0以上系統,基本上都都是基於7.0以上版本,基本上都不能夠刷入root超級許可權,即便是一部分能但較為麻煩,甚至也有刷入root超級許可權後重啟設備就恢復無root狀態的情況出現,很是頭疼的 ...
  • 在大多運行室的引流或者業務操作中,理論上需要使用安卓的神一般的Xposed框架,上周我們運行室購來了一批新的vivo機器,理論上都是基於7.0以上系統版本,理論上不能夠獲得root的su許可權,雖然一部分能但非常麻煩,甚至也有獲得root的su許可權後重啟設備就恢復無root狀態的情況出現,很是焦慮的一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...