iOS快速將顯卡中數(shù)據(jù)讀出壓縮成視頻-cocos2dx擴(kuò)展
手機(jī)平臺(tái)性能是個(gè)關(guān)鍵問題。
壓縮視頻分成3個(gè)步驟:
讀取顯卡數(shù)據(jù), 使用編碼器壓縮,保存文件。
使用libav 壓縮的時(shí)候,軟件編碼器效率不夠,在itouch5上面只能做到5-6 fps。
因此使用ios平臺(tái)自帶的AVFoundtion庫來做,硬件加速編碼,具體做法參考
http://stackoverflow.com/questions/9661259/record-the-drawing-as-a-m4v-video-file-opengl/9672890#9672890
使用corevideo 庫提供的函數(shù), 在itouch5上能做到12-13fps。
接下來的瓶頸主要在從顯卡中讀取數(shù)據(jù)上面 即glReadPixel
ios 提供一種texturecache 可以將cpu存儲(chǔ)器和顯卡存儲(chǔ) map到一起,但是就不能像操作cpu存儲(chǔ)一樣方便的改動(dòng)這塊區(qū)域的數(shù)據(jù)了, 具體硬件機(jī)制不是很了解, 但是這樣可以大大降低 消耗的時(shí)間,只做獲取數(shù)據(jù) 壓縮視頻任務(wù)的話 可以達(dá)到60fps的效率。 具體參考
http://stackoverflow.com/questions/9550297/faster-alternative-to-glreadpixels-in-iphone-opengl-es-2-0
這兩個(gè)回答是一個(gè)人,這位仁兄的項(xiàng)目:
https://github.com/BradLarson/GPUImage
主要參考其中的 MovieWrite 類。
因此要在cocos2dx上面擴(kuò)展游戲視頻錄制的功能,則需要改動(dòng)
CCDirector 添加錄制游戲狀態(tài),將當(dāng)前游戲場景繪制到texture 中
接著將這個(gè)texture內(nèi)容繪制到屏幕上用于顯示
接著將這個(gè)texutre繪制到 視頻cache 的framebuffer中 用于生成視頻。
這塊的代碼可以參考CCRenderTexture 部分的代碼。