腾讯云渲染实战

news2025/1/21 6:36:00

UE使用流渲染技术的主要原因是为了提高渲染效率和降低成本。流渲染技术可以将渲染任务分配到多个计算节点上进行并行处理,从而加快渲染速度。同时,流渲染技术还可以将渲染任务分配到云端进行处理,减少本地计算机的负担,降低成本。此外,流渲染技术还可以实现实时渲染,让用户可以在编辑器中实时预览场景效果,提高工作效率。一直以来UE在前端的展示都是使用基于webrtc实时音视频传输的流渲染技术。但目前基于UE的云渲染对于大部分人来说部署都是一个大问题,从服务器选择、UE PixelStreaming的学习都是一个很大的门槛,并且由于UE的云渲染的服务器成本过高,需要服务器具备动态的弹性伸缩能力。

腾讯应用云渲染依托腾讯丰富的 边缘计算节点、灵活的 GPU 虚拟化技术、稳定低延时的音视频串流能力,帮助您将应用客户端云化,使得用户无需下载应用包体,仅需打开视频画面即可操作体验云上应用。同时,应用云渲染提供云 API + 全端 SDK,满足您的用户在各类终端以及业务场景下的需要,解决的不仅仅是UE的云渲染问题,从理论上来讲,满足所有云端无法前端直接渲染的需要(由于是针对大部分的需要三维渲染的大体量软件,没有对某一种平台做针对性的优化,也限制了某些功能的使用)。

应用云渲染的使用步骤

1. 进入腾讯云的应用云渲染https://cloud.tencent.com/product/car

模块申请使用,审核通过之后进行云渲染控制台。对于第一次使用的用户来说,里面默认有一个免费的应用(未来场景-演示应用),提供了两路免费的并发包(演示应用法无法修改成自己的应用)
image.png

2.上传自己的应用

目前这个应用只能支持windows的三维应用程序,支持上传zip/rar压缩包,上传过程有点长,我1.6G的UE应用程序,上传花费了大概半个多小时(所以程序最好经过比较严格的测试,不然这个时间花费的还是有点长的)。

image.png
上传完成之后需要配置启动参数。
image.png

  1. 启动路径最好是等应用上传完成之后等后台完全解压完成之后再去选择,最好不要自己写路径,很可能写错。
  2. 启动参数很好理解,就是我们使用一个exe时我们自己带的一的命令行参数(UE自己带的云渲染参数就不需要使用了,因为这不是使用的UE自带的云渲染插件)
  3. 通使用模式可以看出,云渲染是通过捕捉云服务器的桌面来的,并没有与某种应用程序绑定。仅捕捉应用窗口,本质上就是获取到windows中那个窗口的信息,然后进行渲染绑定(https://cloud.tencent.com/document/product/1547/72369)

3. 创建项目

创建项目设置项目类型,关联应用,并发规格(与后面需要购买的并发包要一致,否则无法使用)
image.png

4. 为项目分配并发包

一路就是一个并发包,如果有300路就要购买三百个并发包,如果是100个并发包,没有优惠的情况下,一个月需要26万(可以跟腾讯云客户申请优惠)。包天的费用更高。如果只是测试可以有优惠,大概1路第一个月中型的服务器只要500块
image.png
购买完成之后为项目分配并发包即可。

5. 效果测试

每次效果测试生成一个体验码
image.png
image.png

使用应用云渲染API

效果测试完成之后,我们需要使用官方提供的API来构建自己的前后端调度,这样才能使用自己的域名及自定义自己的页面。具体文档可参考https://cloud.tencent.com/document/product/1547/72707

1. 构建后端

业务后台必须部署无法省略,从官方下载后端部署程序之后(nodejs后端),需要提供腾讯云帐号的 SecretId 和 SecretKey(可在 控制台API 密钥管理中获取),为了您的财产和服务安全,该信息需要在后台处理。另外您也需要业务后台来管理用户会话,完成用户排队等功能。部署后启动。
image.png

构建前端

从github中下载代码,根据文档进行配置,编写一个简单的demo

<!doctype html>
  <html>

  <head>
  <meta charset="utf-8" />
  <meta name="apple-mobile-web-app-capable" content="yes" />
  <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0" />
  <title>Tencent Cloud - Real-Time Cloud Rendering - CAR - demo</title>
  <style>
  * {
    padding: 0;
margin: 0;
}

html,
  body {
  width: 100%;
  height: 100%;
  overflow: hidden;
  font-family: 'SimHei', 'Microsoft YaHei', 'Arial', 'sans-serif';
}

#demo-container {
  width: 100%;
  height: 100%;
}

