幀同步在競(jìng)技類網(wǎng)絡(luò)游戲中的應(yīng)用

幀同步在網(wǎng)上可以搜的資料比較少,關(guān)于游戲的更是沒有,不過,實(shí)現(xiàn)的原理也比較簡(jiǎn)單,最近幾天就寫了份關(guān)于幀同步的文檔,當(dāng)作給同事掃掃盲,順便也在這里發(fā)發(fā),可以給其他人參考參考

--競(jìng)技類網(wǎng)絡(luò)游戲設(shè)計(jì)方案

一、????????前言

幀同步,根據(jù)wiki百科的定義是,一種對(duì)同步源進(jìn)行像素級(jí)同步顯示的處理技術(shù),對(duì)于網(wǎng)絡(luò)上的多個(gè)接入者,一個(gè)信號(hào)將會(huì)通過主機(jī)同步發(fā)送給其他人,并同步顯示在各個(gè)終端上。同步信號(hào)可以是每幀的像素?cái)?shù)據(jù),也可以是影響數(shù)據(jù)變化的關(guān)鍵事件信息。

幀同步在網(wǎng)絡(luò)游戲中的應(yīng)用,設(shè)計(jì)上有異于傳統(tǒng)的mmorpg游戲,因?yàn)榭梢猿休d更大量的后臺(tái)計(jì)算,實(shí)現(xiàn)類單機(jī)的效果,所以可應(yīng)用在類似射擊類、飛機(jī)類中實(shí)現(xiàn)彈幕計(jì)算或者格斗類的高精度打擊體驗(yàn)

本文將主要介紹下幀同步與傳統(tǒng)mmorpg設(shè)計(jì)框架的異同點(diǎn)以及相關(guān)的幾個(gè)設(shè)計(jì)方案,最后,深入展開對(duì)其中一種實(shí)現(xiàn)方案的分析,而相關(guān)的反外掛和斷線重連機(jī)制等技術(shù)難點(diǎn)暫不在本文討論。

二、????????幀同步在游戲中的應(yīng)用

網(wǎng)絡(luò)游戲中,游戲服務(wù)的架構(gòu)大致可以分為2種模式,分別是cs模式和p2p模式

cs模式框架如圖1(c為客戶,?GSS為游戲狀態(tài)服務(wù)器)

圖1

如圖1,游戲狀態(tài)服務(wù)器(GSS)單獨(dú)部署,負(fù)責(zé)對(duì)網(wǎng)絡(luò)上各個(gè)接入者提供服務(wù),當(dāng)GSS狀態(tài)發(fā)生變化時(shí),將狀態(tài)同步發(fā)送給各個(gè)接收者。

p2p模式框架如圖2(c為客戶,GSS為游戲狀態(tài)服務(wù)器):

圖2

圖2中,游戲狀態(tài)服務(wù)器存在于各個(gè)客戶主機(jī)上,游戲狀態(tài)的改變直接來自于各個(gè)客戶端的輸入。

以上2個(gè)服務(wù)框架中,cs模式,由于GSS服務(wù)器只有一個(gè),游戲狀態(tài)能保證絕對(duì)一致,但GSS可能同時(shí)服務(wù)上萬(wàn)個(gè)玩家,由于機(jī)器性能以及網(wǎng)絡(luò)帶寬等硬件資源限制,服務(wù)器對(duì)大部分情況都無法進(jìn)行非常嚴(yán)格的檢查和處理;p2p模式相對(duì)于cs模式,同時(shí)連接的玩家有限,所以可以進(jìn)行比較精細(xì)的運(yùn)算,可實(shí)現(xiàn)類似射擊類、飛機(jī)類的彈幕計(jì)算或者格斗類的高精度打擊體驗(yàn),但是,由于端到端的通訊方式,隨著同時(shí)接入用戶的增加,通訊量呈指數(shù)級(jí)增長(zhǎng),所以,其對(duì)同時(shí)接入的數(shù)量上會(huì)限制得比較嚴(yán)格,適合少量同屏的競(jìng)技類等游戲。

