1. 程式人生 > >iOS 大批量彈幕小論(粒子彈幕)

iOS 大批量彈幕小論(粒子彈幕)

etime 朋友 ios 模式 任務 監測 strong nts tab

一、現狀

如今直播類、視頻播放器等基本都有彈幕模式。

為了保持性能和內存可控,基本是在初始化的時候生成一個Pool(Pool的容量是設定好的), 也就是利用重用機制(可以想象一下UITableView的重用機制,但是這個Pool和tableview機制略有不同)。每生成一個彈幕就丟到Pool裏,當達到Pool最大容量時,就得等待,等待Pool裏的某個彈幕A飛出屏幕外完成這一任務,然後再取 隊列裏的 彈幕任務, 賦於該 彈幕A新生。當彈幕量特別大的時候, 服務器 或是 客戶端就不得 不對 隊列的彈幕任務進行取舍,因為你沒有辦法處理那麽多的彈幕。延遲太久,體驗會太差。

二、實際需求問題

這時候你們的產品肯定不幹了,為什麽不能多顯示點彈幕?不管你重疊還是什麽,你得把彈幕盡最大可能展示出來,這樣才能顯示出這個房間 或是 視頻的 人氣麽,要的就是彈幕炸屏效果!(程序員只能說臣妾做不到啊!彈幕多,會卡爆了!)

為了保持幀率,彈幕的最大量肯定是有上限的,那怎麽突破上限而不影響性能呢?

樓主突發奇想,為啥子 粒子效果那麽 炫,粒子那麽多可以妥妥的展示而不影響性能呢?

我們是否可以把彈幕當成粒子呢?

三、解決方案設計

我們需要了解兩個類,一個是 CAEmitterLayer ,一個是 CAEmitterCell 。

我們需要做的:

1.把彈幕背景 和 文字 轉換成 CGImageRef 賦值給 CAEmitterCell ->contents

2.定時器,定時更換 CAEmitterLayer -> emitterCells 粒子源(彈幕)

3.協調好生命周期 ,CAEmitterCell->

birthRate , CAEmitterCell->lifetime , CAEmitterCell->lifetimeRange , 以及你的定時器刷新周期。

4.CAEmitterCell一些生成位置什麽的自己看了。

小結:樓主測試了下每秒1000個彈幕(純隨機數字彈幕,設備iphone 6 16G),妥妥的60fps 不掉幀,不過切換界面會有一點點卡頓,可以接受(可以在離開界面前關閉彈幕或是其它優化一下)。

有需求的朋友可以嘗試嘗試,反正我是用不到。(不過粒子彈幕缺點是,彈出去的彈幕如潑出去的水,是不可控的,沒法監測碰撞 點擊等事件)

iOS 大批量彈幕小論(粒子彈幕)