#plugin-point {
  position: absolute;
  left: 100px;
  bottom: 150px;
  width: 0px;
  height: 0px;
}
</style>
  </head>

  <body>
  <div id="demo-container">
  <div id="mount-point"></div>
  <div id="plugin-point"></div>
  </div>
  <script type="text/javascript" src="index.js"></script> //我把第三方库TCGSDK的js文件单独放在同目录下了
  <script type="text/javascript" src="joystick.js"></script>
  <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/axios/0.26.1/axios.min.js"></script>
  <!-- <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.21.1/axios.min.js"></script> -->
  <script>

  //自定义生成USERID。
  const getPassword = (legnth) => {
  // 定义一个空数组保存我们的密码
  let passArrItem = [];

  // 定义获取密码成员的方法
  const getNumber = () => Math.floor(Math.random() * 10); // 0~9的数字
  const getUpLetter = () => String.fromCharCode(Math.floor(Math.random() * 26) + 65); // A-Z
  const getLowLetter = () => String.fromCharCode(Math.floor(Math.random() * 26) + 97); // a-z

  // 将获取成员的方法保存在一个数组中方便用后面生成的随机index取用
  const passMethodArr = [getNumber, getUpLetter, getLowLetter];

  // 随机index
  const getIndex = () => Math.floor(Math.random() * 3);

  // 从0-9,a-z,A-Z中随机获取一项
  const getPassItem = () => passMethodArr[getIndex()]();

  Array(legnth - 3).fill('').forEach(() => {
    passArrItem.push(getPassItem());
  })

  const confirmItem = [getNumber(), getUpLetter(), getLowLetter()];

  // 加上我们确认的三项,从而使生成的密码,大写字母、小写字母和数字至少各包含一个
  passArrItem.push(...confirmItem);

  // 转为字符串返回
  return passArrItem.join('');
}

const StartProject = async () => {
  const url = 'http://134.175.62.177:4100/StartProject'; // 这个是自己的业务后端的地址.

  // For more information on other optional parameters, see the document of the `ApplyConcurrent` API.
  const { data } = await axios.post(url, {
    ProjectId: 'cap-nfkjzrj8',
    UserId: getPassword(8), // Random UserId
    ClientSession: TCGSDK.getClientSession(),
  });

  console.log('%c StartProject res', 'color: blue; font-size: 14px', data);

  const { Code, SessionDescribe: { ServerSession } } = data;

  if (Code === 0) {
    TCGSDK.start(ServerSession);
  } else {
    // Process the request exception
  }
}

  // For two-finger touch, record the position of the last touch point to facilitate coordinate calculation.
  let lastX = null;
  let lastY = null;

  // For more information on the SDK lifecycle, visit https://ex.cloud-gaming.myqcloud.com/cloud_gaming_web/docs/index.html.
  TCGSDK.init({
  appid: 1317511421,
  mount: 'mount-point',
  debugSetting: {
  showLog: true,
  },
  // Connected successfully.
  onConnectSuccess: async (res) => {
  console.log('onConnectSuccess', res);

  // // Add joystick
  // const j = new CloudGamingPlugin.joystick({
  //   zone: document.querySelector('#plugin-point'),
  // });
  },
  // The network was disconnected or the user was kicked out.
  onDisconnect: (res) => {
  console.log('onDisconnect', res);
  },
  onWebrtcStatusChange: (res) => {
  console.log('onWebrtcStatusChange', res);
  },
  // The user touched the mobile client to simulate an instruction sent on a PC.
  onTouchEvent: async (res) => {
  // console.log('onTouchEvent', res);
  // The code for a single-finger touch operation
  if (res.length === 1) {
  const { id, type, pageX, pageY } = res.pop();
  // console.log('onTouchEvent', id, type, pageX, pageY);
  TCGSDK.mouseMove(id, type, pageX, pageY);
  if (type === 'touchstart') {
  TCGSDK.sendRawEvent({ type: 'mouseleft', down: true });
  }
  if (type === 'touchend' || type === 'touchcancel') {
  TCGSDK.sendRawEvent({ type: 'mouseleft', down: false });
  }
  }
  // The code for a two-finger pinch zoom operation. Here, the two fingers simulate a mouse scroll wheel event on a PC.
  if (res.length === 2) {
  const [{ pageX: oneX, pageY: oneY }, { pageX: twoX, pageY: twoY }] = res;

  const currentX = Math.ceil(Math.abs(oneX - twoX));
  const currentY = Math.ceil(Math.abs(oneY - twoY));
  // `lastX` and `lastY` indicates the previous position and can be defined globally like this: `let lastX = null, lastY = null`.
  lastX ||= currentX;
  lastY ||= currentY;

  if (lastX && currentX - lastX < 0 && lastY && currentY - lastY < 0) {
  TCGSDK.sendRawEvent({ type: 'mousescroll', delta: 1 });
  lastX = currentX;
  lastY = currentY;
  }

  if (lastX && currentX - lastX > 0 && lastY && currentY - lastY > 0) {
  TCGSDK.sendRawEvent({ type: 'mousescroll', delta: -1 });
  lastX = currentX;
  lastY = currentY;
  }
  }
  },
  onInitSuccess: async (res) => {
  console.log('%c onInitSuccess', 'color: red', res);

  await StartProject();
  }
  });

  </script>
  </body>

  </html>