p2p模式中,由于存在多份的GSS,如何保證各個(gè)GSS一致也需要特殊考慮,???????幀同步算法在游戲中的應(yīng)用,主要就是為了解決p2p模式下的GSS一致性問題。實(shí)現(xiàn)原理是將游戲處理細(xì)化為幀,對(duì)于每幀,在同樣的運(yùn)行環(huán)境中,保證同樣的輸入的情況下,將得到同樣的輸出結(jié)果。

圖3

圖3中,初始狀態(tài)都為1,序列幀第二幀時(shí),輸入加1操作,則狀態(tài)變?yōu)?,第三幀時(shí)無輸入,狀態(tài)不變,第四幀時(shí),輸入加1操作,狀態(tài)變?yōu)?.對(duì)于同個(gè)運(yùn)行環(huán)境的各個(gè)客戶端來說,相同的輸入狀況下,將得到相關(guān)的輸出結(jié)果,如圖4效果。

圖4

通常,為了用戶的輸入能及時(shí)的響應(yīng)以及游戲狀態(tài)的過度能夠平滑,會(huì)將GSS設(shè)置為20到30幀以上。并且,由于客戶端機(jī)器性能或者設(shè)置的差異,GSS的狀態(tài)無法與游戲渲染幀實(shí)現(xiàn)一一對(duì)應(yīng),所以,GSS與表現(xiàn)層必須做到完全的分離,否則將因?yàn)槟承┘?xì)小的誤差被放大最終導(dǎo)致游戲出現(xiàn)完全不同的結(jié)果。

圖5

如圖5,非確定的渲染層的輸出,完全由GSS來驅(qū)動(dòng),GSS保證幀數(shù)的穩(wěn)定,即使出現(xiàn)網(wǎng)絡(luò)延遲,也必須在確保收到該幀的所有輸入后才執(zhí)行該幀的處理。

實(shí)現(xiàn)方案上,大致可以分出3種,分別是無主機(jī)結(jié)構(gòu)、有主機(jī)結(jié)構(gòu)、服務(wù)器主機(jī)結(jié)構(gòu)

u無主機(jī)結(jié)構(gòu)

在圖2的拓?fù)浣Y(jié)構(gòu)中,所有GSS功能對(duì)等,該方案需要進(jìn)行特殊的對(duì)幀處理,確保所有客戶端都已經(jīng)同步并且收到所有的輸入。但是,由于網(wǎng)絡(luò)上的各個(gè)客戶端完全對(duì)等,一旦某個(gè)用戶網(wǎng)絡(luò)狀況出現(xiàn)延遲或者中斷等異常,將影響其他用戶的操作體驗(yàn),所以該方案簡(jiǎn)單公平但體驗(yàn)容易受限

u有主機(jī)結(jié)構(gòu)

圖6

如圖6,在各個(gè)客戶端中隨機(jī)選擇一個(gè)的GSS作為主機(jī),同時(shí)負(fù)責(zé)對(duì)幀控制及輸入輸出管理,其他GSS僅跟GSS主機(jī)通訊,GSS之間互相不通訊。該方案的好處是,游戲的體驗(yàn)只受主機(jī)與本機(jī)的網(wǎng)絡(luò)與本機(jī)器狀況的影響,其他GSS出現(xiàn)的任何故障都不會(huì)影響其他人,當(dāng)GSS主機(jī)完全失去聯(lián)系時(shí),其他GSS也可以重新仲裁得出新的GSS主機(jī)來,但該結(jié)構(gòu)主機(jī)在客戶端,容易給外掛有可乘之機(jī),對(duì)輸入對(duì)幀等能進(jìn)行特殊處理,最終導(dǎo)致游戲喪失公平性。此方案能保證玩家體驗(yàn),但安全性較低

u服務(wù)器主機(jī)結(jié)構(gòu)

服務(wù)器主機(jī)結(jié)構(gòu),是將圖6的結(jié)構(gòu)中的GSS主機(jī)的的對(duì)幀控制及輸入輸出管理功能放在服務(wù)器上,降低GSS客戶端的客觀影響,保證了大部分玩家的體驗(yàn),且其中有玩家作弊,也能馬上檢測(cè)到,保證游戲的公平性,但結(jié)構(gòu)上已脫離p2p設(shè)計(jì),通訊流量隨用戶增加,負(fù)額指數(shù)級(jí)增長(zhǎng)。該方案安全性高,保證玩家體驗(yàn),但對(duì)服務(wù)負(fù)載有一定的要求。

