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

【Rust光年纪】探索Rust游戏开发世界:六款引人注目的游戏引擎与框架

探索Rust游戏开发引擎:选择合适的工具

前言

随着Rust语言的不断发展,越来越多的游戏开发者开始将其视作构建游戏引擎和框架的理想选择。本文将介绍几个用于Rust语言的游戏引擎和框架,分别对其核心功能、使用场景、安装与配置以及API进行概览和比较。

欢迎订阅专栏:Rust光年纪

文章目录

  • 探索Rust游戏开发引擎:选择合适的工具
    • 前言
    • 1. amethyst:一个用于Rust语言的游戏引擎
      • 1.1 简介
        • 1.1.1 核心功能
        • 1.1.2 使用场景
      • 1.2 安装与配置
        • 1.2.1 安装指南
        • 1.2.2 基本配置
      • 1.3 API 概览
        • 1.3.1 游戏实体管理
        • 1.3.2 渲染系统
    • 2. bevy:一个用于Rust语言的数据驱动的游戏引擎
      • 2.1 简介
        • 2.1.1 核心功能
        • 2.1.2 使用场景
      • 2.2 安装与配置
        • 2.2.1 安装指南
        • 2.2.2 基本配置
      • 2.3 API 概览
        • 2.3.1 数据驱动设计
        • 2.3.2 实体组件系统
    • 3. Piston:一个用于Rust语言的模块化游戏引擎
      • 3.1 简介
        • 3.1.1 核心功能
        • 3.1.2 使用场景
      • 3.2 安装与配置
        • 3.2.1 安装指南
        • 3.2.2 基本配置
      • 3.3 API 概览
        • 3.3.1 事件处理
        • 3.3.2 图形绘制
        • 4.2.2 基本配置
      • 4.3 API 概览
        • 4.3.1 场景管理
        • 4.3.2 光照和材质
    • 5. ggez:一个用于Rust语言的轻量级游戏框架
      • 5.1 简介
        • 5.1.1 核心功能
        • 5.1.2 使用场景
      • 5.2 安装与配置
        • 5.2.1 安装指南
        • 5.2.2 基本配置
      • 5.3 API 概览
        • 5.3.1 窗口管理
        • 5.3.2 输入处理
    • 6. specs:一个用于Rust语言的实体-组件系统
      • 6.1 简介
        • 6.1.1 核心功能
        • 6.1.2 使用场景
      • 6.2 安装与配置
        • 6.2.1 安装指南
        • 6.2.2 基本配置
      • 6.3 API 概览
        • 6.3.1 实体创建和管理
        • 6.3.2 组件添加和处理
    • 总结

1. amethyst:一个用于Rust语言的游戏引擎

1.1 简介

Amethyst是一个用于Rust语言的数据驱动游戏引擎,它提供了丰富的工具和功能来开发高性能的游戏。

1.1.1 核心功能
  • 强大的实体组件系统
  • 灵活的渲染管道
  • 内置的2D和3D物理引擎
  • 支持多平台部署
1.1.2 使用场景

Amethyst适用于开发各种类型的游戏,包括2D和3D游戏以及虚拟现实应用程序。

1.2 安装与配置

1.2.1 安装指南

首先需要安装Rust编程语言的工具链,然后可以使用Cargo(Rust的包管理器)来创建一个新的Amethyst项目。具体安装步骤可以参考官方安装指南。

1.2.2 基本配置

创建一个新的Amethyst项目后,可以通过Cargo.toml文件添加amethyst依赖:

[dependencies]
amethyst = "0.15"

1.3 API 概览

1.3.1 游戏实体管理

Amethyst的实体组件系统允许开发者轻松地创建和管理游戏实体。以下是一个简单的示例代码:

use amethyst::{ecs::{Component, DenseVecStorage, Entity, World},prelude::*,
};struct Position {x: f32,y: f32,
}impl Component for Position {type Storage = DenseVecStorage<Self>;
}fn main() -> amethyst::Result<()> {let mut world = World::new();let entity = world.create_entity().with(Position { x: 0.0, y: 0.0 }).build();Ok(())
}
1.3.2 渲染系统

Amethyst内置了强大的渲染系统,可以轻松地处理2D和3D渲染。以下是一个简单的2D渲染示例:

use amethyst::{prelude::*,renderer::{RenderingBundle, RenderToWindow, types::DefaultBackend},
};fn main() -> amethyst::Result<()> {amethyst::start_logger(Default::default());let game_data = GameDataBuilder::default();let mut game = Application::build("./", ExampleState)?.build(game_data)?;game.run();Ok(())
}

更多关于Amethyst的API和使用方法,请参阅官方文档。

