iOS開發(fā)中常見的性能優(yōu)化技巧

性能問題的主要原因是什么,原因有相同的地沮,也有不同的,但歸根到底诉濒,不外乎內(nèi)存使用周伦、代碼效率未荒、合適的策略邏輯、代碼質(zhì)量迫卢、安裝包體積這一類問題冶共。

但從用戶體驗(yàn)的角度去思考捅僵,當(dāng)我們置身處地得把自己當(dāng)做用戶去玩一款應(yīng)用時(shí)候家卖,那么都會(huì)在意什么呢?假如正在玩一款手游庙楚,首先一定不希望玩著玩著突然閃退上荡,然后就是不希望卡頓,其次就是耗電和耗流量不希望太嚴(yán)重馒闷,最后就是安裝包希望能小一點(diǎn)酪捡。簡單歸類如下:

快:使用時(shí)避免出現(xiàn)卡頓,響應(yīng)速度快纳账,減少用戶等待的時(shí)間逛薇,滿足用戶期望。
穩(wěn):不要在用戶使用過程中崩潰和無響應(yīng)疏虫。
式鸬蟆:節(jié)省流量和耗電帅涂,減少用戶使用成本,避免使用時(shí)導(dǎo)致手機(jī)發(fā)燙尤蛮。
小:安裝包小可以降低用戶的安裝成本斯议。

一产捞、快

應(yīng)用啟動(dòng)慢,使用時(shí)經(jīng)澈哂卡頓坯临,是非常影響用戶體驗(yàn)的,應(yīng)該盡量避免出現(xiàn)恋昼】纯浚卡頓的場景有很多,按場景可以分為4類:UI 繪制液肌、應(yīng)用啟動(dòng)挟炬、頁面跳轉(zhuǎn)、事件響應(yīng)嗦哆。引起卡頓的原因很多谤祖,但不管怎么樣的原因和場景,最終都是通過設(shè)備屏幕上顯示來達(dá)到用戶老速,歸根到底就是顯示有問題粥喜,

根據(jù)iOS 系統(tǒng)顯示原理可以看到,影響繪制的根本原因有以下兩個(gè)方面:

1.繪制任務(wù)太重橘券,繪制一幀內(nèi)容耗時(shí)太長额湘。
2.主線程太忙,根據(jù)系統(tǒng)傳遞過來的 VSYNC 信號(hào)來時(shí)還沒準(zhǔn)備好數(shù)據(jù)導(dǎo)致丟幀旁舰。

繪制耗時(shí)太長锋华,有一些工具可以幫助我們定位問題。主線程太忙則需要注意了鬓梅,主線程關(guān)鍵職責(zé)是處理用戶交互供置,在屏幕上繪制像素,并進(jìn)行加載顯示相關(guān)的數(shù)據(jù)绽快,所以特別需要避免任何主線程的事情芥丧,這樣應(yīng)用程序才能保持對用戶操作的即時(shí)響應(yīng)》话眨總結(jié)起來续担,主線程主要做以下幾個(gè)方面工作:

1.UI 生命周期控制
2.系統(tǒng)事件處理
3.消息處理
4.界面布局
5.界面繪制
6.界面刷新

除此之外,應(yīng)該盡量避免將其他處理放在主線程中活孩,特別復(fù)雜的數(shù)據(jù)計(jì)算和網(wǎng)絡(luò)請求等物遇。

二、穩(wěn)

應(yīng)用的穩(wěn)定性定義很寬泛,影響穩(wěn)定性的原因很多询兴,比如內(nèi)存使用不合理乃沙、代碼異常場景考慮不周全、代碼邏輯不合理等诗舰,都會(huì)對應(yīng)用的穩(wěn)定性造成影響警儒。其中最常見的兩個(gè)場景是:Crash 和 ANR,這兩個(gè)錯(cuò)誤將會(huì)使得程序無法使用眶根,比較常用的解決方式如下:

1.提高代碼質(zhì)量蜀铲。比如開發(fā)期間的代碼審核,看些代碼設(shè)計(jì)邏輯属百,業(yè)務(wù)合理性等记劝。
2.代碼靜態(tài)掃描工具。常見工具有Clang Static Analyzer族扰、OCLint厌丑、Infer等等。
3.Crash監(jiān)控别伏。把一些崩潰的信息蹄衷,異常信息及時(shí)地記錄下來,以便后續(xù)分析解決厘肮。
4.Crash上傳機(jī)制愧口。在Crash后,盡量先保存日志到本地类茂,然后等下一次網(wǎng)絡(luò)正常時(shí)再上傳日志信息耍属。

