繼上次筆記使用dll傳輸畫面資料不知為甚麼無法正確顯示,這次成功改用電腦內部socket來溝通!
使用UDP
基本的傳輸協定,因為不會檢查是否收到或重傳等資訊,因此封包小、速度較快,缺點是長度上限548 Bytes,不適合串流影片,在此只用來傳輸事件資訊。 好處是就算Unity那端的port沒有開啟,UPD因不會檢查是否收到,所以不會報錯。
成果(發布時放錯影片XD):Python 傳送資料C# UPD 建立連線使用thread在背景持續接收資訊。C# 定義接受方法尋找輪廓的原理先略過,主要流程是轉灰階=>高思模糊=>Canny邊緣偵測=>向外擴張=>findContours(尋找輪廓)
以下是C++:
使用TCP
需經過三項交握確認連線。若server(這裡是unity)的port沒有開,會收到傳送失敗的exception。範例 (偵測到完成深蹲後操控遊戲角色跳躍):Python 建立連線C# 建立連線定義接收方法:
我查到好幾個接收方式,好幾個都是預先定義好buffer空間,這邊是不使用buffer的作法。
注意1,由於一開始需要經過三項交握,所以"TCP Initialized"之後會log一次"received something...",該訊息為用來回應tcp連線的。注意2,在python端sock.close()之前收到的訊息會一直存在sr,直到close之後才一次print出,所以傳輸每frame都會經過:建立連線=>打包資料=>傳送=>close() 的循環。傳輸畫面
python端:注意資料只能傳byte,string等型態,所以這邊使用json格式。Python有另一個類次的pickel插件,但該格式只能python使用,不方便給unity。
C#端:宣告texture:
由於Unity不支援多線程,無法在接收方法中直接設定texture,所以在fixedUpdate中設定。
成功XD~
操控物件也同理,在json資料中夾帶著操作的訊號就好。 但由於是跟著畫面資料一起串流,會有滿嚴重的延遲(?。 不太確定若資料改用UDP、畫面使用TCP傳輸會不會比較好。 hmmm~