封装echarts成vue component
封装echarts成vue component EChartsLineComponent
文章目录
- 封装echarts成vue component EChartsLineComponent
- 封装说明
- 重写重点
- EChartsLineComponent的源码
- 使用说明
- 调用EChartsLineComponent示例源码
封装说明
为了减少一些公共代码和方便使用echarts的line图形,有限制条件的封装echats中的line类型的图,该Component名称为EChartsLineComponent。
重写重点
-
以
dateset属性中的source来判断图形是否包含数据,意味着需要通过dataset,source的方式配置数据。初始化option是要定义datasource,source属性,否则不能正常使用该EChartsLineComponent。option:{dataset: {// 第一行为表头,第一个元素为X轴,其后为Y轴元素// 第二行为具体数据点source: []} }同时,在定义的
option中需要先确认数据每条线显示的效果,即配置series属性。option:{series: [{type: 'line',smooth: true,},{type: 'line',smooth: true,}] } -
定义了空数据的展示效果,舍弃了有数据状态下的
grid属性。

-
增加了窗口自适应写法,并确定初始化图标高度为
400px,宽度100%。
EChartsLineComponent的源码
<template><div :id="chartId" :style="{ width: width, height: height }"></div>
</template><script>
import * as echarts from 'echarts';export default {name: 'EChartsLineComponent',props: {chartId: {type: String,required: true},width: {type: String,default: '100%'},height: {type: String,default: '400px'},option: {type: Object,required: true},},data() {return {chartInstance: null,noDataOption: {title: {show: true,text: '暂无数据',left: 'center', // 水平居中top: 'center', // 垂直居中},xAxis: {show: false,},yAxis: {show: false,},grid: {show: true,shadowColor: 'rgba(0, 0, 0, 0.5)',shadowBlur: 10}},};},watch: {option: {handler(newOption, oldOption) {if (this.chartInstance) {// todo 需要细化明确数据变成空的定义 变化中if (newOption.dataset.source.length === 0) {this.updateAxisShow(newOption, false)this.chartInstance.clear();this.noDataOption.title.show = truethis.noDataOption.grid.show = truethis.chartInstance.setOption(this.noDataOption);} else {newOption.title = {show: false}newOption.grid = {show: false}this.updateAxisShow(newOption, true)this.chartInstance.setOption(newOption);}} else {this.init()}},deep: true}},mounted() {this.init()// todo 需要细化明确数据变成空的定义 -- 初始化时if (this.chartInstance.getOption().dataset[0].source.length === 0) {this.updateAxisShow(this.chartInstance.getOption(), false);this.chartInstance.clear();this.chartInstance.setOption(this.noDataOption);}window.addEventListener('resize', this.handleResize);},beforeDestroy() {window.removeEventListener('resize', this.handleResize);if (this.chartInstance) {this.chartInstance.dispose();}},methods: {init() {this.chartInstance = echarts.init(document.getElementById(this.chartId), {renderer: 'svg'});this.chartInstance.setOption(this.option);window.addEventListener('resize', this.handleResize);},handleResize() {if (this.chartInstance) {this.chartInstance.resize();}},updateAxisShow(newOption, value) {if (newOption.yAxis.length) {this.noDataOption.yAxis = []for (let i = 0; i < newOption.yAxis.length; i++) {this.noDataOption.yAxis.push({"show": value})newOption.yAxis[i].show = value}} else {this.noDataOption.yAxis = {"show": value}newOption.yAxis.show = value}if (newOption.xAxis.length) {this.noDataOption.xAxis = []for (let i = 0; i < newOption.xAxis.length; i++) {this.noDataOption.xAxis.push({"show": value})newOption.xAxis[i].show = value}} else {this.noDataOption.xAxis = {"show": value}newOption.xAxis.show = value}},}
};
</script>
使用说明
调用EChartsLineComponent示例源码
<template><sn-page><sd-search-pane ref="searchPane":model="searchModel":options="searchOptions":rules="searchRules":span="3":hide-cancel="true"@handle-query="handleQuery"/><div><div class="title">CPU内核情况</div><EChartsComponent chart-id="CPUUsedChart" :option="CPUUsedChartOption"></EChartsComponent><div class="title">内存情况</div><EChartsComponent chart-id="MemoryUsedChart" :option="MemoryUsedChartOption"></EChartsComponent><div class="title">资源pending情况</div><EChartsComponent chart-id="PendingChart" :option="PendingChartOption"></EChartsComponent><div class="title">APP情况</div><EChartsComponent chart-id="APPChart" :option="APPChartChartOption"></EChartsComponent><div class="title">Container情况</div><EChartsComponent chart-id="ContainerUsedChart" :option="ContainerUsedChartOption"></EChartsComponent></div></sn-page>
</template><script>
export default {data(vm) {return {searchModel: {clusterName: "",queueName: "",time: []},searchOptions: {clusterName: {label: "集群",type: "select",span: 6,props: {clearable: true,filterable: true},on: {change(val) {val && vm.getQueue()},clear() {vm.clearQueue()}},children: []},queueName: {label: "队列",type: "select",span: 6,props: {clearable: true,filterable: true},children: []},time: {label: "时间",type: "date-picker",span: 9,props: {clearable: true,type: "datetimerange",rangeSeparator: "到",format: "yyyy-MM-dd HH:mm","value-format": "yyyy-MM-dd HH:mm",pickerOptions: {shortcuts: [{text: '最近3小时',onClick(picker) {const end = new Date();const start = new Date();start.setTime(start.getTime() - 3600 * 1000 * 3);picker.$emit('pick', [start, end]);}}, {text: '最近1天',onClick(picker) {const end = new Date();const start = new Date();start.setTime(start.getTime() - 3600 * 1000 * 24);picker.$emit('pick', [start, end]);}}, {text: '最近3天',onClick(picker) {const end = new Date();const start = new Date();start.setTime(start.getTime() - 3600 * 1000 * 24 * 3);picker.$emit('pick', [start, end]);}}]}}}},searchRules: {clusterName: [{required: true,message: "请选择集群",trigger: "change"}],queueName: [{required: true,message: "请选择队列",trigger: "change"}],time: [{required: true,message: "请选择时间",trigger: "change"}]},CPUUsedChartOption: {legend: {top: "bottom",},tooltip: {trigger: 'axis',},toolbox: {show: true,feature: {saveAsImage: {show: true}}},dataset: {// 第一行为表头,第一个元素为X轴,其后为Y轴元素// 第二行为具体数据点source: []},xAxis: {show: true,type: 'category',boundaryGap: false,},yAxis: {type: "value",name: "数量",splitLine: {show: true},axisLabel: {show: true,fontSize: 16,}},series: [{type: 'line',lineStyle: {width: 3, // 设置线条宽度为4type: 'dashed', // 设置为虚线},smoothMonotone: "x",smooth: true,},{type: 'line',smoothMonotone: "x",smooth: true,},{type: 'line',lineStyle: {width: 3, // 设置线条宽度为4type: 'dashed', // 设置为虚线},smoothMonotone: "x",smooth: true,}]},MemoryUsedChartOption: {legend: {top: "bottom",},tooltip: {trigger: 'axis',},toolbox: {show: true,feature: {saveAsImage: {show: true}}},dataset: {// 第一行为表头,第一个元素为X轴,其后为Y轴元素// 第二行为具体数据点source: []},xAxis: {show: true,type: 'category',boundaryGap: false,},yAxis: {type: "value",name: "大小",splitLine: {show: true},axisLabel: {show: true,fontSize: 16,}},series: [{type: 'line',lineStyle: {width: 3, // 设置线条宽度为4type: 'dashed', // 设置为虚线},smoothMonotone: "x",smooth: true,},{type: 'line',smoothMonotone: "x",smooth: true,},{type: 'line',lineStyle: {width: 3, // 设置线条宽度为4type: 'dashed', // 设置为虚线},smoothMonotone: "x",smooth: true,}]},PendingChartOption: {legend: {top: "bottom",},tooltip: {trigger: 'axis',},toolbox: {show: true,feature: {saveAsImage: {show: true}}},dataset: {// 第一行为表头,第一个元素为X轴,其后为Y轴元素// 第二行为具体数据点source: []},xAxis: {show: true,type: 'category',boundaryGap: false,},yAxis: [{type: "value",name: "大小",splitLine: {show: true},axisLabel: {show: true,fontSize: 16,}},{type: "value",name: "数量",splitLine: {show: true},axisLabel: {show: true,fontSize: 16,}}],series: [{type: 'line',yAxisIndex: 0,smooth: true,},{type: 'line',yAxisIndex: 1,smooth: true,},]},APPChartChartOption: {legend: {top: "bottom",},tooltip: {trigger: 'axis',},toolbox: {show: true,feature: {saveAsImage: {show: true}}},dataset: {// 第一行为表头,第一个元素为X轴,其后为Y轴元素// 第二行为具体数据点source: []},xAxis: {show: true,type: 'category',boundaryGap: false,},yAxis: {type: "value",name: "数量",splitLine: {show: true},axisLabel: {show: true,fontSize: 16,}},series: [{type: 'line',lineStyle: {width: 3, // 设置线条宽度为4type: 'dashed', // 设置为虚线},smooth: true,},{type: 'line',smooth: true,},{type: 'line',smooth: true,},{type: 'line',smooth: true,},{type: 'line',smooth: true,},{type: 'line',smooth: true,},{type: 'line',smooth: true,},{type: 'line',smooth: true,},]},ContainerUsedChartOption: {legend: {top: "bottom",},tooltip: {trigger: 'axis',},toolbox: {show: true,feature: {saveAsImage: {show: true}}},dataset: {// 第一行为表头,第一个元素为X轴,其后为Y轴元素// 第二行为具体数据点source: []},xAxis: {show: true,type: 'category',boundaryGap: false,},yAxis: {type: "value",name: "数量",splitLine: {show: true},axisLabel: {show: true, fontSize: 16,}},series: [{type: 'line',smoothMonotone: "x",smooth: true,},{type: 'line',smoothMonotone: "x",smooth: true,},]}};},methods: {handleRes(res, title) {if (res.code === 0) {this.$message({type: 'success',message: title + res.msg})} else {this.$message({type: 'error',message: title + res.msg})}},getCPUUsed() {this.$get({api: 'api/v2/manager/yarn/metric/getQueueMetricMaxValue',params: {metrics: "AllocatedVCores,MaxShareVCores,MinShareVCores",clusterName: this.searchModel.clusterName,queueName: this.searchModel.queueName,startTime: this.searchModel.time[0],endTime: this.searchModel.time[1]}}, res => {this.handleRes(res,"CPU内核情况")this.CPUUsedChartOption.dataset.source = res.data})},getMemoryUsed() {this.$get({api: 'api/v2/manager/yarn/metric/getQueueMetricMaxValue',params: {clusterName: this.searchModel.clusterName,queueName: this.searchModel.queueName,metrics: "AllocatedMB,MaxShareMB,MinShareMB",startTime: this.searchModel.time[0],endTime: this.searchModel.time[1]}}, res => {this.handleRes(res,"内存情况")this.MemoryUsedChartOption.dataset.source = res.data})},getPending() {this.$get({api: 'api/v2/manager/yarn/metric/getQueueMetricMaxValue',params: {clusterName: this.searchModel.clusterName,queueName: this.searchModel.queueName,metrics: "PendingMB,PendingVCores",startTime: this.searchModel.time[0],endTime: this.searchModel.time[1]}}, res => {this.handleRes(res,"资源pending情况")this.PendingChartOption.dataset.source = res.data})},getAPP() {this.$get({api: 'api/v2/manager/yarn/metric/getQueueMetricMaxValue',params: {clusterName: this.searchModel.clusterName,queueName: this.searchModel.queueName,metrics: "MaxApps,AppsSubmitted,AppsRunning,AppsPending,AppsCompleted,AppsKilled,AppsFailed",startTime: this.searchModel.time[0],endTime: this.searchModel.time[1]}}, res => {this.handleRes(res,"APP情况")this.APPChartChartOption.dataset.source = res.data})},getContainerUsed() {this.$get({api: 'api/v2/manager/yarn/metric/getQueueMetricMaxValue',params: {clusterName: this.searchModel.clusterName,queueName: this.searchModel.queueName,metrics: "AllocatedContainers,PendingContainers",startTime: this.searchModel.time[0],endTime: this.searchModel.time[1]}}, res => {this.handleRes(res,"Container情况")this.ContainerUsedChartOption.dataset.source = res.data})},handleQuery() {this.$refs.searchPane.validate(valid => {if (valid) {// 几张图就几个请求this.getCPUUsed();this.getMemoryUsed();this.getPending();this.getAPP();this.getContainerUsed();}});},getQueue() {this.$get({api: 'api/v2/manager/yarn/monitor/listYarnQueue',params: {yarnCluster: this.searchModel.clusterName}}, res => {this.searchOptions.queueName.children = res.data.map(item => {return {label: item, value: item}})})},},mounted() {},created() {this.$get({api: 'api/v2/manager/yarn/monitor/listYarnCluster'}, res => {this.searchOptions.clusterName.children = res.data.map(item => {return {label: item, value: item}})})this.CPUUsedChartOption.dataset.source = [['metricDate', 'AllocatedVCores', 'MaxShareVCores', 'MinShareVCores'],['2024-12-5', 50, 100, 1900],['2024-12-6', 50, 100, 1900],['2024-12-7', 50, 100, 1900],['2024-12-8', 50, 100, 1900],['2024-12-9', 50, 100, 1900],['2024-12-10', 50, 100, 1900]];this.MemoryUsedChartOption.dataset.source = [['metricDate', 'AllocatedMB', 'MaxShareMB', 'MinShareMB'],['2024-12-5', 50, 100, 1900],['2024-12-6', 50, 100, 1900],['2024-12-7', 50, 100, 1900],['2024-12-8', 50, 100, 1900],['2024-12-9', 50, 100, 1900],['2024-12-10', 50, 100, 1900]];this.APPChartChartOption.dataset.source = [['metricDate', 'MaxApps', 'AppsSubmitted', 'AppsRunning', 'AppsPending', 'AppsCompleted', 'AppsKilled', 'AppsFailed'],['2024-12-5', 2000, 100, 1900, 50, 200, 1600, 1],['2024-12-6', 2000, 100, 1900, 50, 200, 1600, 0],['2024-12-7', 2000, 100, 1900, 50, 200, 1700, 0],['2024-12-8', 2000, 100, 1900, 50, 200, 1800, 0],['2024-12-9', 2000, 100, 1900, 50, 200, 2200, 0],['2024-12-10', 2000, 100, 1900, 50, 200, 1800, 0]];this.PendingChartOption.dataset.source = [['metricDate', 'PendingMB', 'PendingVCores'],['2024-12-5', 50, 0],['2024-12-6', 50, 100],['2024-12-7', 0, 100],['2024-12-8', 10, 60],['2024-12-9', 50, 100],['2024-12-10', 0, 0]];this.ContainerUsedChartOption.dataset.source = [['metricDate', 'AllocatedContainers', 'PendingContainers'],['2024-12-5', 50, 100],['2024-12-6', 50, 100],['2024-12-7', 50, 100],['2024-12-8', 50, 10000],['2024-12-9', 50, 1000],['2024-12-10', 50, 100900]];},beforeDestroy() {}
};
</script><style>
.title {display: flex;justify-content: center; /* 水平居中 */align-items: center; /* 垂直居中 */font-size: 20px;font-weight: bold;margin-top: 20px;
}
</style>相关文章:
封装echarts成vue component
封装echarts成vue component EChartsLineComponent 文章目录 封装echarts成vue component EChartsLineComponent封装说明重写重点EChartsLineComponent的源码 使用说明调用EChartsLineComponent示例源码 封装说明 为了减少一些公共代码和方便使用echarts的line图形,…...
uniapp Stripe 支付
引入 Stripe npm install stripe/stripe-js import { loadStripe } from stripe/stripe-js; Stripe 提供两种不同类型组件 Payment Element 和 Card Element:如果你使用的是 Payment Element,它是一个更高级别的组件,能够自动处理多种支…...
Windows onnxruntime编译openvino
理论上来说,可以直接访问 ONNXRuntime Releases 下载 dll 文件,然后从官方文档中下载缺少的头文件以直接调用,但我没有尝试过。 1. 下载 OpenVINO 包 从官网下载 OpenVINO 的安装包并放置在 C:\Program Files (x86) 路径下,例如…...
vue3+TS+vite中Echarts的安装与使用
概述 技术栈:Vue3TsViteEcharts 简述:图文详解,教你如何在Vue项目中引入Echarts,封装Echarts组件,并实现常用Echats图列 文章目录 一,效果图 二,引入Echarts 2.1安装Echarts 2.2main.ts中引…...
期末算法分析程序填空题
目录 5-1 最小生成树(普里姆算法) 5-2 快速排序(分治法) 输入样例: 输出样例: 5-3 归并排序(递归法) 输入样例: 输出样例: 5-4 求解编辑距离问题(动态规划法)…...
搭建android开发环境 android studio
1、环境介绍 在进行安卓开发时,需要掌握java,需要安卓SDK,需要一款编辑器,还需要软件的测试环境(真机或虚拟机)。 早起开发安卓app,使用的是eclipse加安卓SDK,需要自行搭建。 目前开…...
R语言6种将字符转成数字的方法,写在新年来临之际
咱们临床研究中,拿到数据后首先要对数据进行清洗,把数据变成咱们想要的格式,才能进行下一步分析,其中数据中的字符转成数字是个重要的内容,因为字符中常含有特殊符号,不利于分析,转成数字后才能…...
RocketMQ学习笔记(持续更新中......)
目录 1. 单机搭建 2. 测试RocketMQ 3. 集群搭建 4. 集群启动 5. RocketMQ-DashBoard搭建 6. 不同类型消息发送 1.同步消息 2. 异步消息发送 3. 单向发送消息 7. 消费消息 1. 单机搭建 1. 先从rocketmq官网下载二进制包,ftp上传至linux服务器,…...
强化学习的基础概念
这节课会介绍一些基本的概念,并结合例子讲解。 在马尔科夫决策框架下介绍这些概念 本博客是基于西湖大学强化学习课程的视屏进行笔记的,这是链接: 课程链接 目录 强化学习的基本概念 state和state space Action和Action Space State transiti…...
excel怎么删除右边无限列(亲测有效)
excel怎么删除右边无限列(亲测有效) 网上很多只用第1步的,删除了根本没用,还是存在,但是隐藏后取消隐藏却是可以的。 找到右边要删除的列的第一个空白列,选中整个列按“ctrlshift>(向右的小箭头)”&am…...
STM32-笔记23-超声波传感器HC-SR04
一、简介 HC-SR04 工作参数: • 探测距离:2~600cm • 探测精度:0.1cm1% • 感应角度:<15 • 输出方式:GPIO • 工作电压:DC 3~5.5V • 工作电流:5.3mA • 工作温度:-40~85℃ 怎么…...
Linux | Ubuntu零基础安装学习cURL文件传输工具
目录 介绍 检查安装包 下载安装 手册 介绍 cURL是一个利用URL语法在命令行下工作的文件传输工具,首次发行于1997年12。cURL支持多种协议,包括FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3…...
什么是 GPT?Transformer 工作原理的动画展示
大家读完觉得有意义记得关注和点赞!!! 目录 1 图解 “Generative Pre-trained Transformer”(GPT) 1.1 Generative:生成式 1.1.1 可视化 1.1.2 生成式 vs. 判别式(译注) 1.2 Pr…...
SpringCloudAlibaba实战入门之路由网关Gateway过滤器(十三)
承接上篇,我们知道除了断言,还有一个重要的功能是过滤器,本节课我们就讲一下常见的网关过滤器及其一般使用。 一、Filter介绍 类似SpringMVC里面的的拦截器Interceptor,Servlet的过滤器。“pre”和“post”分别会在请求被执行前调用和被执行后调用,用来修改请求和响应信…...
电路仿真软件PSIM简介
在从事开关电源相关产品开发的工程师或者正在学习开关电源的学习者,常常会用到各种仿真软件进行电路的仿真,不仅可以快速验证电路参数,还能清楚知道各器件的工作状态。 现在的电路仿真软件很多,例如matlab、Multisim、Simplis&…...
C语言:调试的概念和调试器的选择
所谓调试(Dubug),就是跟踪程序的运行过程,从而发现程序的逻辑错误(思路错误),或者隐藏的缺陷(Bug)。 在调试的过程中,我们可以监控程序的每一个细节ÿ…...
25. C++继承 1 (继承的概念与基础使用, 继承的复制兼容规则,继承的作用域)
⭐上篇模板文章:24. C模板 2 (非类型模板参数,模板的特化与模板的分离编译)-CSDN博客 ⭐本篇代码:c学习 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) ⭐标⭐是比较重要的部分 目录 一. 继承的基础使用 1.1 继承的格式 1.2 …...
git 退出编辑模式
在使用 Git 时,有时需要进入编辑器来输入提交信息或进行其他编辑操作。不同的系统和配置可能会导致使用不同的编辑器。以下是几种常见 Git 编辑器的退出方法: Vim 编辑器: 保存并退出: 按下 Esc 键退出编辑模式。输入 :w…...
内容营销与传统营销方式有哪些差别?
在互联网高度发达的当下,碎片化的信息接收方式,让用户对于营销信息拥有较高的敏感度。这一现状,也使得众多传统营销方式正在逐渐失效。想要稳定推广效率,内容营销是当下不少品牌的共同选择。接下来,就让我们来了解下内…...
EasyExcel(读取操作和填充操作)
文章目录 1.准备Read.xlsx(具有两个sheet)2.读取第一个sheet中的数据1.模板2.方法3.结果 3.读取所有sheet中的数据1.模板2.方法3.结果 EasyExcel填充1.简单填充1.准备 Fill01.xlsx2.无模版3.方法4.结果 2.列表填充1.准备 Fill02.xlsx2.模板3.方法4.结果 …...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