u其他

融合有/無主機(jī)與服務(wù)器主機(jī)的結(jié)構(gòu)。服務(wù)器主機(jī)結(jié)構(gòu)的特點(diǎn)在于控制權(quán)在服務(wù)端,在有狀態(tài)的網(wǎng)絡(luò)游戲中,可以有效防止游戲數(shù)據(jù)修改、游戲加速等外掛,在服務(wù)端硬件資源方面,可以增加有/無主機(jī)結(jié)構(gòu)減輕負(fù)擔(dān),大部分功能用有/無主機(jī)結(jié)構(gòu)處理,關(guān)鍵操作由服務(wù)器主機(jī)結(jié)構(gòu)處理等,讓GSS主機(jī)與服務(wù)器主機(jī)協(xié)同服務(wù)

三、????????服務(wù)器主機(jī)結(jié)構(gòu)設(shè)計(jì)

服務(wù)器主機(jī)結(jié)構(gòu)的特點(diǎn)如上所述,這里再深入展開對(duì)該結(jié)構(gòu)的分析與設(shè)計(jì)。

服務(wù)器設(shè)計(jì)

圖7

服務(wù)器主要是起到控制作用,進(jìn)行客戶端的對(duì)幀控制和輸入輸出管理。如圖7,服務(wù)器每幀都發(fā)驅(qū)動(dòng)幀驅(qū)動(dòng)客戶端執(zhí)行幀處理,當(dāng)客戶端有輸入被服務(wù)器接收到,則服務(wù)器當(dāng)前幀內(nèi)將輸入同步輸出給各個(gè)客戶端.

網(wǎng)絡(luò)上由于客戶端的狀況多種多樣,客戶端幀數(shù)可能跟不上服務(wù)器,如圖8所示,如果客戶端出現(xiàn)掉幀情況,則在收到驅(qū)動(dòng)幀后需要加速執(zhí)行,以追上其他客戶端的速度,避免掉幀的用戶一直在對(duì)過去的事件進(jìn)行響應(yīng)。

游戲應(yīng)該優(yōu)先保證正常用戶的體驗(yàn),所以當(dāng)有玩家出現(xiàn)卡幀情況的時(shí)候,不應(yīng)選擇暫停其他玩家,而是讓他慢慢的追趕上來,設(shè)計(jì)上,服務(wù)器即可以采用客戶端的正常速度,按幀驅(qū)動(dòng)客戶端,但當(dāng)網(wǎng)絡(luò)都出現(xiàn)突發(fā)狀況的時(shí)候,如圖9,通訊異常時(shí),2個(gè)客戶端都對(duì)幀數(shù)2缺失,如果服務(wù)器照常運(yùn)行,到恢復(fù)網(wǎng)絡(luò)狀況時(shí),會(huì)出現(xiàn)情況是,每個(gè)客戶端都卡了幾幀之后,加速拉了幾幀。所以,針對(duì)這種情況,增加客戶端的對(duì)幀操作,即客戶端執(zhí)行第1幀時(shí),跟服務(wù)器說可以播放第二幀了,然后服務(wù)器開始驅(qū)動(dòng)第二幀動(dòng)作,考慮網(wǎng)絡(luò)延遲情況,可以提前對(duì)幀第n幀的,效果如圖9,左邊客戶端第二個(gè)對(duì)幀操作使服務(wù)器開始推動(dòng)第二幀進(jìn)行,而右邊客戶端的第二個(gè)對(duì)幀動(dòng)作其實(shí)不起任何作用

圖8

圖9

偽代碼

代碼不貼了

客戶端設(shè)計(jì)

圖10

客戶端設(shè)計(jì)由兩部分組成,分別是GSS模塊和渲染模塊。

GSS模塊包含物品系統(tǒng)、角色系統(tǒng)、AI系統(tǒng)、場(chǎng)景系統(tǒng)還有其他相關(guān)系統(tǒng)等,同時(shí),輸入輸出和幀數(shù)控制也一起集成在GSS模塊中。GSS中各系統(tǒng)功能分別是:

物品系統(tǒng):???????游戲物品以及物品的效果

角色系統(tǒng):???????角色包括玩家角色、npc及apc等

ai系統(tǒng): ?????????驅(qū)動(dòng)apc行動(dòng)的控制模塊

場(chǎng)景系統(tǒng):?????場(chǎng)景物件、地圖、尋路等

其他系統(tǒng): ?????其他類似技能、狀態(tài)等系統(tǒng)

輸入輸出模塊:???????監(jiān)聽玩家輸入,將玩家輸入上報(bào)服務(wù)器,同時(shí)監(jiān)聽服務(wù)器輸入,綁定當(dāng)前幀輸出

幀數(shù)控制模塊: ?????監(jiān)聽服務(wù)器驅(qū)動(dòng)幀,驅(qū)動(dòng)執(zhí)行每幀處理

GSS模塊中各個(gè)系統(tǒng)的執(zhí)行,由幀數(shù)驅(qū)動(dòng),不引入其他時(shí)間線。有如物品持續(xù)時(shí)間、狀態(tài)持續(xù)時(shí)間等都以幀數(shù)作為唯一的時(shí)間軸。幀與幀之間的播放頻率,則由服務(wù)器統(tǒng)一控制,但由于網(wǎng)絡(luò)抖動(dòng)等影響,幀的頻率并不是太穩(wěn)定,為避免播放抖動(dòng),幀數(shù)控制器需要進(jìn)行一定的平滑處理。

圖11

客戶端的渲染層,由GSS模塊驅(qū)動(dòng),為減少模塊間的耦合,GSS模塊使用事件通知機(jī)制驅(qū)動(dòng)渲染層表現(xiàn)。具體細(xì)分事件類型如圖12(具體項(xiàng)目具體事件拆解)

由于渲染層與GSS只做到事務(wù)級(jí)的同步,而GSS與渲染層的播放速率有可能不同,則為保證較好的表現(xiàn)效果,GSS的邏輯幀需要與渲染層的渲染幀做固定比率的綁定,譬如圖13的1:2,當(dāng)GSS邏輯幀數(shù)不變的情況下,渲染幀掉幀時(shí),能經(jīng)過換算得到當(dāng)前邏輯幀對(duì)應(yīng)的渲染幀數(shù),出現(xiàn)GSS幀數(shù)暫停時(shí),則邏輯幀也跟著一起暫停

圖13

邏輯幀與渲染幀綁定算法(偽代碼)

代碼不貼了

其中??OnUpdate由引擎在每幀調(diào)用,GetNewestFrame獲得邏輯幀通知過來的最新幀,這樣,保證了邏輯幀中關(guān)鍵幀進(jìn)行傷害計(jì)算時(shí),渲染幀不會(huì)脫幀嚴(yán)重。

四、????????反外掛與斷線重連

稍等后續(xù)文章

對(duì)于一個(gè)游戲來講,戰(zhàn)斗就是靈魂,如果戰(zhàn)斗做不到極致,其他方面做的再好也是徒勞,這幾年,也參與了很多游戲的開發(fā),其中有很多游戲是從決策到死掉全程參與,深有感慨。從端游到頁(yè)游 從頁(yè)游再到手游 每一個(gè)新市場(chǎng)機(jī)會(huì)出現(xiàn)的時(shí)候,都是從閉著眼睛就能賺錢到大部分賺不到錢過度,對(duì)游戲的開發(fā)技術(shù)都要求也是越來越高,只不過每個(gè)市場(chǎng)到成熟的時(shí)間都被大大縮短了。對(duì)于戰(zhàn)斗來講很多都是策劃腦補(bǔ)的跟實(shí)際做出來的完全不是一回事,很多原因都是戰(zhàn)斗方案選型就是錯(cuò)誤的。

從程序角度來講,我把戰(zhàn)斗從兩個(gè)維度分類:

1、從操作方式上分為回合操作、即時(shí)操作。