三、省

在移動(dòng)設(shè)備中巩检,電池的重要性不言而喻厚骗,沒有電什么都干不成。對于操作系統(tǒng)和設(shè)備開發(fā)商來說兢哭,耗電優(yōu)化一致沒有停止领舰,去追求更長的待機(jī)時(shí)間,而對于一款應(yīng)用來說迟螺,并不是可以忽略電量使用問題冲秽,特別是那些被歸為“電池殺手”的應(yīng)用,最終的結(jié)果是被卸載矩父。因此锉桑,應(yīng)用開發(fā)者在實(shí)現(xiàn)需求的同時(shí),需要盡量減少電量的消耗窍株。

1.CPU

不論用戶是否正在直接使用, CPU 都是應(yīng)用所使用的主要硬件, 在后臺(tái)操作和處理推送通知時(shí), 應(yīng)用仍然會(huì)消耗 CPU 資源

應(yīng)用計(jì)算的越多,消耗的電量越多.在完成相同的基本操作時(shí), 老一代的設(shè)備會(huì)消耗更多的電量, 計(jì)算量的消耗取決于不同的因素

2.網(wǎng)絡(luò)

智能的網(wǎng)絡(luò)訪問管理可以讓應(yīng)用響應(yīng)的更快,并有助于延長電池壽命.在無法訪問網(wǎng)絡(luò)時(shí),應(yīng)該推遲后續(xù)的網(wǎng)絡(luò)請求, 直到網(wǎng)絡(luò)連接恢復(fù)為止. 此外,應(yīng)避免在沒有連接 WiFi 的情況下進(jìn)行高寬帶消耗的操作.比如視頻流, 眾所周知,蜂窩無線系統(tǒng)(LTE,4G,3G等)對電量的消耗遠(yuǎn)遠(yuǎn)大于 WiFi信號(hào),根源在于 LTE 設(shè)備基于多輸入,多輸出技術(shù),使用多個(gè)并發(fā)信號(hào)以維護(hù)兩端的 LTE 鏈接,類似的,所有的蜂窩數(shù)據(jù)鏈接都會(huì)定期掃描以尋找更強(qiáng)的信號(hào). 因此:我們需要

1)在進(jìn)行任何網(wǎng)絡(luò)操作之前,先檢查合適的網(wǎng)絡(luò)連接是否可用
2)持續(xù)監(jiān)視網(wǎng)絡(luò)的可用性,并在鏈接狀態(tài)發(fā)生變化時(shí)給與適當(dāng)?shù)姆答?br> 3).定位管理器和** GPS**

我們都知道定位服務(wù)是很耗電的,使用 GPS 計(jì)算坐標(biāo)需要確定兩點(diǎn)信息:

1)時(shí)間鎖每個(gè) GPS 衛(wèi)星每毫秒廣播唯一一個(gè)1023位隨機(jī)數(shù), 因而數(shù)據(jù)傳播速率是1.024Mbit/s GPS 的接收芯片必須正確的與衛(wèi)星的時(shí)間鎖槽對齊
2)頻率鎖 GPS 接收器必須計(jì)算由接收器與衛(wèi)星的相對運(yùn)動(dòng)導(dǎo)致的多普勒偏移帶來的信號(hào)誤差

計(jì)算坐標(biāo)會(huì)不斷的使用 CPU 和 GPS 的硬件資源,因此他們會(huì)迅速的消耗電池電量, 那么怎么減少呢民轴?

1)關(guān)閉無關(guān)緊要的特性

判斷何時(shí)需要跟蹤位置的變化, 在需要跟蹤的時(shí)候調(diào)用 startUpdatingLocation方法,無須跟蹤時(shí)調(diào)用stopUpdatingLocation方法.

當(dāng)應(yīng)用在后臺(tái)運(yùn)行或用戶沒有與別人聊天時(shí),也應(yīng)該關(guān)閉位置跟蹤,也就說說,瀏覽媒體庫,查看朋友列表或調(diào)整應(yīng)用設(shè)置時(shí), 都應(yīng)該關(guān)閉位置跟蹤

2)只在必要時(shí)使用網(wǎng)絡(luò)

