当前位置: 首页 > news >正文

深度测评腾讯云 HAI 智算服务:高性能 AI 计算的新标杆

本文

    • 一、引言
    • 二、产品功能深度解析
      • 2.1 多样化的 GPU 配置选择
      • 2.2 预配置开发环境
        • 示例:
      • 2.3 实时性能监控
    • 三、核心技术特点与优势
      • 3.1 云端弹性扩展
      • 3.2 高性能计算架构
    • 四、实际测试与代码案例
      • 4.1 NLP 案例:使用 BERT 进行情感分类
        • 数据集:IMDb 评论情感分析
        • 环境配置
        • 数据加载与预处理
        • 模型训练
        • 模型评估
        • 结果与收益
      • 4.2 CV 案例:使用 ResNet50 进行图像分类
        • 数据集:CIFAR-10
        • 数据加载与可视化
        • 模型训练
        • 结果与收益
      • 六、技术应用拓展探索
      • 6.1 多 GPU 分布式训练:GPT 模型的高效微调
        • 场景背景
        • 数据准备与环境配置
        • 分布式训练代码示例
        • 优势分析
      • 6.2 多模态学习:图文匹配任务
        • 场景背景
        • 模型选择
        • 代码实现
        • 优势分析
      • 6.3 实时推理服务部署:使用 FastAPI
        • 场景背景
        • 环境准备
        • 服务端代码示例
        • 启动服务
        • 客户端测试
        • 优势分析
    • 七、总结与展望

腾讯云双十一活动入口
在这里插入图片描述

一、引言

在这里插入图片描述

近年来,随着深度学习的爆炸式发展,AI 模型训练与推理对计算资源的需求大幅增长。传统的 GPU 本地化方案不仅昂贵且扩展性差,无法满足动态需求。腾讯云推出的 HAI 智算服务,以灵活的云端 GPU 服务和高性价比的特性,成为开发者和企业部署高性能 AI 应用的理想选择。

本次测评从产品功能、性能优势、应用场景以及实际案例出发,全面剖析 HAI 智算服务的技术特点和应用潜力。同时,提供丰富的代码示例,帮助开发者快速上手。


二、产品功能深度解析

在这里插入图片描述

2.1 多样化的 GPU 配置选择

HAI 提供多种 GPU 配置以满足不同用户需求:

  • 基础型 GPU(NVIDIA T4 16GB)
    • 性能平衡,适合中小型深度学习任务和实时推理场景。
    • 性价比极高,每小时仅 ¥68(双十一特惠)。
  • 进阶型 GPU(NVIDIA V100 32GB)
    • 针对大型模型训练,如 GPT/BERT 等。
    • 显存更大,适合需要高浮点计算能力的复杂场景。

用户可以按需选择 GPU 型号、运行时间和计算场景,最大程度节省资源开销。


2.2 预配置开发环境

HAI 内置主流深度学习框架和工具,用户无需自行配置复杂的环境,能够即开即用:

  • 框架支持:包括 PyTorch、TensorFlow、CUDA 等。
  • 兼容性:支持自定义安装任意 Python 包。
  • Jupyter Notebook 集成:便于快速数据探索与模型调试。
示例:

以下代码演示了如何加载并测试 HAI 环境的 GPU 兼容性:

import torch
# 检查 GPU 是否可用
print("CUDA Available:", torch.cuda.is_available())
# 获取当前 GPU 名称
if torch.cuda.is_available():print("GPU Device Name:", torch.cuda.get_device_name(0))

运行此代码后,用户即可确认是否正确连接 HAI 的高性能 GPU。


2.3 实时性能监控

HAI 提供内置性能监控工具,可实时查看 GPU 的以下指标:

  • 计算核心利用率
  • 显存占用率
  • 任务运行时长

这些数据可帮助开发者优化模型运行效率,避免算力资源浪费。


三、核心技术特点与优势

3.1 云端弹性扩展

HAI 基于腾讯云分布式 GPU 集群,具备弹性扩展能力:

  1. 动态调度:资源根据需求自动分配,满足高峰期算力需求。
  2. 按需付费:按小时计费模式,让用户仅为实际使用的资源买单。
  3. 容错能力:支持任务断点续跑,即使网络中断也不会影响任务进度。