2. bevy:一个用于Rust语言的数据驱动的游戏引擎

2.1 简介

Bevy 是一个使用 Rust 语言开发的数据驱动游戏引擎,它旨在提供高性能、易用和灵活的游戏开发体验。

2.1.1 核心功能
  • 数据驱动设计
  • 实体组件系统
  • 支持并行处理
  • 灵活的插件系统
2.1.2 使用场景

Bevy 适用于开发2D和3D游戏,尤其适合需要高性能和并行处理的游戏项目。

2.2 安装与配置

2.2.1 安装指南

安装 Rust 编程语言的工具链,然后通过 Cargo 包管理器添加 Bevy 依赖即可开始使用 Bevy。

cargo new my_game
cd my_game

编辑 Cargo.toml 文件,并添加 Bevy 依赖:

[dependencies]
bevy = "0.5"
2.2.2 基本配置

在项目根目录创建 main.rs 文件,并编写基本的 Bevy 配置代码:

use bevy::prelude::*;fn main() {App::build().add_plugins(DefaultPlugins).run();
}

2.3 API 概览

2.3.1 数据驱动设计

Bevy 的数据驱动设计使得系统更容易进行并行处理,提高了游戏的性能和扩展性。通过 ECS(Entity Component System)架构,Bevy 可以轻松管理游戏中的实体和组件,使得游戏开发更加灵活。

2.3.2 实体组件系统

Bevy 提供了强大的实体组件系统,通过简单的 Rust 结构体和注解就可以定义游戏中的实体和组件。以下是一个简单的示例:

use bevy::prelude::*;struct Position(Vec2);
struct Velocity(Vec2);fn update_positions(mut query: Query<(&mut Position, &Velocity)>) {for (mut position, velocity) in query.iter_mut() {position.0 += velocity.0;}
}fn main() {App::build().add_system(update_positions.system()).run();
}

以上代码定义了 PositionVelocity 两个组件,并编写了一个系统来更新位置信息。完整的示例代码可以在 Bevy 的官方文档中找到:Bevy 示例

3. Piston:一个用于Rust语言的模块化游戏引擎

Piston 是一个适用于 Rust 编程语言的游戏引擎,它提供了丰富的功能和模块化的设计,使得开发者可以灵活地构建游戏和交互式应用程序。

3.1 简介

3.1.1 核心功能

Piston 游戏引擎的核心功能包括:

  • 提供 2D 和 3D 图形渲染功能
  • 处理用户输入和事件
  • 支持音频播放
  • 内置游戏物理引擎
  • 支持图像处理和纹理管理
  • 模块化的设计,便于扩展和定制
3.1.2 使用场景

Piston 游戏引擎适用于开发各种类型的游戏和交互式应用程序,包括但不限于:

  • 2D 和 3D 游戏
  • 模拟器和仿真应用
  • 数据可视化工具
  • 创意编程项目

3.2 安装与配置

3.2.1 安装指南

你可以通过 Cargo,在 Rust 的包管理器中,将 Piston 引入到你的项目中。首先,在 Cargo.toml 文件中添加 Piston 的依赖:

[dependencies]
piston = "0.46"

然后在代码中引入 Piston 库:

extern crate piston;

更多关于安装和更新 Piston 的信息,你可以访问 Piston GitHub 页面。

3.2.2 基本配置

在使用 Piston 引擎前,你需要确保 Rust 环境已经配置好。如果你还没有 Rust 开发环境,你可以按照官方文档 Getting Started 来进行安装和配置。

3.3 API 概览

3.3.1 事件处理

Piston 提供了丰富的事件处理机制,可以轻松地管理用户输入和系统事件。下面是一个简单的示例来捕获并处理鼠标点击事件:

extern crate piston_window;use piston_window::*;fn main() {let mut window: PistonWindow = WindowSettings::new("Hello Piston!", [640, 480]).exit_on_esc(true).build().unwrap();while let Some(event) = window.next() {if let Some(Button::Mouse(MouseButton::Left)) = event.press_args() {println!("Left mouse button pressed!");}}
}

上述代码创建了一个窗口,并在其中捕获并处理了鼠标左键的点击事件。更多关于事件处理的信息,你可以查看 Piston Event Loop。

3.3.2 图形绘制

Piston 提供了强大的图形绘制功能,支持2D和3D图形渲染。下面是一个简单的示例来创建一个基本的矩形并绘制到窗口中:

extern crate piston_window;use piston_window::*;fn main() {let mut window: PistonWindow = WindowSettings::new("Hello Piston!", [640, 480]).exit_on_esc(true).build().unwrap();while let Some(event) = window.next() {window.draw_2d(&event, |c, g, _| {clear([1.0; 4], g); // 清空窗口为白色rectangle([1.0, 0.0, 0.0, 1.0], // RGBA颜色[100.0, 100.0, 50.0
## 4. rg3d:一个用于Rust语言的渲染引擎### 4.1 简介
rg3d 是一个基于 Rust 语言的现代化、高性能的渲染引擎,它提供了丰富的功能和灵活的使用场景,适用于游戏开发和实时应用程序的构建。#### 4.1.1 核心功能
- 支持实时渲染和物理模拟
- 多平台支持,可在 WindowsLinuxMacOS 上运行
- 内置的编辑器工具
- 高度可定制化的用户界面系统#### 4.1.2 使用场景
rg3d 可以用于开发各种类型的游戏和虚拟现实应用程序,包括动作游戏、模拟器、交互式应用等。### 4.2 安装与配置
#### 4.2.1 安装指南
你可以通过 Cargo,在你的 Cargo.toml 文件中添加以下依赖来安装 rg3d:```toml
[dependencies]
rg3d = "0.21"

更多详细的安装说明,请参考 rg3d 官方文档。

4.2.2 基本配置

在开始使用 rg3d 之前,你需要准备好 Rust 开发环境。同时,确保你的项目可以链接到 OpenGL 和 OpenAL 库。

4.3 API 概览

4.3.1 场景管理

rg3d 提供了强大的场景管理功能,允许你创建和管理游戏中的不同场景。下面是一个简单的例子,演示了如何创建一个场景并向其中添加一个立方体:

use rg3d::engine::framework::{Framework, GameEngine};
use rg3d::engine::resource_manager::ResourceManager;
use rg3d::scene::base::BaseBuilder;fn main() {// 创建游戏引擎let mut engine = GameEngine::new_default("example");// 创建资源管理器let mut resource_manager = ResourceManager::new(engine.resource_manager.clone());// 创建场景let scene = BaseBuilder::new().with_children(&[BaseBuilder::new().build()]).build(&mut engine);// 向场景中添加立方体BaseBuilder::new().with_local_transform(Default::default(),Default::default(),cgmath::Vector3::new(0.0, 0.0, 0.0),).build(&mut engine);// 运行引擎Framework::<()>::new().run(engine);
}
4.3.2 光照和材质

rg3d 支持复杂的光照和材质效果。以下示例演示了如何创建一个带有纹理和法线贴图的材质,并将其应用于立方体:

use rg3d::material::Material;// 创建一个标准材质
let mut material = Material {albedo: Some(resource_manager.request_texture("path_to_albedo_texture.png")),normal: Some(resource_manager.request_texture("path_to_normal_texture.png")),..Default::default()
};// 将材质应用于立方体
cube.set_material(material);

这只是 rg3d 引擎所提供功能的一小部分,更多信息请查阅 rg3d 官方文档。

5. ggez:一个用于Rust语言的轻量级游戏框架

5.1 简介

ggez 是一个基于 Rust 语言的轻量级游戏框架,旨在提供简单易用的方式来创建2D游戏。它封装了许多常见的游戏开发任务,如处理输入、渲染图形和管理资源等。

5.1.1 核心功能
  • 提供简洁的 API 接口,方便快速搭建游戏原型
  • 支持跨平台开发,可在 Windows、macOS 和 Linux 上运行
  • 集成了图形渲染器和事件处理器,降低开发者的工作量
5.1.2 使用场景

ggez 适用于希望使用 Rust 语言开发2D游戏的开发者。由于其简单易用的特点,也可以用于教育和学习目的。

5.2 安装与配置

5.2.1 安装指南

你可以通过 Cargo(Rust 的包管理工具)来安装 ggez。在项目的 Cargo.toml 文件中添加以下依赖:

[dependencies]
ggez = "0.6"

更多安装指南请参考 ggez 官方文档

5.2.2 基本配置

为了开始使用 ggez,你需要创建一个窗口和一个事件循环。下面是一个简单的例子:

use ggez::{event, ContextBuilder, GameResult};
use ggez::graphics;struct MainState {}impl MainState {fn new() -> Self {MainState {}}
}impl event::EventHandler for MainState {fn update(&mut self, _ctx: &mut ggez::Context) -> GameResult<()> {Ok(())}fn draw(&mut self, ctx: &mut ggez::Context) -> GameResult<()> {graphics::clear(ctx, [0.1, 0.2, 0.3, 1.0].into());// 绘制代码graphics::present(ctx)}
}fn main() -> GameResult {let (ctx, event_loop) = ContextBuilder::new("my_game", "author").build()?;let game = MainState::new();event::run(ctx, event_loop, game)
}

5.3 API 概览

5.3.1 窗口管理

ggez 提供了窗口管理相关的功能,包括创建窗口、设置窗口标题和大小等。通过 ContextBuilder 可以对窗口进行配置,例如:

let (ctx, event_loop) = ggez::ContextBuilder::new("my_game", "author").window_setup(ggez::conf::WindowSetup::default().title("My Awesome Game")).window_mode(ggez::conf::WindowMode::default().dimensions(800.0, 600.0)).build()?;
5.3.2 输入处理

ggez 支持处理鼠标、键盘和游戏手柄等输入设备。你可以通过 event::EventHandler trait 来处理输入事件,例如:

impl event::EventHandler for MainState {fn key_down_event(&mut self,ctx: &mut ggez::Context,keycode: KeyCode,_keymods: KeyMods,repeat: bool,) {match keycode {KeyCode::Space => {// 处理空格键按下事件}_ => (),};}
}

更多关于 ggez API 的信息,请查阅 ggez 官方文档。

6. specs:一个用于Rust语言的实体-组件系统

6.1 简介

specs 是一个适用于 Rust 语言的实体-组件系统(Entity-Component System,ECS),它旨在提供高性能和灵活性。通过 specs,开发者可以轻松地构建游戏引擎中的实体和组件,并进行高效的管理。

6.1.1 核心功能

specs 的核心功能包括:

  • 实体创建和管理
  • 组件添加和处理
  • 系统处理
6.1.2 使用场景

specs 可以广泛应用于游戏开发领域,尤其适用于需要大量动态实体和组件交互的场景。此外,specs 还可以用于模拟器、数据驱动的应用程序等领域。

6.2 安装与配置

6.2.1 安装指南

你可以在 Cargo.toml 文件中添加 specs 依赖:

[dependencies]
specs = "0.16"

然后使用 cargo build 命令来安装 specs。

更多安装信息请参考官方文档:specs 安装与配置

6.2.2 基本配置

基本配置部分内容省略。

6.3 API 概览

6.3.1 实体创建和管理
use specs::{World, Entity, Component, VecStorage, ReadStorage, WriteStorage, System, Read};struct Position {x: f32,y: f32,
}impl Component for Position {type Storage = VecStorage<Self>;
}fn main() {let mut world = World::new();world.register::<Position>();let entity = world.create_entity().with(Position { x: 1.0, y: 2.0 }).build();
}
6.3.2 组件添加和处理
struct Velocity {x: f32,y: f32,
}impl Component for Velocity {type Storage = VecStorage<Self>;
}struct MovementSystem;impl<'a> System<'a> for MovementSystem {type SystemData = (ReadStorage<'a, Velocity>,WriteStorage<'a, Position>,);fn run(&mut self, (velocities, mut positions): Self::SystemData) {for (velocity, position) in (&velocities, &mut positions).join() {position.x += velocity.x;position.y += velocity.y;}}
}

更多 API 信息请参考官方文档:specs API

以上是 specs 游戏引擎的简要介绍、安装配置以及 API 概览。希望对你有所帮助!

总结

Rust语言的游戏开发生态正在迅速成长,而amethyst, bevy, Piston, rg3d, ggez和specs等游戏引擎和框架正是这一进程中的重要组成部分。每个工具都有其独特之处,如amethyst强调并行性和数据驱动,bevy采用ECS架构,Piston模块化设计灵活易用,rg3d专注于渲染等。通过对这些工具的深入了解,开发者可以更好地选择适合自己项目需求的工具,加速游戏开发过程,提升开发体验。

相关文章:

【Rust光年纪】探索Rust游戏开发世界:六款引人注目的游戏引擎与框架

探索Rust游戏开发引擎&#xff1a;选择合适的工具 前言 随着Rust语言的不断发展&#xff0c;越来越多的游戏开发者开始将其视作构建游戏引擎和框架的理想选择。本文将介绍几个用于Rust语言的游戏引擎和框架&#xff0c;分别对其核心功能、使用场景、安装与配置以及API进行概览…...

从数据时代到智能时代,星环科技信雅达联合发布金融全栈解决方案

近年来&#xff0c;星环科技与信雅达在金融行业的多个关键领域展开了广泛而深入的合作&#xff0c;推出了一系列面向金融科技领域的联合解决方案。此次合作基于星环科技在大数据、人工智能和云计算领域的先进技术&#xff0c;以及信雅达在金融领域的深厚积累&#xff0c;围绕数…...

自定义维度映射:Kylin Cube设计的高级玩法

自定义维度映射&#xff1a;Kylin Cube设计的高级玩法 在数据仓库领域&#xff0c;Apache Kylin以其高性能的分析能力而闻名。Kylin通过构建多维数据立方体&#xff08;Cube&#xff09;来实现对大数据集的快速查询。Cube设计中的维度映射是优化查询性能的关键环节。本文将探讨…...

c17 新特性 字面量,变量,函数,隐藏转换等

导论 c17新特性引入了许多新的语法&#xff0c;这些语法特性更加清晰&#xff0c;不像传统语法&#xff0c;语义飘忽不定&#xff0c;比如‘a’你根本不知道是宽字符还是UTF-8 字符。以及测试i i&#xff0c;最后结果到底是多少。这种问题很大情况是根据编译器的优化进行猜测&a…...

git操作的一些备忘录

1.回退本地合并 git merge --abort 2.撤销上一次的提交 方法一&#xff1a;(已经提交到git线上仓库了&#xff0c;git reset操作&#xff0c;会把之前提交的都删除&#xff0c;感觉有点危险) 想要让Git回退历史&#xff0c;有以下步骤&#xff1a; 使用git log命令&#xff0c…...

vscode回退不显示了,不方便操作

一、后退前进按钮 顶部显示&#xff0c;方便调试 <—— ——> 文件-> 首选项 -> 设置->commandcenter->勾选 Window: Title Bar Style->custom 将native —>custom...

常见的CSS属性(一)——字体、文本、边框、内边距、外边距、背景、行高、圆角、透明度、颜色值

一、字体 二、文本 三、边框 四、外边距 五、内边距 六、背景 七、行高 八、圆角 九、透明度 九、颜色值 元素的继承性是指给父元素设置了某些属性&#xff0c;子元素或后代元素也会有作用。 一、字体 “font-*”是字体相关的属性&#xff0c;具有继承性。代码如下&a…...

react入门到实战-day2-7.21

昨天晚上刚学完已经一点了&#xff0c;来不及写笔记&#xff0c;主要是想睡觉哈&#xff0c;所以今天补上&#xff0c;我发现效率还挺高的&#xff0c;今天重新做笔记&#xff0c;加固了昨天的知识点&#xff0c;要不以后都这样子哈&#xff0c;学完第二天再写哈&#xff0c;要…...

Springboot集成Elasticsearch High Level REST Client实现增删改查实战

获取源码&#x1f6a9; 需要完整代码资料&#xff0c;请一键三连后评论区留下邮箱&#xff0c;安排发送&#xff01;&#xff01;&#xff01;&#x1f916; 什么是High Level REST Client&#xff1f; Elasticsearch 的 High Level REST Client 是一个用于与 Elasticsearch…...

2023河南萌新联赛第(二)场 南阳理工学院

A. 国际旅行Ⅰ 题目&#xff1a; 思路&#xff1a; 因为题意上每个国家可以相互到达&#xff0c;所以只需要排序&#xff0c;输出第k小的值就可以了。 AC代码&#xff1a; #include<bits/stdc.h> #define int long long #define IOS ios::sync_with_stdio(0);cin.tie…...

使用Docker Compose给自己上传的JAR打包成镜像并自动启动容器

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过编写一个docker-compose.yml文件&#xff0c;可以简化Docker容器的管理。本文将介绍如何使用Docker Compose将一个上传的JAR文件打包成Docker镜像&#xff0c;并在容器中自动启动该应用程序。 一、准备工作…...

NET8部署Kestrel服务HTTPS深入解读TLS协议之Certificate证书

Certificate证书 Certificate称为数字证书。数字证书是一种证明身份的电子凭证&#xff0c;它包含一个公钥和一些身份信息&#xff0c;用于验证数字签名和加密通信。数字证书在网络通信、电子签名、认证授权等场景中都有广泛应用。其特征如下&#xff1a; 由权威机构颁发&…...

DML数据库的数据类型

DML 用于改变数据表中的数据的操作语言。 包括INSERT&#xff08;将数据插入到数据表中&#xff09;,UPDATE&#xff08;更新表中已经存在的数据&#xff09;,DELETE&#xff08;删除表中已经存在的数据&#xff09; INSERT 用法 INSERT INTO 表名&#xff08;字段1&#x…...

@RequestParam和@PathVariable 处理 HTTP 请求参数的注解

RequestParam 请求参数 可解析前端get请求路径后以问号拼接的参数,查询参数是 URL 后面的问号 (?) 后跟的一系列键值对,RequestParam 可以设置参数是否是必需的&#xff08;使用 required 属性&#xff09; GetMapping("/users") public String getUsers(RequestPar…...

《代码大全》读书笔记-第Ⅰ部分 奠定基础

0.欢迎来到软件构建世界 什么是软件构件&#xff1a; 对于非正式及项目&#xff0c;会觉得罗列出来的这些活动太过于繁复。但是这些对于正式项目都是很有必要的(大部分人都没经历过&#xff0c;比如说我)。一般一些小公司主要也就是需求分析、编码、开发人员自测、集成测试这几…...

杰发科技Bootloader(1)—— Keil配置地址

IAP方式 BootLoader方式 UDSBoot方式 AC7801的地址分配 用户空间的的地址从8000000开始分配&#xff0c;大小是64页&#xff0c;即128K。 RAM地址从20000000开始 基于UDSboot调试-Boot 烧录Boot之后&#xff0c;ATClinkTool无法连接 用keil查看内存&#xff0c;地址到8005388…...

338. 比特位计数

338. 比特位计数 题目链接&#xff1a;338. 比特位计数 代码如下&#xff1a; class Solution { public:vector<int> countBits(int n) {vector<int> res(n 1, 0);for (int i 1; i < n; i){if (i % 2 1) { res[i] res[i - 1] 1; }else { res[i] res[i …...

flask后端+vue前端——后端怎么发文件给前端?

首先&#xff0c;前端axios请求的responseType要设置为blob const service axios.create({baseURL: http://127.0.0.1/api,timeout: 5000});//向后端发送数据&#xff0c;后端根据这个数据data生成文件返回send_coordinate(data){return service.post(/,data,{responseType: …...

计算机毕业设计django+hadoop+scrapy租房可视化 租房推荐系统 租房大屏可视化 租房爬虫 spark 58同城租房爬虫 房源推荐系统

python scrapy bootstrap jquery css javascript html 租房信息数据展示 租房地址数量分布 租房类型统计 租房价格统计分析 租房面积分析 房屋朝向分析 房屋户型平均价格统计分析 房屋楼层统计分析 房屋楼层与价格统计分析 房屋地址与价格统计分析 房屋相关信息词云展示 租房…...

【Tomcat】Mac M3 Pro安装Tomcat7

文章目录 下载配置环境变量修改权限启动和关闭 下载 官网&#xff1a;https://tomcat.apache.org/ cd ~/Library tar -zxvf /Users/用户名/Downloads/apache-tomcat-7.0.99.tar.gz mv apache-tomcat-7.0.99 ~/Library/tomcat配置环境变量 vi ~/.bash_profileexport TOMCAT…...

Spring Boot(八十二):SpringBoot通过rsa实现API加密

项目中使用RSA加密方式对API接口返回的数据加密,让API数据更加安全。别人无法对提供的数据进行破解。Spring Boot接口加密,可以对返回值、参数值通过注解的方式自动加解密 。 下面开始代码演示 1 接口加密 1.1 新建一个springboot项目 1.2 添加依赖 <dependency>&l…...

巴黎奥运启幕 PLM系统助力中国制造闪耀全球

2024巴黎奥运会将于法国当地时间7月26日在塞纳河畔正式开幕。即将亮相巴黎奥运会赛场的除了中国运动员之外&#xff0c;还有一批批中国制造企业为奥运会设计并制造的体育设备也将惊艳亮相&#xff0c;成为赛场上另一道亮丽的风景线。 在新时代的浪潮中&#xff0c;中国制造业坚…...

基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(一)|| RISC / 底层代码执行步骤 / 汇编指令

本篇文章基于韦东山老师讲课笔记和自己理解编写。 RISC ARM芯片属于精简指令集计算机(RISC&#xff1a;Reduced Instruction Set Computing)&#xff0c;它所用的指令比较简单&#xff0c;有如下特点&#xff1a; ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 …...

【JavaScript】01数组原型对象的最后一个元素、计数器

题目一&#xff1a;数组原型对象的最后一个元素 请你编写一段代码实现一个数组方法&#xff0c;使任何数组都可以调用 array.last() 方法&#xff0c;这个方法将返回数组最后一个元素。如果数组中没有元素&#xff0c;则返回 -1 。 你可以假设数组是 JSON.parse 的输出结果。…...

解决R语言找不到系统库导致的报错

1、基本需知 1.1、系统库 系统库&#xff08;System library&#xff09;是一组预先编写和编译好的软件模块集合&#xff0c;用于支持操作系统的基本功能和提供一些常见的服务。这些库通常由操作系统或第三方开发者提供&#xff0c;并且在系统安装过程中被预装或者用户可以额…...

Java高并发理论基础

并发级别 由于临界区的存在&#xff0c;多线程之间的并发必须受到控制。根据控制并发的策略&#xff0c;我们可以把并发的级别分为 阻塞、无饥饿、无障碍、无锁、无等待 几种。 阻塞 一个线程是阻塞的&#xff0c;那么在其他线程释放资源之前&#xff0c;当前线程无法继续执…...

Spring事件机制

文章目录 一、Spring事件二、实现Spring事件1、自定义事件2、事件监听器2.1 实现ApplicationListener接口2.2 EventListener2.3 TransactionalEventListener 3、事件发布4、异步使用 三、EventBus1、事件模式2、EventBus三要素3、同步事件3.1 定义事件类3.2 定义事件监听3.3 测…...

vue+canvas音频可视化

1.代码 <template><div class"subGuide"><canvas id"canvas"></canvas><br><audio id"audio" src"./audio.mp3" controls></audio></div> </template><script> export…...

俊昭stm32笔记

stm32——中断优先级 stm32——创建基础工程模板stm32——创建基础工程模板-CSDN博客 stm32——MCU启动方式stm32——MCU启动方式_stm32调试时程序启动方式-CSDN博客 stm32——串口stm32——串口_stm32 串口-CSDN博客 stm32——lcd液晶显示stm32——lcd液晶显示-CSDN博客...

W30-python03-pytest+selenium+allure访问百度网站实例

此篇文章为总结性&#xff0c;将pystest、selenium、allure结合起来 功能如下&#xff0c;web自动化&#xff0c;输入baidu网站&#xff0c;搜索“雷军”、打开网页中第一条内容 pytestsel.py如下&#xff1a; import time import re import allure import pytest from tools…...

如何在 Debian 8 上安装和使用 PostgreSQL 9.4

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 关系型数据库是满足多种需求的数据组织的基石。它们支持从在线购物到火箭发射等各种应用。PostgreSQL 是一种历史悠久但仍然活跃的…...

【微信小程序】微信小程序设置本地背景图片在真机无法显示的解决方案

微信小程序设置本地背景图片在真机无法显示的解决方案 在开发微信小程序时&#xff0c;很多开发者会遇到一个常见的问题&#xff1a;在调试环境中设置本地背景图片可以正常显示&#xff0c;但在真机上却无法显示。本文将详细探讨这一问题的原因&#xff0c;并提供三种解决方案…...

Arthas在线诊断案例实战整理

Arthas - Java 应用诊断利器 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法…...

使用 XRDP 远程linux主机

一、简介 XRDP是一个开源的远程桌面协议&#xff08;Remote Desktop Protocol,RDP&#xff09;服务器&#xff0c;采用的是标准的RDP。 官网地址&#xff1a;https://www.xrdp.org/ github地址&#xff1a; https://github.com/neutrinolabs/xrdp/releases XRDP也是C/S架构&…...

学习小型gpt源码(自用)

数据集构建_哔哩哔哩_bilibili &#xff08;b站上有一系列课&#xff0c;从数据处理到模型构建和训练使用&#xff09; 什么是batch&#xff1f; 为什么一个batch内的句子要一样长&#xff1f; 不同batch的长度可以不一样&#xff0c;但是同一个batch内长度一样&#xff01;…...

@Transactional使用的注意事项

在项目中涉及到CRUD操作时&#xff0c;一般都会在方法上添加该注解&#xff0c;以为加上Transactional&#xff0c;Spring就可以自动帮我们进行事务的开启、提交 有一个很多人都会犯的误区&#xff1a; 将Spring事务与Transactional划上了等号&#xff0c;只要有数据库相关操作…...

快手可灵视频生成大模型全方位测评

快手视频生成大模型“可灵”&#xff08;Kling&#xff09;&#xff0c;是全球首个真正用户可用的视频生成大模型&#xff0c;自面世以来&#xff0c;凭借其无与伦比的视频生成效果&#xff0c;在全球范围内赢得了用户的热烈追捧与高度评价。截至目前&#xff0c;申请体验其内测…...

【JavaScript】`Map` 数据结构

文章目录 一、Map 的基本概念二、常见操作三、与对象的对比四、实际应用场景 在现代 JavaScript 中&#xff0c;Map 是一种非常重要且强大的数据结构。与传统的对象&#xff08;Object&#xff09;不同&#xff0c;Map 允许您使用各种类型的值作为键&#xff0c;不限于字符串或…...

Ubuntu22.04使用NVM安装多版本Node.js和版本切换

Fabric官方目前支持Node.js开发区块链应用&#xff0c;建议使用Node长期支持版本&#xff08;LTS&#xff09;。 建议使用NVM安装Node.js&#xff0c;NVM可以帮助我们方便的在Node的不同版本之间进行切换&#xff0c;这样我们就可以同时工作在不同的项目上。 下面是安装的脚本…...

基于C51和OLED12864实现Goole小恐龙

在数字娱乐领域&#xff0c;Google小恐龙&#xff08;T-Rex Runner&#xff09;以其简单而上瘾的游戏机制赢得了广泛的关注和喜爱。这款内置于Chrome浏览器的离线小游戏&#xff0c;不仅为用户带来了乐趣&#xff0c;也激发了开发者们对其进行各种创新和扩展的灵感。本文将介绍…...

【Docker】CentOS7环境下的安装

环境展示 安装 配置仓库 sudo yum install -y yum-utils # docker官方key文件下载 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 建议使用阿里云key文件下载 sudo yum-config-manager --add-repo https://mirrors.aliyun.…...

浏览器的最大并发数(http1.1)

HTTP/1.1&#xff1a;每个资源请求通常需要单独的TCP连接&#xff0c;尽管支持Keep-Alive机制&#xff0c;允许在同一个TCP连接上连续发送多个请求。但通常浏览器限制并发TCP连接数&#xff08;例如&#xff0c;每个域名最多6个并发连接&#xff09;。 HTTP/2&#xff1a;引入…...

Android 开发中px、dpi 和 dp三个单位的介绍

Android 开发中px、dpi 和 dp三个单位的介绍 在 Android 开发中&#xff0c;px、dpi 和 dp 是用来描述屏幕尺寸和密度的单位&#xff0c;它们在设计和开发中有着不同的作用和用途。 1. px&#xff08;像素&#xff09; 定义&#xff1a; px 表示屏幕上的一个像素点&#xff0c…...

zookeeper开启SASL权限认证

目录 一、SASL介绍 二、使用 SASL 进行身份验证 2.1 服务器到服务器的身份验证 2.2 客户端到服务器身份验证 三、验证功能 一、SASL介绍 默认情况下&#xff0c;ZooKeeper 不使用任何形式的身份验证并允许匿名连接。但是&#xff0c;它支持 Java 身份验证与授权服务(JAAS)…...

mysql一个小问题引发的思考-mysql类型转换-查询缓存 及 MYSQL查询缓存以及自动选择不使用查询缓存的情况

一、mysql一个小问题引发的思考-mysql类型转换-查询缓存 最近在做的一个项目中有一个SQL语句发现点问题&#xff0c;大概如下&#xff1a; select * from table where cid0 or find_in_set(1, cid); 数据表中的字段cid是字符串类型&#xff0c;原来的后端同学未提过此字段还能是…...

css更改图片颜色

css更改图片颜色&#xff0c;比较时候颜色单一的图片&#xff0c;比如logo之类的 css中的 filter 属性定义元素&#xff08;通常是 <img>&#xff09;的视觉效果&#xff08;如模糊和饱和度&#xff09; img{ -webkit-filter: invert(51%) sepia(94%) saturate(6433%) h…...

通过POST请求往Elastic批量插入数据

文章目录 引言I 请求文档请求参数请求例子引言 调试工具:Apifox 需求: 向Elasticsearch中的’test_index’索引批量插入文档 情况认证: Basic Auth 在 Header 添加参数 Authorization,其值为在 Basic 之后拼接空格,以及经过 Base64 编码的 {{Username}}:{{Password}} 示…...

JAW:一款针对客户端JavaScript的图形化安全分析框架

关于JAW JAW是一款针对客户端JavaScript的图形化安全分析框架&#xff0c;该工具基于esprima解析器和EsTree SpiderMonkey Spec实现其功能&#xff0c;广大研究人员可以使用该工具分析Web应用程序和基于JavaScript的客户端程序的安全性。 工具特性 1、动态可扩展的框架&#x…...

错误解决 error CS0117: ‘Buffer‘ does not contain a definition for ‘BlockCopy‘

Unity 2022.3.9f1 导入 Runtime OBJ Importer 后出现&#xff1a; error CS0117: ‘Buffer’ does not contain a definition for ‘BlockCopy’ 解决办法&#xff1a; 源代码&#xff1a; int DDS_HEADER_SIZE 128; byte[] dxtBytes new byte[ddsBytes.Length - DDS_HEAD…...

ICMPv6与DHCPv6之网络工程师软考中级

ICMPv6概述 ICMPv6是IPv6的基础协议之一。 在IPv6报文头部中&#xff0c;Next Header字段值为58则对应为ICMPv6报文。 ICMPv6报文用于通告相关信息或错误。 ICMPv6报文被广泛应用于其它协议中&#xff0c;包括NDP、Path MTU发现机制等 ICMPv6控制着IPv6中的地址自动配置、地址…...