560acb4934aedcf3338ff7faea0d85b.png

UE云渲染和腾讯云渲染的优缺点

1. UE云渲染优缺点

  • 基于官方提供的像素流插件实现,可灵活根据需要在自己的服务器中部署,成本是一次性投入。
  • 支持UE和前端页面的交互,可定制化程度高。
  • 没有一套成熟简单的服务器部署方式,对于大规模服务器的配置也是一个比较大的麻烦,对于服务器选型也是一个比较大的问题。

2. 腾讯云应用云渲染

  • 部署简单,动态分配,稳定,不容易出现网络问题。
  • 不仅仅是UE部署,是更为通用的三维渲染部署
  • 长期使用费用很高
  • 不支持私有化部署,对于保密性比较高的单位不太适合
  • 不支持与三维内部程序进行交互,需要单独自己实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/434508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

又一科研利器诞生!能对话的论文阅读器,hammerScholar

文&#xff5c;智商掉了一地 hammerScholar 新升级&#xff0c;用对话式读论文工具提升科研生产力~ 不得不说&#xff0c;自从 AIGC 这个概念出现以来&#xff0c;它极强的内容理解与生成能力也推动着各种生产力工具层出不穷&#xff0c;除了一些浏览器和代码插件以外&#xff…

SpringBoot的Interceptor拦截器的简介和实际使用

拦截器&#xff08;Interceptor&#xff09; 概念&#xff1a;是一种动态拦截方法调用的机制&#xff0c;类似于过滤器。Spring框架中提供的&#xff0c;用来动态拦截控制器方法的执行。 作用&#xff1a;拦截请求&#xff0c;在指定的方法调用前后&#xff0c;根据业务需要执行…

干货 | 关于等效电路图

等效电路图是电路原理中非常重要的一个概念&#xff0c;在电子工程、通信工程和电力工程等领域中经常被使用。等效电路图是指将一个复杂的电路简化成一个简单的电路&#xff0c;同时保持电路的等效性质&#xff0c;以便于分析和设计电路。在本文中&#xff0c;我们将详细介绍等…

回溯法 思想

回溯法&#xff08;back tracking&#xff09;&#xff08;探索与回溯法&#xff09;是一种选优搜索法&#xff0c;又称为试探法&#xff0c;按选优条件向前搜索&#xff0c;以达到目标。但当探索到某一步时&#xff0c;发现原先选择并不优或达不到目标&#xff0c;就退回到上一…

ChatGPT安全性受质疑 国家网信办发布《生成式人工智能服务管理办法(征求意见稿)》

你是否曾经和一款人工智能对话&#xff1f;它们似乎能够理解你的问题&#xff0c;并给出令人满意的答案。ChatGPT是目前最流行的人工智能。它是由OpenAI开发的一款基于GPT技术的自然语言处理模型。 通过训练大量的文本数据&#xff0c;ChatGPT可以理解并回答用户的问题&#xf…

Excel vba直接调用斑马打印机进行打印代码

1.难点 1.1 vba 对zebra打印机调用方法open 1.2 zebra打印机默认支持UTF8 编码方式&#xff0c;对应编码命令为CI28; 支持GB2312 GB18030 ASCII码编码方式&#xff0c;对应编码命令为CI26 1.3 VBA对中文只支持GB2312, 而excel 是默认支持UTF8的&#xff0c; excel 与VBA编…

钛碳化铝(Ti3AlC2)在实验检测领域中的应用

钛碳化铝Ti3AlC2是一种属于MAX相&#xff08;M代表金属元素&#xff0c;A代表主族元素&#xff0c;X代表碳或氮&#xff09;的陶瓷材料。它是由钛、铝和碳组成的复合材料&#xff0c;拥有优异的力学、热学和电学性能。由于这些性质&#xff0c;Ti3AlC2已成为近年来研究和应用的…

[Netty源码] ByteBuf相关问题 (十)

文章目录 1.ByteBuf介绍2.ByteBuf分类2.1 AbstractByteBuf2.2 AbstractReferenceCountedByteBuf2.3 UnpooledHeapByteBuf2.4 UnpooledDirectByteBuf2.5 PooledDirectByteBuf 1.ByteBuf介绍 字节缓冲区, jdk NIO的ByteBuffer比较复杂, netty重新设计了ByteBuf用以代替ByteBuffe…

直方图实例详解(颜色直方图、灰度直方图)