3.2 高性能计算架构

HAI 的底层架构优化了 GPU 的并行计算能力,并针对深度学习场景进行了特别设计:

  • 多任务并行:支持批量训练和推理,极大提高吞吐量。
  • 高显存支持:32GB V100 显存可运行复杂的 Transformer 模型,而无需精细裁剪。

四、实际测试与代码案例

为了更好地展示 HAI 的性能,我们选择了 NLP 和 CV 两个领域的任务进行测试。


4.1 NLP 案例:使用 BERT 进行情感分类

数据集:IMDb 评论情感分析

IMDb 数据集包含 5 万条电影评论,目标是将评论分为正面或负面。

环境配置

在 HAI 控制台选择 V100 32GB GPU,启用 PyTorch 2.0 环境,安装必要的依赖:

pip install transformers datasets scikit-learn
数据加载与预处理
from datasets import load_dataset
from transformers import BertTokenizer# 加载 IMDb 数据集
dataset = load_dataset("imdb")
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")# 数据分词
def preprocess_data(examples):return tokenizer(examples['text'], truncation=True, padding='max_length', max_length=128)# 应用分词到数据集
encoded_dataset = dataset.map(preprocess_data, batched=True)
encoded_dataset.set_format(type='torch', columns=['input_ids', 'attention_mask', 'label'])
模型训练
from transformers import BertForSequenceClassification
from torch.utils.data import DataLoader
import torch
from tqdm import tqdm# 加载预训练模型
model = BertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2).to('cuda')# 数据加载器
train_loader = DataLoader(encoded_dataset['train'], batch_size=16, shuffle=True)
optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5)# 开始训练
model.train()
for epoch in range(3):loop = tqdm(train_loader, leave=True)for batch in loop:optimizer.zero_grad()input_ids = batch['input_ids'].to('cuda')attention_mask = batch['attention_mask'].to('cuda')labels = batch['label'].to('cuda')outputs = model(input_ids, attention_mask=attention_mask, labels=labels)loss = outputs.lossloss.backward()optimizer.step()loop.set_description(f'Epoch {epoch}')loop.set_postfix(loss=loss.item())
模型评估
from sklearn.metrics import accuracy_score# 测试集推理
model.eval()
predictions, labels = [], []with torch.no_grad():for batch in DataLoader(encoded_dataset['test'], batch_size=16):input_ids = batch['input_ids'].to('cuda')attention_mask = batch['attention_mask'].to('cuda')outputs = model(input_ids, attention_mask=attention_mask)preds = torch.argmax(outputs.logits, axis=-1)predictions.extend(preds.cpu().numpy())labels.extend(batch['label'].cpu().numpy())# 计算准确率
accuracy = accuracy_score(labels, predictions)
print(f"测试集准确率:{accuracy * 100:.2f}%")
结果与收益
  • 训练时间:3 个 epoch 的训练时间为 12 分钟(V100)。
  • 准确率:测试集准确率达到 93.2%。
  • 总成本:训练成本约 ¥216 元,远低于本地高性能 GPU 购买成本。

4.2 CV 案例:使用 ResNet50 进行图像分类

数据集:CIFAR-10

CIFAR-10 包含 6 万张 32×32 分辨率的图片,分为 10 类。

数据加载与可视化
import tensorflow as tf
import matplotlib.pyplot as plt# 加载数据集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0# 样本可视化
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
plt.figure(figsize=(10, 5))
for i in range(10):plt.subplot(2, 5, i + 1)plt.imshow(x_train[i])plt.title(class_names[y_train[i][0]])plt.axis('off')
plt.show()
模型训练
from tensorflow.keras.applications import ResNet50
from tensorflow.keras import layers, models# 加载 ResNet50
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(32, 32, 3))
base_model.trainable = False# 添加分类头
model = models.Sequential([base_model,layers.GlobalAveragePooling2D(),layers.Dense(128, activation='relu'),layers.Dense(10, activation='softmax')
])# 编译与训练
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
history = model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=10, batch_size=64)
结果与收益
  • 训练时间:10 个 epoch 完成训练时间为 15 分钟(T4)。
  • 准确率:验证集准确率达到 88.7%。
  • 总成本:约 ¥108 元。

