Merge branch 'develop' of gitee.com:fusenpack/fusenapi into develop
This commit is contained in:
		
						commit
						9bcb95e540
					
				@ -120,6 +120,8 @@ func (l *DataTransferLogic) DataTransfer(w http.ResponseWriter, r *http.Request)
 | 
			
		||||
	go ws.sendLoop()
 | 
			
		||||
	//操作连接中渲染任务的增加/删除
 | 
			
		||||
	go ws.operationRenderTask()
 | 
			
		||||
	//消费渲染缓冲队列
 | 
			
		||||
	go ws.renderImage()
 | 
			
		||||
	//心跳
 | 
			
		||||
	ws.heartbeat()
 | 
			
		||||
}
 | 
			
		||||
@ -135,13 +137,14 @@ func (l *DataTransferLogic) setConnPool(conn *websocket.Conn, userInfo auth.User
 | 
			
		||||
		logic:     l,
 | 
			
		||||
		uniqueId:  uniqueId,
 | 
			
		||||
		closeChan: make(chan struct{}, 1),
 | 
			
		||||
		inChan:    make(chan []byte, 1000),
 | 
			
		||||
		outChan:   make(chan []byte, 1000),
 | 
			
		||||
		inChan:    make(chan []byte, 100),
 | 
			
		||||
		outChan:   make(chan []byte, 100),
 | 
			
		||||
		userId:    userInfo.UserId,
 | 
			
		||||
		guestId:   userInfo.GuestId,
 | 
			
		||||
		renderProperty: renderProperty{
 | 
			
		||||
			renderImageTask:        make(map[string]string),
 | 
			
		||||
			renderImageTaskCtlChan: make(chan renderImageControlChanItem, 100),
 | 
			
		||||
			renderChan:             make(chan []byte, 100),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	//保存连接
 | 
			
		||||
@ -313,7 +316,7 @@ func (w *wsConnectItem) dealwithReciveData(data []byte) {
 | 
			
		||||
	switch parseInfo.T {
 | 
			
		||||
	//图片渲染
 | 
			
		||||
	case constants.WEBSOCKET_RENDER_IMAGE:
 | 
			
		||||
		w.renderImage(d)
 | 
			
		||||
		w.sendToRenderChan(d)
 | 
			
		||||
	//刷新重连请求恢复上次连接的标识
 | 
			
		||||
	case constants.WEBSOCKET_REQUEST_REUSE_LAST_CONNECT:
 | 
			
		||||
		w.reuseLastConnect(d)
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,7 @@ import (
 | 
			
		||||
type renderProperty struct {
 | 
			
		||||
	renderImageTask        map[string]string               //需要渲染的图片任务 key是taskId val 是renderId
 | 
			
		||||
	renderImageTaskCtlChan chan renderImageControlChanItem //渲染任务新增移除的控制通道
 | 
			
		||||
	renderChan             chan []byte                     //渲染的缓冲队列
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 渲染任务新增移除的控制通道的数据
 | 
			
		||||
@ -28,13 +29,38 @@ type renderImageControlChanItem struct {
 | 
			
		||||
	RenderId string // map的val
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 发送到渲染缓冲池
 | 
			
		||||
func (w *wsConnectItem) sendToRenderChan(data []byte) {
 | 
			
		||||
	select {
 | 
			
		||||
	case <-w.closeChan: //已经关闭
 | 
			
		||||
		return
 | 
			
		||||
	case w.renderProperty.renderChan <- data:
 | 
			
		||||
		return
 | 
			
		||||
	case <-time.After(time.Second * 3):
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 渲染发送到组装数据组装数据
 | 
			
		||||
func (w *wsConnectItem) renderImage(data []byte) {
 | 
			
		||||
func (w *wsConnectItem) renderImage() {
 | 
			
		||||
	defer func() {
 | 
			
		||||
		if err := recover(); err != nil {
 | 
			
		||||
			logx.Error("renderImage panic:", err)
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	for {
 | 
			
		||||
		select {
 | 
			
		||||
		case <-w.closeChan: //已关闭
 | 
			
		||||
			return
 | 
			
		||||
		case data := <-w.renderProperty.renderChan:
 | 
			
		||||
			w.consumeRenderCache(data)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 消费渲染缓冲数据
 | 
			
		||||
func (w *wsConnectItem) consumeRenderCache(data []byte) {
 | 
			
		||||
	var renderImageData websocket_data.RenderImageReqMsg
 | 
			
		||||
	if err := json.Unmarshal(data, &renderImageData); err != nil {
 | 
			
		||||
		w.sendToOutChan(w.respondDataFormat(constants.WEBSOCKET_ERR_DATA_FORMAT, "invalid format of websocket render image message:"+string(data)))
 | 
			
		||||
@ -84,8 +110,11 @@ func (w *wsConnectItem) renderImage(data []byte) {
 | 
			
		||||
	renderImageData.RenderData.UserId = w.userId
 | 
			
		||||
	renderImageData.RenderData.GuestId = w.guestId
 | 
			
		||||
 | 
			
		||||
	//生成任务id
 | 
			
		||||
	taskId := hash.JsonHashKey(renderImageData.RenderData)
 | 
			
		||||
	//生成任务id(需要把user_id,guest_id设为0)
 | 
			
		||||
	hashVal := renderImageData.RenderData
 | 
			
		||||
	hashVal.UserId = 0
 | 
			
		||||
	hashVal.GuestId = 0
 | 
			
		||||
	taskId := hash.JsonHashKey(hashVal)
 | 
			
		||||
	//查询有没有缓存的资源,有就返回######################
 | 
			
		||||
	resource, err := w.logic.svcCtx.AllModels.FsResource.FindOneById(w.logic.ctx, taskId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@ -111,11 +140,14 @@ func (w *wsConnectItem) renderImage(data []byte) {
 | 
			
		||||
		RenderId: renderImageData.RenderId,
 | 
			
		||||
	}
 | 
			
		||||
	//组装数据
 | 
			
		||||
	go w.assembleRenderData(taskId, renderImageData)
 | 
			
		||||
	if err = w.assembleRenderData(taskId, renderImageData); err != nil {
 | 
			
		||||
		logx.Error("组装数据失败:", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 组装数据发送给unity
 | 
			
		||||
func (w *wsConnectItem) assembleRenderData(taskId string, info websocket_data.RenderImageReqMsg) {
 | 
			
		||||
func (w *wsConnectItem) assembleRenderData(taskId string, info websocket_data.RenderImageReqMsg) error {
 | 
			
		||||
	defer func() {
 | 
			
		||||
		if err := recover(); err != nil {
 | 
			
		||||
			logx.Error("assembleRenderData panic:", err)
 | 
			
		||||
@ -126,10 +158,10 @@ func (w *wsConnectItem) assembleRenderData(taskId string, info websocket_data.Re
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
			
		||||
			logx.Error("template info is not found")
 | 
			
		||||
			return
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		logx.Error("failed to get template info:", err)
 | 
			
		||||
		return
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	//获取刀版图
 | 
			
		||||
	res, err := w.logic.svcCtx.Repositories.ImageHandle.LogoCombine(w.logic.ctx, &repositories.LogoCombineReq{
 | 
			
		||||
@ -144,14 +176,14 @@ func (w *wsConnectItem) assembleRenderData(taskId string, info websocket_data.Re
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logx.Error("合成刀版图失败:", err)
 | 
			
		||||
		return
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	combineImage := "" //刀版图
 | 
			
		||||
	if res != nil && res.ResourceUrl != nil {
 | 
			
		||||
		combineImage = *res.ResourceUrl
 | 
			
		||||
	} else {
 | 
			
		||||
		logx.Error("合成刀版图失败,合成的刀版图是空指针:", err)
 | 
			
		||||
		return
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	logx.Info("合成刀版图成功:", *res.ResourceUrl)
 | 
			
		||||
	//获取渲染设置信息
 | 
			
		||||
@ -159,10 +191,10 @@ func (w *wsConnectItem) assembleRenderData(taskId string, info websocket_data.Re
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
			
		||||
			logx.Error("element info is not found,model_id = ?", *productTemplate.ModelId)
 | 
			
		||||
			return
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		logx.Error("failed to get element list,", err)
 | 
			
		||||
		return
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	//组装数据
 | 
			
		||||
	refletion := -1
 | 
			
		||||
@ -174,7 +206,7 @@ func (w *wsConnectItem) assembleRenderData(taskId string, info websocket_data.Re
 | 
			
		||||
	if element.Mode != nil && *element.Mode != "" {
 | 
			
		||||
		if err = json.Unmarshal([]byte(*element.Mode), &mode); err != nil {
 | 
			
		||||
			logx.Error("faile to parse element mode json:", err)
 | 
			
		||||
			return
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	tempData := make([]map[string]interface{}, 0, 3)
 | 
			
		||||
@ -247,9 +279,10 @@ func (w *wsConnectItem) assembleRenderData(taskId string, info websocket_data.Re
 | 
			
		||||
	_, err = curl.ApiCall(url, "POST", header, bytes.NewReader(p), time.Second*10)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logx.Error("failed to send data to unity")
 | 
			
		||||
		return
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	logx.Info("发送到unity成功################")
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 操作连接中渲染任务的增加/删除
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user