直方图实例详解&#xff08;颜色直方图、灰度直方图&#xff09; 本篇目录&#xff1a; &#x1f984; 一、前言 &#x1f984; 二、直方图的概念 &#x1f984; 三、颜色直方图 &#xff08;1&#xff09;、颜色直方图定义 &#xff08;2&#xff09;、颜色直方图使用方法…

线程池中的拒绝策略

线程池中的拒绝策略 什么情况下出发拒绝策略? 当提交任务数大于corePoolSize的时候,会将多余任务缓存在workQueue阻塞队列中当阻塞队列满了,会扩充线程数当扩充线程数大于maximumPoolSize的时候,就会触发拒绝策略 也就是说,当任务数大于workQueue.size() 和maximumPoolSize…

同态随机基加密的量子多方密码-数学公式

众所周知&#xff0c;信息和信息处理的完全量子理论提供了诸多好处&#xff0c;其中包括一种基于基础物理的安全密码学&#xff0c;以及一种实现量子计算机的合理希望&#xff0c;这种计算机可以加速某些数学问题的解决。这些好处来自于独特的量子特性&#xff0c;如叠加、纠缠…

《PyTorch 深度学习实践》第9讲 多分类问题(Kaggle作业:otto分类)

文章目录 1 一些细碎代码1.1 Cross Entropy1.2 Mini-batch: batch_size3 2 示例3 作业任务描述查看数据进行建模提交Kaggle总结 该专栏内容为对该视频的学习记录&#xff1a;【《PyTorch深度学习实践》完结合集】 专栏的全部代码、数据集和课件全放在个人GitHub了&#xff0c;…

分享:作业帮在多云环境下的高可用双活架构优化实践

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 本文来自OceanBase社区分享&#xff0c;仅限交流探讨。作者介绍&#xff1a;刘强&#xff0c;就职于作业帮基础架构 DBA 团队&#xff0c;负责分布式数据库的探索和使用&#xff0c;协同研发团队在…

node 链接MySql数据库并 进行增删改查

在Navicat中创建数据库创建表 那么就开始吧&#xff01; 一、链接数据库 mysql - npmA node.js driver for mysql. It is written in JavaScript, does not require compiling, and is 100% MIT licensed.. Latest version: 2.18.1, last published: 3 years ago. Start usin…

15.使用组件

目录 1 独立组件 2 私有子组件 3 全局组件 1 独立组件 我当前App.vue的内容是这样的 LEFT.vue的内容是这样的 RIGHT.vue的内容是这样的 那么这个时候我们认为 left.vue&#xff0c;right.vue与App.vue 是彼此独立的三个组件 2 私有子组件 我现在想把LEFT.vue与RIGHT.…

操作系统原理 —— 操作系统运行机制与体系结构(三)

什么是操作系统的指令&#xff1f; 指令就是处理器(CPU)能识别、执行的最基本命令。 比如我们平时写的 Java 代码、C 语言代码&#xff0c;CPU 它能直接识别并且运行吗&#xff1f; 当然是不行的。 Java、C 语言这些都属于高级语言&#xff0c;它们还需要经过一系列的编译最…

再也不怕面试官问:详解Synchronized和Lock的实现原理及使用场景

1、Synchronized与Lock对比 实现方式&#xff1a;Synchronized是Java语言内置的关键字&#xff0c;而Lock是一个Java接口。锁的获取和释放&#xff1a;Synchronized是隐式获取和释放锁&#xff0c;由Java虚拟机自动完成&#xff1b;而Lock需要显式地调用lock()方法获取锁&#…

Moonbeam 操作指南|使用Docker和Systemd在Moonbeam上运行节点

运行全节点允许您存储链的本地副本、验证新的区块、获取对RPC端点的本地访问权限以及配置为创作区块的收集人等。 &#x1f4c4; 查看开发者文档 重点操作如下&#xff1a; 虽然运行&#xff08;和升级&#xff09;您自己的节点需要付出时间和精力&#xff0c;但同时您也会获…

动力节点Vue笔记——第四章Vue与Ajax

四、Vue与AJAX 4.1 回顾发送AJAX异步请求的方式 发送AJAX异步请求的常见方式包括&#xff1a; 原生方式&#xff0c;使用浏览器内置的JS对象XMLHttpRequest const xhr new XMLHttpRequest()xhr.onreadystatechange function(){}xhr.open()xhr.send() 原生方式&#xff0…

【算法题】2583. 二叉树中的第 K 大层和

题目&#xff1a; 给你一棵二叉树的根节点 root 和一个正整数 k 。 树中的 层和 是指 同一层 上节点值的总和。 返回树中第 k 大的层和&#xff08;不一定不同&#xff09;。如果树少于 k 层&#xff0c;则返回 -1 。 注意&#xff0c;如果两个节点与根节点的距离相同&…