怎樣在遊戲里錄像?

用U3D做的遊戲,想加幾個攝像機在不同角度,怎樣保存影像?


如果你要錄屏的話有很多方式(不限於U3D),隨便寫點供參考,想得起來的多少寫多少:

Windows:

GDI 全屏:fullscreen desktop BitBlt 速度是 20ms / 幀

GDI 窗口:Win7+可以錄製遊戲和非遊戲,XP以前只能錄製普通界面,截不到遊戲窗口

DirectDraw 全屏:full screen primary surface 非同步到 offscreen-surface XP下閃電速度 1ms / 幀

D3D9: render target -&> offscreen surface XP下 16ms Win7 下 10ms

D3D Hook: Hook Device::Present -&> 保存 StateBlock -&> 截屏 -&> 恢復 StateBlock 極速!

Linux:

framebuffer: 打開 /dev/fb0 映射到內存,直接讀裡面內容,部分顯卡驅動啟用硬體加速繪圖後,framebuffer會被跳過,直接調用 framebuffer 導致讀取出來的東西為空。

Android:

framebuffer: 需要 root 許可權才能訪問 framebuffer

RootView: 取得 root view 然後得到 drawing cache 然後保存,兼容性好,慢。

OpenGL:直接 glReadPixel 保險,但是會卡到應用。

OpenGL FBO: 更改渲染的 FBO ,讓渲染到紋理,從紋理取下來,還行,速度還好。

screenshot: SurfaceComposerClient::getBuiltInDisplay Android 4.0 以後,性能不錯。

native buffer: ANativeWindowBuffer -&> GraphicBuffer -&> 映射讀取, 性能不錯

iOS:

OpenGL: 直接 glReadPixel 同 Android,同樣會卡到應用

OpenGL FBO: 渲染到 FBO,讀取下來,還行。

大部分方法可以用 Hook 的方式注入到目標程序,或者系統 API,在不需要目標程序改一行代碼的情況下實現功能。

歡迎補充。。。


這裡提供一種另外的錄像機制,其實就是一種回放機制吧。

這裡需要兩個記錄器。

1.在遊戲整個網路消息接收層的頂端,加裝一個記錄器,按照時間戳的順序,將所有接收的到消息包序列化存到一個文件中來。

2.在遊戲整個輸入層的頂端,加裝一個記錄器,將用戶操作的windows消息(KEYDOWN,KEYUP,LBUTTONDOWN,LBUTTONUP,ONCHAR)等消息,按照用戶操作的時間戳序列化存到一個文件中來。

回放過程:

因為開始將收到的網路包已經按時序錄好,用戶輸入也按時序錄好。我們就按時序來將他們回放,還是那個客戶端,但是客戶端就像一個無知的小孩一樣,並不了解頂層的網路消息是真的來自伺服器還是我們的回放器,對於客戶端來說上層都只是個黑盒。同理對於用戶輸入,其實是被上層回放器接管了,在回放器中會偽造WM消息來模擬客戶端用戶的輸入,就在這用戶輸入回放網路消息回放的時序完美搭配下,一個網路遊戲的客戶端就這樣被欺騙的完美的運行下去。雖然在用戶輸入回放下,比如在100秒時模擬了向前移動W鍵按下,會給伺服器發出移動請求。但這個請求在回放模式下是永遠不會到達伺服器的(立即丟棄了),但是由於錄製的時候完美的時間戳的時序搭配下,網路回放層會在100.05秒時回應給你允許移動的網路消息。(因為當時在聯網環境下錄製的),所以這樣完美的搭配已經欺騙過了客戶端。

以上兩個文件需要記錄一個用戶從開始登陸就開始錄製,缺點就是不能從中途處隨時開始隨時暫停。


錄像最好的方案還是war3那個套路,錄操作,文件會非常小,缺點就是必須用客戶端才能播放


用u3d建議存儲物體每幀的postion和rotation,然後存成文件放起來,播放錄像的時候就每幀賦值。

這樣不僅圖像精度毫無損失,而且大部分情況下,更節省空間。除非你物件太多。


win10 自帶遊戲錄屏功能 win鍵+G


「點擊左側錄製按鈕,即可輕鬆記錄本局比賽」


方法很多種 最簡單的是藉助錄屏插件 assetstore里有


最近剛在研究U3D程序保存並輸出錄像文件的問題

結論是用AVPro Movie-Capture插件

