【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();
}
以上代码定义了 Position
和 Velocity
两个组件,并编写了一个系统来更新位置信息。完整的示例代码可以在 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 核心功能
- 支持实时渲染和物理模拟
- 多平台支持,可在 Windows、Linux 和 MacOS 上运行
- 内置的编辑器工具
- 高度可定制化的用户界面系统#### 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游戏开发引擎:选择合适的工具 前言 随着Rust语言的不断发展,越来越多的游戏开发者开始将其视作构建游戏引擎和框架的理想选择。本文将介绍几个用于Rust语言的游戏引擎和框架,分别对其核心功能、使用场景、安装与配置以及API进行概览…...

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

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

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

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

vscode回退不显示了,不方便操作
一、后退前进按钮 顶部显示,方便调试 <—— ——> 文件-> 首选项 -> 设置->commandcenter->勾选 Window: Title Bar Style->custom 将native —>custom...

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

react入门到实战-day2-7.21
昨天晚上刚学完已经一点了,来不及写笔记,主要是想睡觉哈,所以今天补上,我发现效率还挺高的,今天重新做笔记,加固了昨天的知识点,要不以后都这样子哈,学完第二天再写哈,要…...

Springboot集成Elasticsearch High Level REST Client实现增删改查实战
获取源码🚩 需要完整代码资料,请一键三连后评论区留下邮箱,安排发送!!!🤖 什么是High Level REST Client? Elasticsearch 的 High Level REST Client 是一个用于与 Elasticsearch…...

2023河南萌新联赛第(二)场 南阳理工学院
A. 国际旅行Ⅰ 题目: 思路: 因为题意上每个国家可以相互到达,所以只需要排序,输出第k小的值就可以了。 AC代码: #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文件,可以简化Docker容器的管理。本文将介绍如何使用Docker Compose将一个上传的JAR文件打包成Docker镜像,并在容器中自动启动该应用程序。 一、准备工作…...

NET8部署Kestrel服务HTTPS深入解读TLS协议之Certificate证书
Certificate证书 Certificate称为数字证书。数字证书是一种证明身份的电子凭证,它包含一个公钥和一些身份信息,用于验证数字签名和加密通信。数字证书在网络通信、电子签名、认证授权等场景中都有广泛应用。其特征如下: 由权威机构颁发&…...

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

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

《代码大全》读书笔记-第Ⅰ部分 奠定基础
0.欢迎来到软件构建世界 什么是软件构件: 对于非正式及项目,会觉得罗列出来的这些活动太过于繁复。但是这些对于正式项目都是很有必要的(大部分人都没经历过,比如说我)。一般一些小公司主要也就是需求分析、编码、开发人员自测、集成测试这几…...

杰发科技Bootloader(1)—— Keil配置地址
IAP方式 BootLoader方式 UDSBoot方式 AC7801的地址分配 用户空间的的地址从8000000开始分配,大小是64页,即128K。 RAM地址从20000000开始 基于UDSboot调试-Boot 烧录Boot之后,ATClinkTool无法连接 用keil查看内存,地址到8005388…...

338. 比特位计数
338. 比特位计数 题目链接:338. 比特位计数 代码如下: 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前端——后端怎么发文件给前端?
首先,前端axios请求的responseType要设置为blob const service axios.create({baseURL: http://127.0.0.1/api,timeout: 5000});//向后端发送数据,后端根据这个数据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
文章目录 下载配置环境变量修改权限启动和关闭 下载 官网: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日在塞纳河畔正式开幕。即将亮相巴黎奥运会赛场的除了中国运动员之外,还有一批批中国制造企业为奥运会设计并制造的体育设备也将惊艳亮相,成为赛场上另一道亮丽的风景线。 在新时代的浪潮中,中国制造业坚…...

基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(一)|| RISC / 底层代码执行步骤 / 汇编指令
本篇文章基于韦东山老师讲课笔记和自己理解编写。 RISC ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computing),它所用的指令比较简单,有如下特点: ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 …...

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

解决R语言找不到系统库导致的报错
1、基本需知 1.1、系统库 系统库(System library)是一组预先编写和编译好的软件模块集合,用于支持操作系统的基本功能和提供一些常见的服务。这些库通常由操作系统或第三方开发者提供,并且在系统安装过程中被预装或者用户可以额…...

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

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访问百度网站实例
此篇文章为总结性,将pystest、selenium、allure结合起来 功能如下,web自动化,输入baidu网站,搜索“雷军”、打开网页中第一条内容 pytestsel.py如下: import time import re import allure import pytest from tools…...