六、技术应用拓展探索

在以上 NLP 和 CV 的基本场景之外,腾讯云 HAI 智算服务还能够满足更复杂的应用场景,例如分布式训练、多模态学习以及实时推理等。以下是更加深入的技术实践案例。


6.1 多 GPU 分布式训练:GPT 模型的高效微调

场景背景

基于 GPT 模型的文本生成任务(如对话生成、内容创作),需要在大规模数据集上进行微调。单 GPU 显存往往不足以支持完整的训练流程,而分布式训练能够显著提高效率。

数据准备与环境配置
  1. 选择 2 个 V100 GPU 实例,在 HAI 环境中搭建分布式训练环境。
  2. 安装 transformersdeepspeed 工具:
    pip install transformers deepspeed
    
分布式训练代码示例

以下代码展示了如何使用 DeepSpeed 实现 GPT-2 微调:

from transformers import GPT2LMHeadModel, GPT2Tokenizer
from datasets import load_dataset
import deepspeed# 加载数据集
dataset = load_dataset("wikitext", "wikitext-2-raw-v1", split='train')
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")# 数据预处理
def preprocess_function(examples):return tokenizer(examples["text"], padding="max_length", truncation=True, max_length=128)encoded_dataset = dataset.map(preprocess_function, batched=True)
encoded_dataset.set_format(type='torch', columns=['input_ids'])# 定义模型
model = GPT2LMHeadModel.from_pretrained("gpt2")
model = model.to('cuda')# DeepSpeed 配置
ds_config = {"train_micro_batch_size_per_gpu": 8,"gradient_accumulation_steps": 2,"fp16": {"enabled": True}
}# 包装模型
model_engine, optimizer, _, _ = deepspeed.initialize(model=model,model_parameters=model.parameters(),config=ds_config
)# 开始训练
model_engine.train()
train_loader = torch.utils.data.DataLoader(encoded_dataset, batch_size=8, shuffle=True)for epoch in range(3):for batch in train_loader:input_ids = batch['input_ids'].to('cuda')loss = model_engine(input_ids, labels=input_ids).lossmodel_engine.backward(loss)model_engine.step()
优势分析
  • 高效利用多 GPU:DeepSpeed 自动分配任务到多块 GPU,优化显存和计算资源。
  • FP16(半精度计算)支持:显著减少显存占用,加速训练速度。
  • 性能提升:相较单 GPU,分布式训练将任务完成时间缩短约 70%。

6.2 多模态学习:图文匹配任务

场景背景

在电商平台或社交媒体中,图文匹配任务是一个重要的应用场景。例如,判断商品图片与文本描述是否匹配。这需要同时处理图片和文本两种模态的数据。

模型选择

使用 CLIP(Contrastive Language–Image Pretraining)模型,同时输入图片和文本,实现特征对齐。

代码实现
from PIL import Image
import torch
from transformers import CLIPProcessor, CLIPModel# 加载 CLIP 模型和预处理工具
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32").to('cuda')
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")# 示例图片和文本
image = Image.open("example.jpg")
text = ["This is a picture of a cat", "This is a picture of a dog"]# 数据预处理
inputs = processor(text=text, images=image, return_tensors="pt", padding=True).to('cuda')# 前向计算
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image
probs = logits_per_image.softmax(dim=1)# 输出匹配概率
print("匹配概率:", probs)
优势分析
  • 多模态统一建模:CLIP 模型可以同时对文本和图像进行建模,适用于图文匹配、内容检索等场景。
  • GPU 加速推理:HAI 的高性能 GPU 能够快速处理大规模图像与文本数据。

6.3 实时推理服务部署:使用 FastAPI

场景背景

许多实际业务需要将模型部署为实时推理服务,例如在线推荐系统或智能客服。

环境准备

选择 T4 GPU 实例,并安装 FastAPI 和相关工具:

pip install fastapi uvicorn
服务端代码示例

以下代码展示了一个简单的在线推理服务:

from fastapi import FastAPI, Request
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch# 加载模型
model_name = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name).to('cuda')app = FastAPI()@app.post("/predict/")
async def predict(request: Request):data = await request.json()text = data['text']# 文本处理与推理inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True).to('cuda')outputs = model(**inputs)prediction = torch.argmax(outputs.logits, dim=-1).item()return {"prediction": prediction}
启动服务

运行以下命令启动服务:

uvicorn main:app --host 0.0.0.0 --port 8000
客户端测试

通过 HTTP 请求发送文本进行测试:

import requestsresponse = requests.post("http://127.0.0.1:8000/predict/", json={"text": "I love this product!"})
print(response.json())
优势分析
  • 低延迟推理:在 T4 GPU 上,单次推理延迟仅为 50 毫秒。
  • 灵活扩展:可以轻松扩展为分布式服务。

七、总结与展望

通过一系列测试用例可以看出,腾讯云 HAI 智算服务在高性能计算场景中表现优异,其核心优势包括:

  1. 高性能与灵活性:支持多 GPU 分布式训练、大模型微调及实时推理。
  2. 低成本与易用性:按需计费模式和预配置环境降低了开发门槛。
  3. 广泛适配性:满足 NLP、CV、多模态等多种任务需求。

未来展望

  • 引入更高端 GPU(如 A100、H100),进一步提升性能。
  • 完善开发者生态,例如增加更多 API 和框架支持。
  • 全球化部署与优化,为国际开发者提供更优质服务。

HAI 智算服务无疑是推动 AI 计算走向普及的重要力量,其广阔的应用潜力将随着技术迭代进一步释放!

相关文章:

深度测评腾讯云 HAI 智算服务:高性能 AI 计算的新标杆

本文 一、引言二、产品功能深度解析2.1 多样化的 GPU 配置选择2.2 预配置开发环境示例: 2.3 实时性能监控 三、核心技术特点与优势3.1 云端弹性扩展3.2 高性能计算架构 四、实际测试与代码案例4.1 NLP 案例:使用 BERT 进行情感分类数据集:IMD…...

MQ重复消费与消息顺序

如何避免消息重复消费 RocketMQ:给每个消息分配了一个MessageID。这个MessageID就可以作为消费者判断幂等的依据。这种方式不太建议,原因是在高并发场景下这个MessageID不保证全局唯一性。 最好由业务方创建一个与业务相关的全局唯一的ID来区分消息&am…...

应用商店双弹窗“APP在向用户申请权限时未同步告知用户申请此权限的理由”驳回uni-app应用上线的解决方法

目录 问题分析 解决方法 下载插件包:x-perm-apply-instr 将插件包导入进你项目中的uni_modules文件夹 在项目中的main.js文件中添加以下代码 完成 其它注意事项 addPermisionInterceptor 添加 uniApi 调用拦截 removePermisionInterceptor 移除 uniApi 调用…...

第 32 章 - Go语言 部署与运维

在Go语言的应用开发中,部署与运维是一个非常重要的环节。它不仅关系到应用能否顺利上线,还直接影响到应用的性能、安全性和可维护性。以下是根据您的需求整理的关于Go语言应用的打包和发布、容器化部署、监控和日志管理的相关内容。 1. 应用的打包和发布…...

噪杂环境离线语音通断器效果展示

介于之前的离线语音通断器模块的使用环境大部分为噪音比较小的环境中,部分客户对环境提出了更高的要求,能在噪杂、室外或者有一定的噪音的车内使用的模块开发需求被提高到了一个新的层次。最近找到某些能支持室外噪杂环境使用的芯片和模组,打…...

【django】扩展

1. Promise 1.1 对象和状态 是什么?是前端开发时js中的一个对象(包裹)。【对象】【异步请求】# 对象中有一个状态的值,status # 创建对象,不赋值,statuspendding let v1 new Promise(function(resolve, …...

逆向破解识别基础

