业务需求:
两个屏幕,一个大屏用于展示360全景,一个小屏用于操控大屏的显示,大屏的界面比较清爽;小屏可以操控大屏旋转以及热点展示。
思路:
1.网络同步,两端做同步即可 【问题:两端分辨率不同,展示画面需要自行控制】
2.做大屏对小屏的画面同步,和小屏对大屏的操作同步。【问题:小屏拿到的是画面,热点操作需要自行添加】
最后使用思路2
QA:
问题:大小屏的分辨率不同,展示画面可能有差异,热点显示也会有差异。
问题:大屏上有热点,但大屏不能操作,需要在小屏上操作
解决:大屏做一个判断,将界面上的热点数据传给小屏,小屏另行显示。 【也解决了大小屏热点位置差异】
解决:如果需要小屏热点和大屏显示一致,则需要热点信息,以及重新计算热点在小屏位置,并添加点击事件.
问题: 传输的数据有点大,好几M一次(待解决)
具体实现:
1.画面传输:
获取相机渲染的画面
Texture2D screenTexture;
RenderTexture tempTexture;
void GetCameraTexture()
{
tempTexture = new RenderTexture(Screen.width, Screen.height, 24);//创建屏幕大小的RT
_Camera.targetTexture = tempTexture;//将相机画面渲染到RT
_Camera.Render();
screenTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);//创建2d纹理
RenderTexture.active = tempTexture;//将RT设置为当前RT
//读取屏幕像素信息
screenTexture.ReadPixels(new Rect(0, 0, screenTexture.width, screenTexture.height), 0, 0);
screenTexture.Apply();//保存纹理
RenderTexture.active = null;//还原
ss.texture = screenTexture;
}
画面纹理转换成字节流
bytes = screenTexture.EncodeToJPG();
Socket.send(bytes)发送图片字节流
2.画面接收:
将画面的字节流重新转为2d纹理
Texture2D texture2D = new Texture2D(1920,1080, TextureFormat.RGB24, false);
texture2D.LoadImage(buffer);
rawImage.texture = texture2D;
离了个大谱
画面传输个屁,大屏分辨率5400*1920,这去调用ReadPixels()不是自己给自己找不自在,一个画面几十M,卡死了。
改成多端同步做了,操作端和显示端一样的,传输操作数据。
参考直播传输:
首先不用cpu,用更快的gpu处理视频
对视频进行重新编码降低传输压力
传输协议