[Released] AVPro Movie Capture


fraps

它錄製的視頻是無損壓縮的avi格式,質量較高,而且不丟幀,缺點是錄製的文件較大,因此如果想要縮小文件,可以使用視頻編輯軟體進行格式轉換、降低解析度等操作進行壓縮。 註:2.9以下版本不支持Vista以及DX10,2.9以上版本能完美支持Vista以及DX10。

錄製視頻:

先運行軟體,進入遊戲後按快捷鍵(默認F9)開始錄製,可以看到遊戲左上角的黃色數字變成了紅色,這就說明軟體已經開始錄了,再按下F9鍵即可停止。如果要同時錄製聲音,要勾選Record sound(錄製聲音),還可以選擇Hide mouse cursor in video(隱藏視頻文件中的滑鼠游標)。視頻默認保存在Fraps安裝目錄下的「movies」文件夾。

黃色的幀率數字是在遊戲中實時顯示的,在錄製好的視頻文件中並不會出現——這點是非常確定的,如果在播放的視頻中出現了黃色幀數,請退出Fraps再看!(FRAPS錄製視頻的時候會即時生成.avi格式文件,單個文件最大為3.95G,超過的話會自動生成第二個文件。)

注意事項:

1. 未註冊的Fraps只能錄30秒的視頻,錄夠30秒後會自動停止。(3.4.7對該項有更新,可以自行設置緩存區

大小,長按錄像快捷鍵開始錄像,再次按下時停止)

2. 遊戲運行時解析度越高,圖像越精細,當然錄出來的視頻文件也就越大,對電腦的配置要求也就越高。

3. 用Fraps錄製的視頻是無損AVI視頻文件,體積很大,幾分鐘就上1G,最好選擇一個有充足空間的磁碟,為了方便起見可以使用視頻編輯軟體進行壓縮,這樣生成的視頻文件不僅有利於編輯,也有利於發布到網上。

4. 用Fraps錄視頻時遊戲可能出現停頓現象,配置好的機子一般沒事。

5. Fraps有自己的解碼器「Fraps1」和「Fraps2」,但可以用格式工廠來壓縮,但用暴風影音可以放。(QQ影音也能放)這兩個解碼器可以在軟體官方網站找到下載。

6. 在錄製視頻界面中,有半分大小和完全大小的選擇項,兩者視頻效果相差很大。

遊戲加加

遊戲加加支持多種遊戲錄像輸出尺寸,無論是高清480P/720P/1080P或是4K高清遊戲錄像,它還可以捕捉每秒120幀的視頻,提供多種視頻預設編碼方案,滿足各類用戶需求。如果你是遊戲錄像愛好者,那麼遊戲加加一定是你的必備軟體。

錄製視頻:

下載遊戲加加,安裝後運行。選擇錄像功能,會出現以下設置菜單。在這裡您可以選擇錄製模式,是否加入麥克風聲音、輸出視頻的文件格式、尺寸大小、以及幀數、文件編碼和視頻保存路徑。將這些設置根據個人喜好選定後就可以進入下一步,開始錄製遊戲視頻了。

軟體特點:

1.如果回溯錄製前5分鐘的視頻,在30幀的情況下,文件大小為100M左右,方便上傳,電腦為16G內存配置為佳。這裡需要特別介紹一下遊戲加加強大的回溯錄像功能。當你在遊戲時是否有錯過精彩一刻忘記保存錄像呢?不用擔心,此時只要按下熱鍵,遊戲加加會幫你保存自按下錄像鍵之前的5-600秒之間的視頻錄像。需要注意的是此功能需要消耗一部分計算機內存性能。


僅僅試過 rendertexture 渲染相關相機只截圖一起看到的圖像,並指定區域,生成png圖像。


錄屏,就像這兩個字說的。是錄取屏幕上的內容,可以理解成攝像機看到的東西本來是要顯示到屏幕上,但是現在我們把它拿出來存到影片裡面了


推薦閱讀:

同樣是用 C# 做遊戲,為什麼 XNA 非常失敗,Unity 卻成功了?
請問untiy開發遊戲使用什麼架構比較合適?
Unity開發大部分都會用到插件嗎?有沒有公司直接全部用Unity原生API來開發?
是什麼沒能讓你成為一名獨立遊戲開發者?
本人想轉做U3D 如何學習U3D?

TAG:程序員 | 遊戲開發 | 編程 | Unity遊戲引擎 |