找main函数: (使用OllyDbg软件) 方法一: 因为main函数需要三个参数,所以遇到三个参数加一个调用,那么可能是main函数。 方法二: 如果main函数中有字符串或者调用函数等一些唯一标识&#x…...

MFC 下拉框显示问题和控件自适应窗口大小

在mfc开发过程中,遇到了下拉框的两个问题,现在记录一下 1、把下拉框点开显示不全我放进去的多条文本 解决办法:把鼠标放到下拉框的倒三角去点一下,鼠标就会变成双向箭头,或者先选中一下下拉框再把鼠标移动到倒三角上去…...

Docker 的存储驱动及其优缺点

Docker 的存储驱动是容器文件系统的关键组成部分,决定了容器镜像和数据的存储方式。以下是常见的存储驱动及其优缺点: 1. OverlayFS/Overlay2 简介: Overlay 是现代 Linux 文件系统中一种高效的联合文件系统,Overlay2 是其改进版本&#xff0…...

单片机系统的性能指标有哪些?

单片机系统的性能指标涵盖了多个方面,这些指标共同决定了系统的整体性能。以下是单片机系统中常见的性能指标: 1. 处理器性能指标 1.1 时钟频率(Clock Frequency) 定义:处理器内核工作的时钟频率,通常以…...

波点音乐自动点击

波点音乐 import uiautomator2 as u2 import time import sys import os# 动态点击时间,打印剩余时间 def dynamic_sleep(seconds):wait_time secondsfor i in range(wait_time):print(f"Waiting... {wait_time - i} seconds remaining")sys.stdout.flu…...

HTTP 消息结构

HTTP 消息结构 1. 引言 超文本传输协议(HTTP)是互联网上应用最广泛的协议之一,它定义了客户端和服务器之间交换数据的格式和规则。HTTP消息是客户端和服务器之间通信的基本单位,包括请求消息和响应消息两种类型。本文将详细介绍HTTP消息的结构,包括其组成部分和格式。 …...

ESP32学习笔记_Bluetooth(1)——蓝牙技术与 BLE 通信机制简介

摘要(From AI): 这篇笔记详细讲解了蓝牙技术的分类、核心架构和通信流程,重点介绍了低功耗蓝牙(BLE)的协议栈、角色划分及连接机制,结合拓扑示例清晰阐述了蓝牙网络配置和操作过程 前言:本文档是本人在《ESP32-C3 物联…...

C0034.在Ubuntu中安装的Qt路径

Qt安装路径查询 在终端输入qmake -v如上中/usr/lib/x86_64-linux-gnu就是Qt的安装目录;...

jdbc学习——SQL注入

SQL注入介绍 SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。 用户登录的本质:执行下面的sql语句 select * from tb_user where username zhangsan and password 123; 发生sql注入的本质 解决SQL注入的方…...

JavaEE-线程安全专题

文章目录 线程安全概述线程安全引入线程不安全原因概述 线程是随机调度的 线程安全概述 线程安全引入 线程安全问题是整个多线程专题的最核心也是最重要的章节, 如果不理解线程的安全, 是无法写出正确的多线程的代码的, 我们之前所写的代码都是在单一的线程环境之下写出的 “…...

Android 设备使用 Wireshark 工具进行网络抓包

背景 电脑和手机连接同一网络,想使用wireshark抓包工具抓取Android手机网络日志,有以下两种连接方法: Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑,并在开发者模式中启用 USB 网络共享。 查看设备连接信…...

物联网无线局域网WiFi开发(一):WiFi智能家居解决方案

一、WiFi智能家居硬件设计 (一)WiFi智能家居硬件方案 (二)硬件选型方案 二、WiFi开发环境搭建 (一)开发环境搭建 虚拟机lubuntu VirtualBox下载地址:https://www.virtualbox.org/wiki/Downl…...

GMAN解读(论文+代码)

一、注意力机制 注意力机制与传统的卷积神经网络不同的是,前者擅长捕获全局依赖和长程关系,权重会动态调整。而后者对于所有特征都使用同一个卷积核。关于更多注意力机制内容,详见: 注意力机制、自注意力机制、多头注意力机制、通…...

