2023-07-26 06:35:29 +00:00
package logic
2023-08-23 07:08:45 +00:00
//处理websocket云渲染任务数据
2023-07-26 06:35:29 +00:00
import (
2023-08-16 04:33:01 +00:00
"bytes"
2023-07-26 06:35:29 +00:00
"encoding/json"
2023-08-09 08:06:40 +00:00
"errors"
2023-08-21 08:19:30 +00:00
"fmt"
2023-07-27 09:33:50 +00:00
"fusenapi/constants"
2023-08-24 10:02:00 +00:00
"fusenapi/model/gmodel"
2023-08-16 04:16:23 +00:00
"fusenapi/service/repositories"
2023-08-16 04:33:01 +00:00
"fusenapi/utils/curl"
2023-08-07 02:48:14 +00:00
"fusenapi/utils/hash"
2023-08-24 06:24:04 +00:00
"fusenapi/utils/websocket_data"
2023-07-26 06:35:29 +00:00
"github.com/zeromicro/go-zero/core/logx"
2023-08-09 08:06:40 +00:00
"gorm.io/gorm"
2023-08-16 04:16:23 +00:00
"strconv"
2023-08-16 04:33:01 +00:00
"time"
2023-07-26 06:35:29 +00:00
)
2023-07-26 09:06:53 +00:00
// 云渲染属性
2023-08-24 04:04:58 +00:00
type extendRenderProperty struct {
2023-08-21 08:19:30 +00:00
renderImageTask map [ string ] * renderTask //需要渲染的图片任务 key是taskId val 是renderId
2023-08-23 04:29:02 +00:00
renderImageTaskCtlChan chan renderImageControlChanItem //渲染任务新增/回调结果移除任务/更新渲染耗时属性的控制通道( 由于任务map无法读写并发)
renderChan chan [ ] byte //渲染消息入口的缓冲队列
2023-08-21 08:19:30 +00:00
}
2023-07-26 09:06:53 +00:00
// 渲染任务新增移除的控制通道的数据
type renderImageControlChanItem struct {
2023-08-21 08:19:30 +00:00
Option int // 0删除 1添加
TaskId string //map的key
RenderId string // map的val(增加任务时候传)
RenderNotifyImageUrl string //渲染回调数据(删除任务时候传)
TaskProperty renderTask //渲染任务的属性
2023-07-27 09:41:36 +00:00
}
2023-08-23 04:29:02 +00:00
// 渲染任务属性
type renderTask struct {
2023-08-25 03:06:32 +00:00
RenderId string //渲染id(前端传的)
CombineTakesTime int64 //合刀版图耗时
UploadCombineImageTakesTime int64 //上传刀版图耗时
UnityRenderBeginTime int64 //发送给unity时间
UnityRenderEndTime int64 //unity回调结果时间
UploadUnityRenderImageTakesTime int64 //上传unity渲染结果图时间
2023-08-23 04:29:02 +00:00
}
2023-08-16 08:20:16 +00:00
// 发送到渲染缓冲池
func ( w * wsConnectItem ) sendToRenderChan ( data [ ] byte ) {
select {
case <- w . closeChan : //已经关闭
return
2023-08-24 04:04:58 +00:00
case w . extendRenderProperty . renderChan <- data : //发入到缓冲池
2023-08-16 08:20:16 +00:00
return
2023-08-21 03:25:56 +00:00
case <- time . After ( time . Second * 3 ) : //三秒没进入缓冲池就丢弃
2023-08-16 08:20:16 +00:00
return
}
}
2023-08-21 02:53:21 +00:00
// 渲染发送到组装数据组装数据(缓冲池)
2023-08-16 08:20:16 +00:00
func ( w * wsConnectItem ) renderImage ( ) {
for {
select {
case <- w . closeChan : //已关闭
return
2023-08-24 04:04:58 +00:00
case data := <- w . extendRenderProperty . renderChan :
2023-08-16 08:20:16 +00:00
w . consumeRenderCache ( data )
}
}
}
// 消费渲染缓冲数据
func ( w * wsConnectItem ) consumeRenderCache ( data [ ] byte ) {
2023-08-16 09:04:45 +00:00
logx . Info ( "消费渲染数据:" , string ( data ) )
2023-08-24 06:24:04 +00:00
var renderImageData websocket_data . RenderImageReqMsg
2023-07-27 09:41:36 +00:00
if err := json . Unmarshal ( data , & renderImageData ) ; err != nil {
2023-08-24 09:23:41 +00:00
w . incomeDataFormatErrResponse ( "invalid format of render data:" + string ( data ) )
2023-07-27 09:41:36 +00:00
logx . Error ( "invalid format of websocket render image message" , err )
return
}
2023-08-09 10:09:16 +00:00
//获取上传最近的logo
2023-08-16 06:09:03 +00:00
userMaterial , err := w . logic . svcCtx . AllModels . FsUserMaterial . FindLatestOne ( w . logic . ctx , w . userId , w . guestId )
2023-08-09 10:09:16 +00:00
if err != nil {
if ! errors . Is ( err , gorm . ErrRecordNotFound ) {
2023-08-24 09:23:41 +00:00
w . renderErrResponse ( renderImageData . RenderId , renderImageData . RenderData . TemplateTag , "" , "failed to get user logo" , w . userId , w . guestId , 0 , 0 , 0 )
2023-08-09 10:09:16 +00:00
logx . Error ( "failed to get user logo" )
return
}
2023-08-15 07:09:53 +00:00
//使用默认logo(id=0)
2023-08-16 06:09:03 +00:00
userMaterialDefault , err := w . logic . svcCtx . AllModels . FsUserMaterial . FindOneById ( w . logic . ctx , 0 )
2023-08-15 07:09:53 +00:00
if err != nil {
if errors . Is ( err , gorm . ErrRecordNotFound ) {
2023-08-24 09:23:41 +00:00
w . renderErrResponse ( renderImageData . RenderId , renderImageData . RenderData . TemplateTag , "" , "default logo is not exists" , w . userId , w . guestId , 0 , 0 , 0 )
2023-08-15 07:09:53 +00:00
return
}
2023-08-24 09:23:41 +00:00
w . renderErrResponse ( renderImageData . RenderId , renderImageData . RenderData . TemplateTag , "" , "failed to get default logo" , w . userId , w . guestId , 0 , 0 , 0 )
2023-08-23 03:24:33 +00:00
logx . Error ( "default logo is not exists" )
2023-08-15 07:09:53 +00:00
return
}
renderImageData . RenderData . Logo = * userMaterialDefault . ResourceUrl
2023-08-09 10:09:16 +00:00
} else {
renderImageData . RenderData . Logo = * userMaterial . ResourceUrl
}
2023-08-09 04:28:06 +00:00
//用户id赋值
2023-08-08 04:22:15 +00:00
renderImageData . RenderData . UserId = w . userId
2023-08-09 04:28:06 +00:00
renderImageData . RenderData . GuestId = w . guestId
2023-08-24 10:02:00 +00:00
//获取产品第一个尺寸
productFirstSize , err := w . logic . svcCtx . AllModels . FsProductSize . GetProductFirstSize ( w . logic . ctx , renderImageData . RenderData . ProductId )
if err != nil {
if errors . Is ( err , gorm . ErrRecordNotFound ) {
w . renderErrResponse ( renderImageData . RenderId , renderImageData . RenderData . TemplateTag , "" , "product first size is not exists" , w . userId , w . guestId , 0 , 0 , 0 )
logx . Error ( "product first size is not found" )
return
}
w . renderErrResponse ( renderImageData . RenderId , renderImageData . RenderData . TemplateTag , "" , "failed to get product first size" , w . userId , w . guestId , 0 , 0 , 0 )
logx . Error ( "failed to get product first size:" , err )
return
}
//获取模型(只是获取id)
model3dInfo , err := w . logic . svcCtx . AllModels . FsProductModel3d . GetOneBySizeIdTag ( w . logic . ctx , productFirstSize . Id , constants . TAG_MODEL , "id" )
if err != nil {
if errors . Is ( err , gorm . ErrRecordNotFound ) {
w . renderErrResponse ( renderImageData . RenderId , renderImageData . RenderData . TemplateTag , "" , "product model is not exists" , w . userId , w . guestId , 0 , 0 , productFirstSize . Id )
logx . Error ( "product model is not found" )
return
}
w . renderErrResponse ( renderImageData . RenderId , renderImageData . RenderData . TemplateTag , "" , "failed to get product model" , w . userId , w . guestId , 0 , 0 , productFirstSize . Id )
logx . Error ( "failed to get product model:" , err )
return
}
//获取模板
productTemplate , err := w . logic . svcCtx . AllModels . FsProductTemplateV2 . FindFirstOneByProductIdModelIdTemplateTag ( w . logic . ctx , renderImageData . RenderData . ProductId , model3dInfo . Id , renderImageData . RenderData . TemplateTag )
if err != nil {
if errors . Is ( err , gorm . ErrRecordNotFound ) {
w . renderErrResponse ( renderImageData . RenderId , renderImageData . RenderData . TemplateTag , "" , "product template is not exists" , w . userId , w . guestId , 0 , model3dInfo . Id , productFirstSize . Id )
logx . Error ( "template info is not found" )
return
}
w . renderErrResponse ( renderImageData . RenderId , renderImageData . RenderData . TemplateTag , "" , "failed to get product template" , w . userId , w . guestId , 0 , model3dInfo . Id , productFirstSize . Id )
logx . Error ( "failed to get template info:" , err )
return
}
//获取渲染设置信息
element , err := w . logic . svcCtx . AllModels . FsProductTemplateElement . FindOneByModelId ( w . logic . ctx , * productTemplate . ModelId )
if err != nil {
if errors . Is ( err , gorm . ErrRecordNotFound ) {
w . renderErrResponse ( renderImageData . RenderId , renderImageData . RenderData . TemplateTag , "" , "render element is not exists" , w . userId , w . guestId , productTemplate . Id , model3dInfo . Id , productFirstSize . Id )
logx . Error ( "element info is not found,model_id = " , * productTemplate . ModelId )
return
}
w . renderErrResponse ( renderImageData . RenderId , renderImageData . RenderData . TemplateTag , "" , "failed to get render element" , w . userId , w . guestId , productTemplate . Id , model3dInfo . Id , productFirstSize . Id )
logx . Error ( "failed to get element list," , err )
return
}
//获取唯一id
taskId := w . genRenderTaskId ( renderImageData , model3dInfo , productTemplate , element )
2023-08-09 08:06:40 +00:00
//查询有没有缓存的资源,有就返回######################
2023-08-16 06:09:03 +00:00
resource , err := w . logic . svcCtx . AllModels . FsResource . FindOneById ( w . logic . ctx , taskId )
2023-08-09 08:06:40 +00:00
if err != nil {
if ! errors . Is ( err , gorm . ErrRecordNotFound ) {
2023-08-24 09:23:41 +00:00
w . renderErrResponse ( renderImageData . RenderId , renderImageData . RenderData . TemplateTag , taskId , "failed to get render cache" , w . userId , w . guestId , 0 , 0 , 0 )
2023-08-09 08:06:40 +00:00
logx . Error ( "failed to find render resource:" , err )
return
}
} else {
//返回给客户端
2023-08-24 06:24:04 +00:00
b := w . respondDataFormat ( constants . WEBSOCKET_RENDER_IMAGE , websocket_data . RenderImageRspMsg {
2023-08-25 04:02:07 +00:00
RenderId : renderImageData . RenderId ,
Image : * resource . ResourceUrl ,
RenderProcessTime : websocket_data . RenderProcessTime {
CombineTakesTime : "cache" ,
UnityRenderTakesTime : "cache" ,
UploadCombineImageTakesTime : "cache" ,
UploadUnityRenderImageTakesTime : "cache" ,
} ,
2023-08-09 08:06:40 +00:00
} )
//发送数据到out chan
w . sendToOutChan ( b )
return
}
//###########################################
//把需要渲染的图片任务加进去
2023-08-21 05:19:12 +00:00
w . createRenderTask ( renderImageControlChanItem {
2023-08-23 10:18:44 +00:00
Option : 1 , //0删除 1添加 2修改耗时属性
2023-08-07 03:15:51 +00:00
TaskId : taskId ,
RenderId : renderImageData . RenderId ,
2023-08-21 05:19:12 +00:00
} )
2023-08-16 04:16:23 +00:00
//组装数据
2023-08-24 10:02:00 +00:00
if err = w . assembleRenderData ( taskId , renderImageData , productTemplate , model3dInfo , element , productFirstSize ) ; err != nil {
2023-08-16 08:20:16 +00:00
logx . Error ( "组装数据失败:" , err )
2023-08-07 02:48:14 +00:00
return
}
2023-08-16 04:16:23 +00:00
}
2023-08-24 10:02:00 +00:00
// 组装渲染任务id
func ( w * wsConnectItem ) genRenderTaskId ( renderImageData websocket_data . RenderImageReqMsg , model3dInfo * gmodel . FsProductModel3d , productTemplate * gmodel . FsProductTemplateV2 , element * gmodel . FsProductTemplateElement ) string {
//生成任务id(需要把user_id,guest_id设为0)
incomeHashParam := renderImageData . RenderData
incomeHashParam . UserId = 0 //设为0(渲染跟用户id无关)
incomeHashParam . GuestId = 0 //设为0(渲染跟用户id无关)
incomeHashBytes , _ := json . Marshal ( incomeHashParam )
modelHashStr := ""
templateHashStr := ""
if model3dInfo . ModelInfo != nil {
modelHashStr = * model3dInfo . ModelInfo
2023-08-22 09:12:30 +00:00
}
2023-08-24 10:02:00 +00:00
if productTemplate . TemplateInfo != nil {
templateHashStr = * productTemplate . TemplateInfo
2023-08-22 09:12:30 +00:00
}
2023-08-24 10:02:00 +00:00
elementHashBytes , _ := json . Marshal ( element )
hashMap := map [ string ] interface { } {
"income_param" : incomeHashBytes ,
"model_info" : modelHashStr ,
"template_info" : templateHashStr ,
"render_element" : elementHashBytes ,
2023-08-16 04:16:23 +00:00
}
2023-08-24 10:02:00 +00:00
return hash . JsonHashKey ( hashMap )
}
// 组装数据发送给unity
func ( w * wsConnectItem ) assembleRenderData ( taskId string , info websocket_data . RenderImageReqMsg , productTemplate * gmodel . FsProductTemplateV2 , model3dInfo * gmodel . FsProductModel3d , element * gmodel . FsProductTemplateElement , productFirstSize * gmodel . FsProductSize ) error {
2023-08-16 04:16:23 +00:00
//获取刀版图
2023-08-18 09:08:56 +00:00
combineReq := repositories . LogoCombineReq {
2023-08-16 04:16:23 +00:00
UserId : info . RenderData . UserId ,
GuestId : info . RenderData . GuestId ,
TemplateId : productTemplate . Id ,
TemplateTag : info . RenderData . TemplateTag ,
Website : info . RenderData . Website ,
Slogan : info . RenderData . Slogan ,
Address : info . RenderData . Address ,
Phone : info . RenderData . Phone ,
2023-08-18 09:08:56 +00:00
}
res , err := w . logic . svcCtx . Repositories . ImageHandle . LogoCombine ( w . logic . ctx , & combineReq )
2023-08-16 04:16:23 +00:00
if err != nil {
2023-08-25 03:50:49 +00:00
w . renderErrResponse ( info . RenderId , info . RenderData . TemplateTag , taskId , "failed to combine image:" + err . Error ( ) , w . userId , w . guestId , productTemplate . Id , model3dInfo . Id , productFirstSize . Id )
2023-08-21 10:10:23 +00:00
logx . Error ( "合成刀版图失败,合成请求数据:" , combineReq , "错误信息:" , err )
2023-08-16 08:20:16 +00:00
return err
2023-08-16 04:16:23 +00:00
}
combineImage := "" //刀版图
if res != nil && res . ResourceUrl != nil {
combineImage = * res . ResourceUrl
} else {
2023-08-24 09:23:41 +00:00
w . renderErrResponse ( info . RenderId , info . RenderData . TemplateTag , taskId , "combine image is empty" , w . userId , w . guestId , productTemplate . Id , model3dInfo . Id , productFirstSize . Id )
2023-08-16 04:16:23 +00:00
logx . Error ( "合成刀版图失败,合成的刀版图是空指针:" , err )
2023-08-16 08:20:16 +00:00
return err
2023-08-07 03:15:51 +00:00
}
2023-08-25 03:06:32 +00:00
//记录刀版图合成消耗时间跟上传刀版图时间
2023-08-21 08:19:30 +00:00
w . modifyRenderTaskTimeConsuming ( renderImageControlChanItem {
Option : 2 ,
2023-08-22 02:36:38 +00:00
TaskId : taskId ,
2023-08-21 08:19:30 +00:00
TaskProperty : renderTask {
2023-08-25 03:06:32 +00:00
CombineTakesTime : res . DiffTimeLogoCombine ,
UploadCombineImageTakesTime : res . DiffTimeUploadFile ,
2023-08-21 08:19:30 +00:00
} ,
} )
2023-08-21 01:57:57 +00:00
logx . Info ( "合成刀版图成功,合成刀版图数据:" , combineReq , ",logo图片:" , info . RenderData . Logo , " 刀版图:" , * res . ResourceUrl )
2023-08-16 04:16:23 +00:00
//组装数据
refletion := - 1
if element . Refletion != nil && * element . Refletion != "" {
refletion , err = strconv . Atoi ( * element . Refletion )
2023-08-17 06:48:27 +00:00
if err != nil {
logx . Error ( "err refletion:set default -1" )
2023-08-24 09:23:41 +00:00
w . renderErrResponse ( info . RenderId , info . RenderData . TemplateTag , taskId , "parse element.Refletion from string to number err" , w . userId , w . guestId , productTemplate . Id , model3dInfo . Id , productFirstSize . Id )
return err
2023-08-17 06:48:27 +00:00
}
2023-08-16 04:16:23 +00:00
}
//组装data数据
var mode map [ string ] interface { }
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 )
2023-08-24 09:23:41 +00:00
w . renderErrResponse ( info . RenderId , info . RenderData . TemplateTag , taskId , "parse element.Mode err" , w . userId , w . guestId , productTemplate . Id , model3dInfo . Id , productFirstSize . Id )
2023-08-16 08:20:16 +00:00
return err
2023-08-16 04:16:23 +00:00
}
}
tempData := make ( [ ] map [ string ] interface { } , 0 , 3 )
if element . Base != nil && * element . Base != "" {
tempData = append ( tempData , map [ string ] interface { } {
"name" : "model" ,
"data" : "0," + combineImage + "," + * element . Base ,
"type" : "other" ,
"layer" : "0" ,
"is_update" : 1 ,
"mode" : mode [ "model" ] ,
} )
}
if element . Shadow != nil && * element . Shadow != "" {
tempData = append ( tempData , map [ string ] interface { } {
"name" : "shadow" ,
"data" : * element . Shadow ,
"type" : "other" ,
"layer" : "0" ,
"is_update" : 0 ,
"mode" : mode [ "shadow" ] ,
} )
}
if element . ModelP != nil && * element . ModelP != "" {
tempData = append ( tempData , map [ string ] interface { } {
"name" : "model_P" ,
"data" : "0," + * element . ModelP ,
"type" : "other" ,
"layer" : "0" ,
"is_update" : 0 ,
"mode" : mode [ "model_P" ] ,
} )
}
result := [ ] interface { } {
map [ string ] interface { } {
"light" : * element . Light ,
"refletion" : refletion ,
"scale" : * element . Scale ,
"sku_id" : info . RenderData . ProductId ,
"tid" : * element . Title ,
"rotation" : * element . Rotation ,
"filePath" : "" , //todo 文件路径,针对千人千面
"data" : tempData ,
} ,
}
sendData := map [ string ] interface { } {
"id" : taskId ,
"order_id" : 0 ,
"user_id" : info . RenderData . UserId ,
"guest_id" : info . RenderData . GuestId ,
"sku_ids" : [ ] int64 { info . RenderData . ProductId } ,
"tids" : [ ] string { * element . Title } ,
"data" : result ,
"is_thousand_face" : 0 ,
"folder" : "" , //todo 千人千面需要使用
}
2023-08-16 06:09:03 +00:00
//请求unity接口
2023-08-17 08:07:27 +00:00
url := w . logic . svcCtx . Config . Unity . Host + "/api/render/queue/push"
2023-08-16 04:33:01 +00:00
header := make ( map [ string ] string )
header [ "content-type" ] = "application/json"
postData := map [ string ] interface { } {
"group" : "unity3d" ,
"source" : "home page" ,
"priority" : 1 ,
2023-08-25 03:06:32 +00:00
"create_at" : time . Now ( ) . UTC ( ) ,
2023-08-16 04:33:01 +00:00
"render_data" : sendData ,
}
2023-08-21 06:46:39 +00:00
postDataBytes , _ := json . Marshal ( postData )
2023-08-25 03:06:32 +00:00
unityRenderBeginTime := time . Now ( ) . UTC ( ) . UnixMilli ( )
2023-08-21 06:46:39 +00:00
_ , err = curl . ApiCall ( url , "POST" , header , bytes . NewReader ( postDataBytes ) , time . Second * 10 )
2023-08-16 04:33:01 +00:00
if err != nil {
2023-08-24 09:23:41 +00:00
w . renderErrResponse ( info . RenderId , info . RenderData . TemplateTag , taskId , "request unity api err" , w . userId , w . guestId , productTemplate . Id , model3dInfo . Id , productFirstSize . Id )
2023-08-16 04:33:01 +00:00
logx . Error ( "failed to send data to unity" )
2023-08-16 08:20:16 +00:00
return err
2023-08-16 04:33:01 +00:00
}
2023-08-21 08:19:30 +00:00
//记录发送到unity时间
w . modifyRenderTaskTimeConsuming ( renderImageControlChanItem {
Option : 2 ,
2023-08-22 02:36:38 +00:00
TaskId : taskId ,
2023-08-21 08:19:30 +00:00
TaskProperty : renderTask {
2023-08-25 03:06:32 +00:00
UnityRenderBeginTime : unityRenderBeginTime ,
2023-08-21 08:19:30 +00:00
} ,
} )
2023-08-21 06:46:39 +00:00
logx . Info ( "发送到unity成功,刀版图:" , combineImage , " 请求unity的数据:" , string ( postDataBytes ) )
2023-08-16 08:20:16 +00:00
return nil
2023-08-07 02:48:14 +00:00
}
2023-08-21 05:19:12 +00:00
// 增加渲染任务
func ( w * wsConnectItem ) createRenderTask ( data renderImageControlChanItem ) {
//强制设为增加
data . Option = 1
select {
case <- w . closeChan : //关闭
return
2023-08-24 04:04:58 +00:00
case w . extendRenderProperty . renderImageTaskCtlChan <- data :
2023-08-21 05:19:12 +00:00
return
case <- time . After ( time . Second * 3 ) :
return
}
}
// 渲染回调处理并删除渲染任务
func ( w * wsConnectItem ) deleteRenderTask ( data renderImageControlChanItem ) {
//强制设为删除
data . Option = 0
select {
case <- w . closeChan : //关闭
return
2023-08-24 04:04:58 +00:00
case w . extendRenderProperty . renderImageTaskCtlChan <- data :
2023-08-21 05:19:12 +00:00
return
case <- time . After ( time . Second * 3 ) :
return
}
}
2023-08-21 08:19:30 +00:00
// 修改耗时属性(只有耗时属性可以更新)
func ( w * wsConnectItem ) modifyRenderTaskTimeConsuming ( data renderImageControlChanItem ) {
2023-08-22 10:22:27 +00:00
if data . TaskId == "" {
logx . Error ( "设置耗时属性需要的task_id不能为空" )
return
}
2023-08-21 08:19:30 +00:00
//强制设为修改耗时属性
data . Option = 2
select {
case <- w . closeChan : //关闭
return
2023-08-24 04:04:58 +00:00
case w . extendRenderProperty . renderImageTaskCtlChan <- data :
2023-08-21 08:19:30 +00:00
return
case <- time . After ( time . Second * 3 ) :
return
}
}
2023-08-22 10:24:24 +00:00
// 处理渲染任务的增加/删除/修改耗时属性( 任务map不能读写并发, 所以放在chan里面串行执行)
2023-08-07 02:48:14 +00:00
func ( w * wsConnectItem ) operationRenderTask ( ) {
2023-08-22 10:37:49 +00:00
defer func ( ) {
if err := recover ( ) ; err != nil {
logx . Error ( "operation render task panic:" , err )
}
} ( )
2023-08-07 02:48:14 +00:00
for {
2023-07-27 07:46:07 +00:00
select {
2023-08-07 02:48:14 +00:00
case <- w . closeChan :
2023-07-27 07:46:07 +00:00
return
2023-08-24 04:04:58 +00:00
case data := <- w . extendRenderProperty . renderImageTaskCtlChan :
2023-08-07 02:48:14 +00:00
switch data . Option {
2023-08-21 05:19:12 +00:00
case 0 : //渲染结果回调,删除任务
//存在任务,则发送渲染结果给前端
2023-08-24 04:04:58 +00:00
if taskData , ok := w . extendRenderProperty . renderImageTask [ data . TaskId ] ; ok {
2023-08-25 03:06:32 +00:00
CombineTakesTime := "0ms"
UnityRenderTakesTime := "0ms"
uploadCombineImageTakesTime := "0ms"
uploadUnityRenderImageTakesTime := "0ms"
//合图时间
if taskData . CombineTakesTime > 0 {
CombineTakesTime = fmt . Sprintf ( "%dms" , taskData . CombineTakesTime )
}
//上传刀版图时间
if taskData . UploadCombineImageTakesTime > 0 {
uploadCombineImageTakesTime = fmt . Sprintf ( "%dms" , taskData . UploadCombineImageTakesTime )
2023-08-21 08:19:30 +00:00
}
2023-08-25 03:06:32 +00:00
//unity渲染时间
2023-08-21 08:19:30 +00:00
if taskData . UnityRenderBeginTime > 0 && taskData . UnityRenderEndTime > 0 {
2023-08-25 03:06:32 +00:00
UnityRenderTakesTime = fmt . Sprintf ( "%dms" , taskData . UnityRenderEndTime - taskData . UnityRenderBeginTime )
}
//上传unity渲染图耗时
if taskData . UploadUnityRenderImageTakesTime > 0 {
uploadUnityRenderImageTakesTime = fmt . Sprintf ( "%dms" , taskData . UploadUnityRenderImageTakesTime )
2023-08-21 08:19:30 +00:00
}
//发送到出口
2023-08-24 06:24:04 +00:00
w . sendToOutChan ( w . respondDataFormat ( constants . WEBSOCKET_RENDER_IMAGE , websocket_data . RenderImageRspMsg {
2023-08-25 04:01:01 +00:00
RenderId : taskData . RenderId ,
Image : data . RenderNotifyImageUrl ,
RenderProcessTime : websocket_data . RenderProcessTime {
CombineTakesTime : CombineTakesTime ,
UnityRenderTakesTime : UnityRenderTakesTime ,
UploadCombineImageTakesTime : uploadCombineImageTakesTime ,
UploadUnityRenderImageTakesTime : uploadUnityRenderImageTakesTime ,
} ,
2023-08-21 05:19:12 +00:00
} ) )
}
2023-08-22 08:07:05 +00:00
//删除任务
2023-08-24 04:04:58 +00:00
delete ( w . extendRenderProperty . renderImageTask , data . TaskId )
2023-08-07 02:48:14 +00:00
case 1 : //新增任务
2023-08-24 04:04:58 +00:00
w . extendRenderProperty . renderImageTask [ data . TaskId ] = & renderTask {
2023-08-21 08:19:30 +00:00
RenderId : data . RenderId ,
}
case 2 : //修改(耗时)属性
2023-08-24 04:04:58 +00:00
if taskData , ok := w . extendRenderProperty . renderImageTask [ data . TaskId ] ; ok {
2023-08-25 03:06:32 +00:00
//合图耗时
if data . TaskProperty . CombineTakesTime != 0 {
taskData . CombineTakesTime = data . TaskProperty . CombineTakesTime
}
//上传合图耗时
if data . TaskProperty . UploadCombineImageTakesTime != 0 {
taskData . UploadCombineImageTakesTime = data . TaskProperty . UploadCombineImageTakesTime
2023-08-21 08:19:30 +00:00
}
2023-08-25 03:06:32 +00:00
//上传渲染结果图耗时
if data . TaskProperty . UploadUnityRenderImageTakesTime != 0 {
taskData . UploadUnityRenderImageTakesTime = data . TaskProperty . UploadUnityRenderImageTakesTime
2023-08-21 08:19:30 +00:00
}
2023-08-25 03:06:32 +00:00
//发送unity时间
2023-08-21 08:19:30 +00:00
if data . TaskProperty . UnityRenderBeginTime != 0 {
taskData . UnityRenderBeginTime = data . TaskProperty . UnityRenderBeginTime
}
2023-08-25 03:06:32 +00:00
//收到unity返回的时间
2023-08-21 08:19:30 +00:00
if data . TaskProperty . UnityRenderEndTime != 0 {
taskData . UnityRenderEndTime = data . TaskProperty . UnityRenderEndTime
}
}
2023-07-28 09:15:37 +00:00
}
2023-07-26 07:01:59 +00:00
}
2023-07-26 06:35:29 +00:00
}
}