前言
像素流由于采用后台渲染,所以资源是非常紧缺的,当用户需要访问某一路资源的时候,如果gpu实例用完了,就只能等其他用户退出才行。这里inveta团队针对大家提供的痛点需求,在peerstream中更新了剔除当前正在使用的用户,释放访问资源。
需求
在某些紧急场景,需要能够释放gpu实例给优先级更高的用户。由于peerstream有重连的功能,所以在剔除之后,还不能触发自动重连,允许用户手动刷新的时候进行再次连接。
实现方式
在最新的GUI界面中开发了剔除用户界面,可以剔除当前正在访问的用户,并且还不会进行重连。之后就可以释放资源给其他用户访问。
实现逻辑
增加一个剔除接口,可以发送playerDisconnected给UE,从而让UE自动释放这一路的webrtc连接。另外web和signal的连接不能断开,因为如果断开连接就会触发3秒的断线重连机制,从而导致还会进行资源的抢占。
global.killPlayer = async function (playerId) {
const fe = [...PLAYER.clients].find(a => a.req.socket.remotePort === playerId)
if (!fe) throw 'peer-stream not found!'
fe.ue.send(
JSON.stringify({
type: "playerDisconnected",
playerId,
})
)
fe.ue.fe.delete(fe);
fe.ue = null;
fe.killPlayer = true
// 当用户连接数大于ue实例的时候,有用户退出意味着可以,认领空闲的前端们
for (const fe of PLAYER.clients) {
if(fe.killPlayer)
{
continue
}
if (!fe.ue) {
PLAYER.emit("connection", fe, fe.req);
}
}
print();
}
此外,我们给这个websocket连接增加了一个killPlayer字段,这个字段主要是告诉当前的连接是被剔除的,后续不能再使用。之后在所有匹配UE的地方 都需要比匹配这一路连接,主要是在UE的websocket连接的地方和前端资源释放重新连接的地方。如下图
![43a63953affd77804ea994be094bdc5d.png](https://i-blog.csdnimg.cn/blog_migrate/52519ad1fb2be4cc2d13431bb8778ecf.png)
![169c8aeb69d7cc7f344dccf2acc00d4f.png](https://i-blog.csdnimg.cn/blog_migrate/0ab6892f3eb3130a14d272688a0001f7.png)
总结
通过这次更新,我们可以更加精准的分配资源,让云渲染可以更好的被大家使用。
Inveta团队
Inveta团队由研发、美术设计、建模等组成。团队介绍:
https://www.inveta.cn/about.html
团队开源项目:
https://github.com/inveta
团队推出了UE像素流的技术支持服务,帮助大家更好的管理UE的像素流。