速盾:ddos防御手段哪种比较好?高防cdn怎么样?

DDoS(分布式拒绝服务)攻击是一种威胁网络安全的常见攻击手段。为了保护网站和服务器免受DDoS攻击的影响,许多安全专家和公司开发了各种防御手段。在这篇文章中,我们将重点讨论一种常见的DDoS防御手段——高防CDN(内容分…...

Spring:AOP切入点表达式

对于AOP中切入点表达式,我们总共会学习三个内容,分别是语法格式、通配符和书写技巧。 语法格式 首先我们先要明确两个概念: 切入点:要进行增强的方法切入点表达式:要进行增强的方法的描述方式 对于切入点的描述,我们其实是有两中方式的&a…...

《文件操作》

一 . 文本文件和二进制文件 根据数据的组织形式,数据文件被分为了二进制文件和文本文件 数据在内存中是以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件。 如果要求在外存上以ASCII 码的形式存储,则需要再存…...

python特殊字符序列

字符 描述 \A 只匹配字符串的开始 \b 匹配一个单词边界 \B 匹配一个单词的非边界 \d 匹配任意十进制数字字符,等价于r[0-9] \D 匹配任意非十进制数字字符,等价于r[^0-9]’ \s 匹配任意空格字符(空格符、tab制表符、换…...

卷积神经网络(CNN)中的批量归一化层(Batch Normalization Layer)

批量归一化层(BatchNorm层),或简称为批量归一化(Batch Normalization),是深度学习中常用的一种技术,旨在加速神经网络的训练并提高收敛速度。 一、基本思想 为了让数据在训练过程中保持同一分布…...

LLaMA-Mesh: Unifying 3D Mesh Generation with Language Models 论文解读

目录 一、概述 二、相关工作 1、LLMs到多模态 2、3D对象生成 3、自回归的Mesh生成 三、LLaMA-Mesh 1、3D表示 2、预训练模型 3、有监督的微调数据集 4、数据集演示 四、实验 1、生成的多样性 2、不同模型text-to-Mesh的比较 3、通用语境的评估 一、概述 该论文首…...

【ESP32CAM+Android+C#上位机】ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输

前言: 本项目实现ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输。本项目包含有ESP32源码(arduino)、Android手机APP源码以及C#上位机源码,本文对其工程项目的配置使用进行讲解。实战开发,亲测无误。 AP模式,就是ESP32发出一个WIFI/热点提供给电…...

ESP-KeyBoard:基于 ESP32-S3 的三模客制化机械键盘

概述 在这个充满挑战与机遇的数字化时代,键盘已经成为我们日常学习、工作、娱乐生活必不可少的设备。而在众多键盘中,机械键盘,以其独特的触感、清脆的敲击音和经久耐用的特性,已经成为众多游戏玩家和电子工程师的首选。本文将为…...

28.UE5游戏框架,事件分发器,蓝图接口

3-3 虚幻游戏框架拆解,游戏规则基础_哔哩哔哩_bilibili 目录 1.游戏架构 2.事件分发器 2.1UI控件中的事件分发器 2.2Actor蓝图中的事件分发器 2.2.1动态决定Actor的分发事件 2.2.2父类中定义事件分发器,子类实现事件分发器 2.3组件蓝图中实现事件…...

Puppeteer 和 Cheerio 在 Node.js 中的应用

Puppeteer 和 Cheerio 在 Node.js 中的应用 引言 在现代 Web 开发中,自动化测试、数据抓取和页面分析是常见的需求。Node.js 提供了丰富的工具和库来满足这些需求。本文将介绍两个在 Node.js 中常用的库:Puppeteer 和 Cheerio,它们分别用于…...

Unity2D 关于N方向俯视角 中 角色移动朝向的问题

通常对俯视角2d游戏的角色移动我们使用简单2d混合树的方式,但是其不移动时的朝向该如何定义? 十分简单:移动和不移动之间形成逻辑自锁 详细说明思路就是再创建一个简单2d混合树 定义其N方向的idle 并用lastDirc二维向量保存玩家输入,当玩家输…...