2、從交互方式上分為 離線戰(zhàn)斗 聯(lián)網(wǎng)戰(zhàn)斗,這個(gè)地方需要說明一下,有些游戲雖然也能進(jìn)攻別人,例如COC 但是因?yàn)閼?zhàn)斗的時(shí)候,另外一個(gè)人是不可以操作的,類似于這樣的戰(zhàn)斗也可以稱為離線戰(zhàn)斗。

基本上所有的戰(zhàn)斗都是以上兩種方式在某種程度的組合而已,例如夢(mèng)幻西游可以認(rèn)為是聯(lián)網(wǎng)戰(zhàn)斗、回合操作類型。

最近比較火的全民超神,王者榮耀,屬于 (聯(lián)網(wǎng)戰(zhàn)斗|離線戰(zhàn)斗)即時(shí)操作類型。

最新網(wǎng)易出的功夫熊貓 屬于 (聯(lián)網(wǎng)戰(zhàn)斗|離線戰(zhàn)斗)即時(shí)操作類型,相對(duì)于dota類的全民超神、王者榮耀,他對(duì)延遲要求的更高了。

如果在立項(xiàng)初期,項(xiàng)目計(jì)劃時(shí)候不確定游戲的操作類型,以及網(wǎng)絡(luò)要求,做得后期要想調(diào)整的話,改動(dòng)是致命的,假設(shè)按照之前時(shí)空獵人的方式實(shí)現(xiàn)的純離線戰(zhàn)斗及時(shí)游戲,最多也只能做做離線PVP,如果想增加聯(lián)網(wǎng)PVP的功能的話,對(duì)于程序來講幾乎需要重寫戰(zhàn)斗。

隨著移動(dòng)游戲市場(chǎng)越來越成熟,對(duì)于戰(zhàn)斗的要求也在提高,原來做一款A(yù)RPG,只有單機(jī)玩法就足夠了,不需要開發(fā)實(shí)時(shí)PVP,但是現(xiàn)在市面上的ARPG不僅可以聯(lián)網(wǎng)PVP,甚至可以聯(lián)網(wǎng)組隊(duì)PVE了,所以我感覺如果現(xiàn)在再去做游戲的話,只是一個(gè)單機(jī)玩法,或者是離線PVP玩法已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足現(xiàn)代玩家的口味了。

我認(rèn)為現(xiàn)在戰(zhàn)斗系統(tǒng)需要滿足一下幾點(diǎn)。

1、一定要有離線PVE玩法,或者離線PVP玩法,可以在讓玩家在網(wǎng)絡(luò)不好的時(shí)候消遣,節(jié)省流量。(全民超神、王者榮耀在5V5匹配時(shí)候都有一定幾率匹配到離線戰(zhàn)斗,這個(gè)時(shí)候是不耗流量的,其他人全是AI控制的)

2、一定要有在線PVP,在線PVE,能夠讓玩家在網(wǎng)絡(luò)比較好的時(shí)候,實(shí)時(shí)競(jìng)技。增加可玩性。

3、戰(zhàn)斗中,盡最大程度節(jié)省玩家的流量,例如全民超神這款游戲,一場(chǎng)30分鐘的戰(zhàn)斗基本上要消耗掉20M的流量,而且此類游戲大部分是玩的聯(lián)網(wǎng)戰(zhàn)斗,基本上在非wifi情況下沒法玩。

4、需要有戰(zhàn)斗回放機(jī)制,可以讓策劃設(shè)計(jì)離線玩法的時(shí)候更自由,例如COC,戰(zhàn)斗回放基本變成了它游戲的一部分。

5、防作弊,如果有離線玩法的話,一定有機(jī)制對(duì)離線玩法的結(jié)果進(jìn)行驗(yàn)證,要不然等你游戲真火了,你就知道錯(cuò)了。

6、實(shí)現(xiàn)難度相對(duì)較低。

對(duì)于聯(lián)網(wǎng)游戲來講,同步的方式主要分為兩種,狀態(tài)同步、幀同步。