為了提高電量的使用效率, IOS 總是盡可能地保持無線網(wǎng)絡(luò)關(guān)閉.當(dāng)應(yīng)用需要建立網(wǎng)絡(luò)連接時(shí),IOS 會(huì)利用這個(gè)機(jī)會(huì)向后臺(tái)應(yīng)用分享網(wǎng)絡(luò)會(huì)話,以便一些低優(yōu)先級(jí)能夠被處理, 如推送通知,收取電子郵件等

關(guān)鍵在于每當(dāng)用戶建立網(wǎng)絡(luò)連接時(shí),網(wǎng)絡(luò)硬件都會(huì)在連接完成后多維持幾秒的活動(dòng)時(shí)間.每次集中的網(wǎng)絡(luò)通信都會(huì)消耗大量的電量

要想減輕這個(gè)問題帶來的危害,你的軟件需要有所保留的的使用網(wǎng)絡(luò).應(yīng)該定期集中短暫的使用網(wǎng)絡(luò),而不是持續(xù)的保持著活動(dòng)的數(shù)據(jù)流.只有這樣,網(wǎng)絡(luò)硬件才有機(jī)會(huì)關(guān)閉

4.屏幕

屏幕非常耗電, 屏幕越大就越耗電.當(dāng)然,如果你的應(yīng)用在前臺(tái)運(yùn)行且與用戶進(jìn)行交互,則勢必會(huì)使用屏幕并消耗電量

這里有一些方案可以優(yōu)化屏幕的使用:

1)動(dòng)畫優(yōu)化

當(dāng)應(yīng)用在前臺(tái)時(shí), 使用動(dòng)畫,一旦應(yīng)用進(jìn)入了后臺(tái),則立即暫停動(dòng)畫.通常來說,你可以通過監(jiān)聽 UIApplicationWillResignActiveNotification或UIApplicationDIdEnterBackgroundNotification的通知事件來暫凸ツ或停止動(dòng)畫,也可以通過監(jiān)聽UIApplicationDidBecomeActiveNotification的通知事件來恢復(fù)動(dòng)畫

2)視頻優(yōu)化

視頻播放期間,最好保持屏幕常量.可以使用UIApplication對象的idleTimerDisabled屬性來實(shí)現(xiàn)這個(gè)目的.一旦設(shè)置了 YES, 他會(huì)阻止屏幕休眠,從而實(shí)現(xiàn)常亮.

與動(dòng)畫類似,你可以通過相應(yīng)應(yīng)用的通知來釋放和獲取鎖

用戶總是隨身攜帶者手機(jī),所以編寫省電的代碼就格外重要, 畢竟手機(jī)的移動(dòng)電源并不是隨處可見, 在無法降低任務(wù)復(fù)雜性時(shí), 提供一個(gè)對電池電量保持敏感的方案并在適當(dāng)?shù)臅r(shí)機(jī)提示用戶, 會(huì)讓用戶體驗(yàn)良好。

四后裸、小

應(yīng)用安裝包大小對應(yīng)用使用沒有影響瑰钮,但應(yīng)用的安裝包越大,用戶下載的門檻越高轻抱,特別是在移動(dòng)網(wǎng)絡(luò)情況下飞涂,用戶在下載應(yīng)用時(shí),對安裝包大小的要求更高祈搜,因此,減小安裝包大小可以讓更多用戶愿意下載和體驗(yàn)產(chǎn)品士八。

當(dāng)然容燕,瘦身和減負(fù)雖好,但需要注意瘦身對于項(xiàng)目可維護(hù)性的影響婚度,建議根據(jù)自身的項(xiàng)目進(jìn)行技巧的選取蘸秘。

App安裝包是由資源和可執(zhí)行文件兩部分組成,安裝包瘦身從以下三部分優(yōu)化蝗茁。

資源優(yōu)化:

1.刪除無用的資源
2.刪除重復(fù)的資源
3.無損壓縮圖片
4.不常用資源換為下載

編譯優(yōu)化:

1.去除debug符號(hào)
2.開啟編譯優(yōu)化
3.避免編譯多個(gè)架構(gòu)

可執(zhí)行文件優(yōu)化:

1.去除無用代碼
2.統(tǒng)計(jì)庫占用醋虏,去除無用庫
3.混淆類/方法名
4.減少冗余字符串
5.ARC->MRC (一般不到特殊情況不建議這么做,會(huì)提高維護(hù)成本)