1、狀態(tài)同步:顧名思義,是指的將其他玩家的狀態(tài)行為同步的方式,一幫情況下AI邏輯,技能邏輯,戰(zhàn)斗計(jì)算都由服務(wù)器運(yùn)算,只是將運(yùn)算的結(jié)果同步給客戶端,客戶端只需要接受服務(wù)器傳過來的狀態(tài)變化,然后更新自己本地的動(dòng)作狀態(tài)、Buff狀態(tài),位置等就可以了,但是為了給玩家好的體驗(yàn),減少同步的數(shù)據(jù)量,客戶端也會(huì)做很多的本地運(yùn)算,減少服務(wù)器同步的頻率以及數(shù)據(jù)量。

2、 幀同步:RTS游戲常采用的一種同步技術(shù) ,上一種狀態(tài)同步方式數(shù)據(jù)量會(huì)隨著需要同步的單位數(shù)量增長(zhǎng),對(duì)于RTS游戲來講動(dòng)不動(dòng)就是幾百個(gè)的單位可以被操作,如果這些都需要同步的話,數(shù)據(jù)量是不能被接受的,所以幀同步不同步狀態(tài),只同步操作,每個(gè)客戶端接受到操作以后,通過運(yùn)算可以達(dá)到一致的狀態(tài)(通過隨機(jī)種子保證所有客戶端隨機(jī)序列一致),這樣的情況下就算單位再多,他的同步量也不會(huì)隨之增加。

下面我們從以上的5個(gè)方面對(duì)各自實(shí)現(xiàn)方式進(jìn)行描述:

總結(jié)一下:

1、對(duì)于回合制戰(zhàn)斗來講,其實(shí)選用哪種方式實(shí)現(xiàn)不是特別重要了,因?yàn)楸旧韺?shí)現(xiàn)難度不是很高,采用狀態(tài)同步也能實(shí)現(xiàn)離線戰(zhàn)斗驗(yàn)證。所以采用幀同步的必要性不是很大。

2、對(duì)于單位比較多的RTS游戲一定是幀同步,對(duì)于COC來講,他雖然是離線游戲,但是他在一樣輸入的情況下是能得到一樣結(jié)果的,所以也可以認(rèn)為他是用幀同步方式實(shí)現(xiàn)的戰(zhàn)斗系統(tǒng)。

3、對(duì)于對(duì)操作要求比較高的,例如MOBA類游戲有碰撞(玩家、怪物可以互相卡位)、物理邏輯,純物理類即時(shí)可玩休閑游戲,幀同步實(shí)現(xiàn)起來比較順暢,(有開源的Dphysics 2D物理系統(tǒng)可用 它是Determisti的)。

4、對(duì)于戰(zhàn)斗時(shí)大地圖MMORPG的,一個(gè)地圖內(nèi)會(huì)有成千上百的玩家,不是小房間性質(zhì)的游戲,只能使用狀態(tài)同步,只同步自己視野的狀態(tài)。

5、幀同步有個(gè)缺點(diǎn),不能避免玩家采用作弊工具開圖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評(píng)論 19 139
  • 農(nóng)藥自從上線以來,依靠著強(qiáng)大的產(chǎn)品力以及騰訊的運(yùn)營(yíng)能力,在游戲市場(chǎng)上表現(xiàn)可謂是風(fēng)生水起,根據(jù)第三方的調(diào)研數(shù)據(jù)顯示,...
    溫冷月閱讀 2,115評(píng)論 0 3
  • 我走著,一片梧桐葉飄落下來,就在我眼前,我伸手接住了它。 它已經(jīng)完全沒了水,基本算是標(biāo)本了,再也不會(huì)隨著微風(fēng)搖曳身...
    丁香與海閱讀 453評(píng)論 3 4
  • 【每日千字 DY.26】 在大多數(shù)人眼中,深圳都是一個(gè)沒有歷史的城市,說起深圳的景點(diǎn),也無礙乎就是世界之窗、錦繡中...
    可爸亮閱讀 1,281評(píng)論 0 1
  • 以前聽周圍朋友分手的原因,多是性格不合。但我知道,其實(shí)不是,分手的原因只有一個(gè),不夠愛。 我以為我很幸運(yùn),即便他一...
    雨中的向日葵閱讀 896評(píng)論 0 0

友情鏈接更多精彩內(nèi)容