縮減iOS安裝包大小是很多中大型APP都要做的事,一般首先會(huì)對資源文件下手哮翘,壓縮圖片/音頻颈嚼,去除不必要的資源。這些資源優(yōu)化做完后饭寺,我們還可以嘗試對可執(zhí)行文件進(jìn)行瘦身阻课,項(xiàng)目越大,可執(zhí)行文件占用的體積越大艰匙,又因?yàn)锳ppStore會(huì)對可執(zhí)行文件加密限煞,導(dǎo)致可執(zhí)行文件的壓縮率低,壓縮后可執(zhí)行文件占整個(gè)APP安裝包的體積比例大約有80%~90%员凝,還是挺值得優(yōu)化的署驻。

下面是一些常見的優(yōu)化方案:

TableViewCell 復(fù)用

在cellForRowAtIndexPath:回調(diào)的時(shí)候只創(chuàng)建實(shí)例,快速返回cell健霹,不綁定數(shù)據(jù)旺上。在willDisplayCell: forRowAtIndexPath:的時(shí)候綁定數(shù)據(jù)(賦值)。

高度緩存

在tableView滑動(dòng)時(shí)骤公,會(huì)不斷調(diào)用heightForRowAtIndexPath:抚官,當(dāng)cell高度需要自適應(yīng)時(shí),每次回調(diào)都要計(jì)算高度阶捆,會(huì)導(dǎo)致 UI 卡頓凌节。為了避免重復(fù)無意義的計(jì)算钦听,需要緩存高度。

怎么緩存倍奢?

字典朴上,NSCache。

UITableView-FDTemplateLayoutCell

[if !supportLineBreakNewLine]

[endif]

視圖層級(jí)優(yōu)化

不要?jiǎng)討B(tài)創(chuàng)建視圖

在內(nèi)存可控的前提下卒煞,緩存subview痪宰。

善用hidden。

[if !supportLineBreakNewLine]

[endif]

減少視圖層級(jí)

減少subviews個(gè)數(shù)畔裕,用layer繪制元素衣撬。

少用clearColor,maskToBounds扮饶,陰影效果等具练。

[if !supportLineBreakNewLine]

[endif]

減少多余的繪制操作

圖片

不要用JPEG的圖片,應(yīng)當(dāng)使用PNG圖片甜无。

子線程預(yù)解碼(Decode)扛点,主線程直接渲染。因?yàn)楫?dāng)image沒有Decode岂丘,直接賦值給imageView會(huì)進(jìn)行一個(gè)Decode操作陵究。

優(yōu)化圖片大小,盡量不要?jiǎng)討B(tài)縮放(contentMode)奥帘。

盡可能將多張圖片合成為一張進(jìn)行顯示铜邮。

[if !supportLineBreakNewLine]

[endif]

減少透明view

使用透明view會(huì)引起blending,在iOS的圖形處理中翩概,blending主要指的是混合像素顏色的計(jì)算牲距。最直觀的例子就是,我們把兩個(gè)圖層疊加在一起钥庇,如果第一個(gè)圖層的透明的牍鞠,則最終像素的顏色計(jì)算需要將第二個(gè)圖層也考慮進(jìn)來。這一過程即為Blending评姨。

會(huì)導(dǎo)致blending的原因:

UIView的alpha<1难述。

UIImageView的image含有alpha channel(即使UIImageView的alpha是1,但只要image含有透明通道吐句,則仍會(huì)導(dǎo)致blending)胁后。

[if !supportLineBreakNewLine]

[endif]

為什么blending會(huì)導(dǎo)致性能的損失?

原因是很直觀的嗦枢,如果一個(gè)圖層是不透明的攀芯,則系統(tǒng)直接顯示該圖層的顏色即可。而如果圖層是透明的文虏,則會(huì)引起更多的計(jì)算侣诺,因?yàn)樾枰蚜硪粋€(gè)的圖層也包括進(jìn)來殖演,進(jìn)行混合后的顏色計(jì)算。

opaque設(shè)置為YES年鸳,減少性能消耗趴久,因?yàn)镚PU將不會(huì)做任何合成,而是簡單從這個(gè)層拷貝搔确。

[if !supportLineBreakNewLine]

[endif]

減少離屏渲染

離屏渲染指的是在圖像在繪制到當(dāng)前屏幕前彼棍,需要先進(jìn)行一次渲染,之后才繪制到當(dāng)前屏幕膳算。

OpenGL中座硕,GPU屏幕渲染有以下兩種方式:

On-Screen

Rendering即當(dāng)前屏幕渲染,指的是GPU的渲染操作是在當(dāng)前用于顯示的屏幕緩沖區(qū)中進(jìn)行涕蜂。

Off-Screen

Rendering即離屏渲染坎吻,指的是GPU在當(dāng)前屏幕緩沖區(qū)以外新開辟一個(gè)緩沖區(qū)進(jìn)行渲染操作。

[if !supportLineBreakNewLine]

[endif]

小結(jié)

性能優(yōu)化不是更新一兩個(gè)版本就可以解決的宇葱,是持續(xù)性的需求,持續(xù)集成迭代反饋刊头。在實(shí)際的項(xiàng)目中黍瞧,在項(xiàng)目剛開始的時(shí)候,由于人力和項(xiàng)目完成時(shí)間限制原杂,性能優(yōu)化的優(yōu)先級(jí)比較低印颤,等進(jìn)入項(xiàng)目投入使用階段,就需要把優(yōu)先級(jí)提高穿肄,但在項(xiàng)目初期年局,在設(shè)計(jì)架構(gòu)方案時(shí),性能優(yōu)化的點(diǎn)也需要提早考慮進(jìn)去咸产,這就體現(xiàn)出一個(gè)程序員的技術(shù)功底了矢否。

什么時(shí)候開始有性能優(yōu)化的需求,往往都是從發(fā)現(xiàn)問題開始脑溢,然后分析問題原因及背景僵朗,進(jìn)而尋找最優(yōu)解決方案,最終解決問題屑彻,這也是日常工作中常會(huì)用到的處理方式验庙。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市社牲,隨后出現(xiàn)的幾起案子粪薛,更是在濱河造成了極大的恐慌,老刑警劉巖搏恤,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件违寿,死亡現(xiàn)場離奇詭異湃交,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)陨界,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門巡揍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人菌瘪,你說我怎么就攤上這事腮敌。” “怎么了俏扩?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵糜工,是天一觀的道長。 經(jīng)常有香客問我录淡,道長捌木,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任嫉戚,我火速辦了婚禮刨裆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘彬檀。我一直安慰自己帆啃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布窍帝。 她就那樣靜靜地躺著努潘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坤学。 梳的紋絲不亂的頭發(fā)上疯坤,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音深浮,去河邊找鬼压怠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛略号,可吹牛的內(nèi)容都是我干的刑峡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼玄柠,長吁一口氣:“原來是場噩夢啊……” “哼突梦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起羽利,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤宫患,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后这弧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娃闲,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虚汛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了皇帮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卷哩。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖属拾,靈堂內(nèi)的尸體忽然破棺而出将谊,到底是詐尸還是另有隱情,我是刑警寧澤渐白,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布尊浓,位于F島的核電站,受9級(jí)特大地震影響纯衍,放射性物質(zhì)發(fā)生泄漏栋齿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一襟诸、第九天 我趴在偏房一處隱蔽的房頂上張望瓦堵。 院中可真熱鬧,春花似錦歌亲、人聲如沸谷丸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泉唁,卻和暖如春鹅龄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亭畜。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工扮休, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拴鸵。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓玷坠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親劲藐。 傳聞我的和親對象是個(gè)殘疾皇子八堡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 性能問題的主要原因是什么,原因有相同的聘芜,也有不同的兄渺,但歸根到底,不外乎內(nèi)存使用汰现、代碼效率挂谍、合適的策略邏輯叔壤、代碼質(zhì)量...
    6568aa67ab76閱讀 397評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,089評論 1 32
  • 說到 Android 系統(tǒng)手機(jī),大部分人的印象是用了一段時(shí)間就變得有點(diǎn)卡頓口叙,有些程序在運(yùn)行期間莫名其妙的出現(xiàn)崩潰炼绘,...
    壯壯闖天下閱讀 263評論 0 0
  • 開頭是難忘,結(jié)局是忘記妄田。你什么時(shí)候會(huì)有這樣的感覺呢俺亮?是看一本書?或是一部電影形庭?又或是一場貫穿青春的戀愛铅辞? 無論是書...
    風(fēng)衣豪哥閱讀 390評論 0 0
  • 太陽垂了一半肩 依著群山, 淡金的薄紗覆住了… 未完成的告別萨醒, 剩最后一行… 在即將到來的最深邃的黑暗前 它忍著疼...
    腎毒閱讀 246評論 23 22