openGL学习(VAO和VBO)
理论
VBO
void prepare()
{//创建一个VBO,但是还没有分配显存GLuint vbo = 0;GL_CALL( glGenBuffers(1, &vbo));cout << "vbo = " << vbo << endl;//销毁一个VBOGL_CALL(glDeleteBuffers(1, &vbo));cout << "delete vbo = " << vbo << endl;//创建多个VBOGLuint vbos[] = { 0,0,0 };GL_CALL(glGenBuffers(3,vbos));//销毁多个VBOGL_CALL(glDeleteBuffers(3, vbos));
}
VBO绑定和数据更新
VBO多属性数据存储
#include <iostream>
//#include "thrirdParty/include/GLFW/glfw3.h"
#include "glad/glad.h" //需要先引用glad的头文件。 用于加载 OpenGL 函数指针
#include "GLFW/glfw3.h" // 用于创建窗口和处理输入。
#include <assert.h>
#include "wrapper/checkerror.h"
#include "application/application.h"
using namespace std;/*
* 目标:学习VBO相关操作
* 1.vbo的创建和销毁
* 2.练习绑定vbo,向里面传输数据
* glBindBuffer
* glBufferData
* 3.练习vbo与多属性数据的存储
* SingleBuffer
* InterLeavedBuffer
*/void prepareVBO()
{//创建一个VBO,但是还没有分配显存GLuint vbo = 0;GL_CALL( glGenBuffers(1, &vbo));cout << "vbo = " << vbo << endl;//销毁一个VBOGL_CALL(glDeleteBuffers(1, &vbo));cout << "delete vbo = " << vbo << endl;//创建多个VBOGLuint vbos[] = { 0,0,0 };GL_CALL(glGenBuffers(3,vbos));//销毁多个VBOGL_CALL(glDeleteBuffers(3, vbos));
}
void prepare() //准备
{cout << "prepare " << endl;float vertices[] = {//6个点为一个矩形0.5f,0.5f,0.0f,0.5f,-0.5f,0.0f,-0.5f,0.5f,0.0f,-0.5f,-0.5f,0.0f,};//生成一个vbo GLuint vbo = 0;GL_CALL(glGenBuffers(1, &vbo));// 绑定当前VBO,到openGL状态机的当前vbo插槽上。// vbo: 绑定VBO的编号,0代表不绑定VBO//GL_ARRAY_BUFFER:表示当前VBO插槽。GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo));// 向当前VBO传输数据,也是在开辟内存。// GL_STATIC_DRAW 模型数据不会频繁改变// GL_DYNAMIC_DRAW 模型数据会频繁改变glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);GL_CALL(glDeleteBuffers(1, &vbo));}void prepareSingleBuffer()
{//1.准备顶点位置数据与颜色数据float positions[] = {-0.5f,-0.5f,0.0f,0.5f,-0.5f,0.0f,0.0f,0.5f,0.0f,};float colors[] = {1.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,1.0f,};//2.为位置&颜色数据各自生成一个VBOGLuint posVbo = 0, colorVbo = 0;GL_CALL(glGenBuffers(1, &posVbo));GL_CALL(glGenBuffers(1, &colorVbo));//3.给两个分开的VBO各自填充数据//positions填充数据GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, posVbo));GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW));//colors填充数据GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, colorVbo));GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW));}void prepareInterLeavedBuffer()
{float vertices[] = {-0.5f,-0.5f,0.0f,1.0f,0.0f,0.0f,0.5f,-0.5f,0.0f,0.0f,1.0f,0.0f,0.0f,0.5f,0.0f,0.0f,0.0f,1.0f};//2.为位置&颜色数据各自生成一个VBOGLuint vbo = 0;GL_CALL(glGenBuffers(1, &vbo));GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo));GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW));}void onResize(int width,int height)
{GL_CALL(glViewport(0, 0, width, height));cout << "onResize " << endl;
}void frameBufferSizeCallback(GLFWwindow* win, int width, int height)
{std::cout << "窗体的最新大小为:" << width << "高度为:" << height << std::endl;//更新窗体的大小glViewport(0, 0, width, height);}void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods){// key 字母按键码 // scancode 物理按键码 // action:0抬起1按下2长按// mods:是否有shift(1)或ctrl(2) cout << "key = " << key << " scancode = " << scancode << " action = " << action << " mods = " << mods << endl;if (key == GLFW_KEY_W){//按下了w}else if (action == GLFW_PRESS){//按下了}else if (action == GLFW_RELEASE){//抬起}}int main(int argc,char**argv)
{cout << "===================================" << endl;if (app->init(800,600) == -1){return -1;}prepareInterLeavedBuffer();//设置监听帧缓冲窗口大小回调函数。//glfwSetFramebufferSizeCallback(win, frameBufferSizeCallback);//glfwSetKeyCallback(win, keyCallback);app->setResizeCallBack(onResize);app->setkeyCallBack(keyCallback);//设置OpenGL视口以及清理颜色glViewport(0,0,800,600);glClearColor(0.2f,0.3f,0.3f,1.0f);// 3. 执行窗体循环// while (app->update() == 0 ){//GL_CALL( glClear(1) );//加上gl_call如果产生错误可以打印出来,虽然vs智能提示有问题GL_CALL(glClear(GL_COLOR_BUFFER_BIT));//渲染操作}// 4. 退出程序前做相关清理app->destroy();cout << "===================================" << endl;const double M_PI = 3.14159265358979323846;double radians = M_PI / 2; // 90度,转换为弧度double sineValue = sin(radians);std::cout << "sin(" << radians << ") = " << sineValue << std::endl;system("pause");return 0;
}
VAO
在 OpenGL 中,VAO(Vertex Array Object,顶点数组对象)是一种特殊的对象,它用于封装和存储顶点数组的状态。这种状态包括顶点缓冲区对象(VBO)、顶点属性指针(如位置、纹理坐标、颜色等)以及其他与顶点数组相关的配置,他存放描述信息,专门用来管理VBO。
使用 VAO 的主要目的是:
1. **提高性能**:通过减少状态切换的开销,VAO 可以提高渲染性能。当需要渲染具有相同顶点数组配置的多个对象时,只需切换一次 VAO 状态,而不是每次渲染时都重新配置顶点属性。
2. **简化代码**:VAO 允许开发者将顶点数组的配置(如顶点属性指针)与渲染代码分离,使得渲染代码更加简洁和易于管理。
3. **避免错误**:手动配置顶点属性指针容易出错,而 VAO 可以帮助避免这些错误,因为它可以存储和恢复顶点数组的完整状态。
### 创建和使用 VAO
以下是使用 VAO 的基本步骤:
1. **生成 VAO**:
```cpp
GLuint vao;
glGenVertexArrays(1, &vao);
```
2. **绑定 VAO**:
```cpp
glBindVertexArray(vao);
```
3. **配置顶点属性**:
- 创建并绑定 VBO。
- 配置顶点属性指针。
```cpp
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 配置顶点属性指针
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
```
4. **解绑 VAO**:
```cpp
glBindVertexArray(0);
```
5. **渲染时使用 VAO**:
当需要渲染使用该 VAO 配置的对象时,只需绑定该 VAO。
```cpp
glBindVertexArray(vao);
// 绘制调用
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
```
### 示例代码
以下是一个完整的示例,展示如何创建和使用 VAO:
```cpp
#include <GL/glew.h>
#include <iostream>
// 顶点数据
float vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
void setupVertexArrayObject() {
// 生成 VAO 和 VBO
GLuint vao, vbo;
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
// 绑定 VAO
glBindVertexArray(vao);
// 绑定 VBO
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 配置顶点属性指针
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// 解绑 VAO 和 VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
void render() {
// 绑定 VAO
glBindVertexArray(vao);
// 绘制调用
glDrawArrays(GL_TRIANGLES, 0, 3);
// 解绑 VAO
glBindVertexArray(0);
}
int main() {
// 初始化 GLEW 和 OpenGL
// ...
setupVertexArrayObject();
// 渲染循环
while (true) {
// 清除颜色缓冲区
glClear(GL_COLOR_BUFFER_BIT);
// 渲染
render();
// 交换缓冲区
// ...
}
return 0;
}
```
在这个示例中,我们创建了一个 VAO 和一个 VBO,并在 VAO 中配置了顶点属性指针。在渲染时,只需绑定该 VAO,然后调用绘制函数即可。这样可以大大简化渲染代码并提高性能。
void prepareInterLeavedBuffer()
{float vertices[] = {-0.5f,-0.5f,0.0f,1.0f,0.0f,0.0f,0.5f,-0.5f,0.0f,0.0f,1.0f,0.0f,0.0f,0.5f,0.0f,0.0f,0.0f,1.0f};//2.为位置&颜色数据各自生成一个VBOGLuint vbo = 0;GL_CALL(glGenBuffers(1, &vbo));GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo));GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW));//生成VAO并且绑定GLuint vao = 0;glGenVertexArrays(1, &vao);glBindVertexArray(vao);// 分别将数据放入VAO//描述位置属性glBindBuffer(GL_ARRAY_BUFFER, vbo);//只有绑定了vbo,下面的属性描述才于此有关系glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);//颜色属性//glBindBuffer(GL_ARRAY_BUFFER, vbo);//只有绑定了vbo,下面的属性描述才于此有关系glEnableVertexAttribArray(1);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float),(void*)(3*sizeof(float)));/** glVertexAttribPointer参数详解:* index类型:GLuint描述:指定顶点属性的索引。这个索引对应于着色器中顶点属性的 layout(location = index) 指定的位置。例如,如果你的顶点着色器中有一个位置属性,你可以使用 layout(location = 0) in vec3 position; 来指定它的位置为 0。size类型:GLint描述:指定每个顶点属性的组件数量。例如,一个位置向量通常有 3 个组件(x, y, z),而一个纹理坐标可能有 2 个组件(u, v)。常见的值有 1、2、3、4。type类型:GLenum描述:指定缓冲区中数据的类型。常见的类型包括:GL_FLOAT:浮点数GL_INT:整数GL_UNSIGNED_INT:无符号整数GL_BYTE、GL_UNSIGNED_BYTE、GL_SHORT、GL_UNSIGNED_SHORT:其他数值类型normalized类型:GLboolean描述:指定是否对缓冲区中的数据进行归一化。如果设置为 GL_TRUE,则对非浮点数据进行归一化处理,即将整数数据映射到 [-1.0, 1.0](对于有符号类型)或 [0.0, 1.0](对于无符号类型)。如果设置为 GL_FALSE,则不进行归一化,直接使用缓冲区中的值。stride类型:GLsizei描述:指定连续顶点属性之间的步长(以字节为单位)。步长是从一个顶点属性的末尾到下一个顶点属性的起始位置的字节偏移量。如果所有顶点属性都紧密排列,则步长等于一个顶点属性的总字节大小。如果顶点属性之间有间隙,则步长会更大。pointer类型:const void*描述:指定指针偏移量(以字节为单位),用于从绑定的缓冲区对象中指定顶点属性的起始位置。通常设置为 NULL,表示从缓冲区的当前绑定点开始读取数据。如果需要从缓冲区的特定位置开始读取数据,则可以指定非零偏移量。*/glBindVertexArray(0); //将VAO进行解绑
}
void prepareInterLeavedBuffer()
{float vertices[] = {-0.5f,-0.5f,0.0f,1.0f,0.0f,0.0f,0.5f,-0.5f,0.0f,0.0f,1.0f,0.0f,0.0f,0.5f,0.0f,0.0f,0.0f,1.0f};//2.为位置&颜色数据各自生成一个VBOGLuint vbo = 0;GL_CALL(glGenBuffers(1, &vbo));GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo));GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW));//生成VAO并且绑定GLuint vao = 0;glGenVertexArrays(1, &vao);glBindVertexArray(vao);// 分别将数据放入VAO//描述位置属性glBindBuffer(GL_ARRAY_BUFFER, vbo);//只有绑定了vbo,下面的属性描述才于此有关系glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GL_FLOAT), (void*)0);//glBindBuffer(GL_ARRAY_BUFFER, vbo);//只有绑定了vbo,下面的属性描述才于此有关系glEnableVertexAttribArray(1);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GL_FLOAT),(void*)(3*sizeof(GL_FLOAT)));glBindVertexArray(0); //将VAO进行解绑}
相关文章:
openGL学习(VAO和VBO)
理论 VBO void prepare() {//创建一个VBO,但是还没有分配显存GLuint vbo 0;GL_CALL( glGenBuffers(1, &vbo));cout << "vbo " << vbo << endl;//销毁一个VBOGL_CALL(glDeleteBuffers(1, &vbo));cout << "delete vbo "…...
【请关注】制造企业机械加工数据脱敏解决方案
制造企业机械加工数据脱敏解决方案 一、方案概述 在制造企业尤其是机械加工领域,数字化转型带来了生产效率的大幅提升,大量生产数据、设备运行数据、供应链数据以及客户订单数据等成为企业发展的关键驱动力。然而,这些数据中包含众多敏感信息,如客户定制产品的设计图纸(…...
2025.6.27总结
最近工作又开始内耗了,一位同事的转岗直接让我破防了,明明他工作干得很不错,会得又多,性格又好,我还经常请教他业务上的问题。我和他的关系并不算太好,但他加入其他部门,竟然让我有些不舍&#…...
Python打卡:Day38
知识点回顾: Dataset类的__getitem__和__len__方法(本质是python的特殊方法)Dataloader类minist手写数据集的了解 浙大疏锦行...
Ubuntu18.04/Mysql 5.7 建立主备模式Mysql集群
一、数据库的安装 详见https://www.jianshu.com/p/5073177eedf2 本文实验环境为阿里云的两台ubuntu18.04服务器: master ip: 172.26.138.7 slave ip: 172.26.0.209 二、修改Master的配置(# 的行是我后增加的部分): 编辑 /etc/mysql/mysql.conf.d/mysqld.…...
Linux journal 日志大小限制与管理详解
文章目录 Linux journal 日志大小限制与管理详解journal 日志的默认存储位置journal 日志大小限制配置查看当前日志占用情况手动清理日志文件按大小清理日志按时间清理日志按文件数清理日志 journald 日志机制原理简析(适当加点原理)日志筛选与导出技巧&…...
Linux基本指令篇 —— tac指令
tac 是 Linux 系统中一个非常实用的文本处理命令,它是 cat 命令的反向操作(名称也是 "cat" 的反写)。tac 是一个简单但功能强大的工具,特别适合需要反向处理文本数据的场景: 目录 一、基本功能 二、基本语法…...
【Yonghong 企业日常问题08 】永洪BI的Apache Tomcat版本升级指南
文章目录 前言操作步骤登录验证 前言 某公司业务永洪BI系统使用tomcat 9.0.97版本,接到总公司漏洞扫描整改要求需要将tomcat版本升级到9.0.97以上。 目标:tomcat 9.0.97》 9.0.98 1、下载tomcat所需要的版本 地址:https://tomcat.apache.org/download-…...
动手学Python:从零开始构建一个“文字冒险游戏”
动手学Python:从零开始构建一个“文字冒险游戏” 大家好,我是你的技术向导。今天,我们不聊高深的框架,也不谈复杂的算法,我们来做一点“复古”又极具趣味性的事情——用Python亲手打造一个属于自己的文字冒险游戏&…...
【C/C++】C++26新特性前瞻:全面解析未来编程
展望未来:C26 新特性全面解析 随着 C 标准每三年一次的迭代节奏,C26(预计于 2026 年底正式发布)正在逐步成型。相比 C20 的革命性更新和 C23 的“修补增强”,C26 继续推进现代 C 的理念——更安全、更高效、更模块化&…...
Linux系统日志与守护进程开发实战指南
Linux系统日志与守护进程开发实战指南 系统日志与守护进程 ├── 系统日志syslog │ ├── 日志路径: /var/log/syslog │ └── 核心API │ ├── openlog │ ├── syslog │ └── closelog └── 守护进程daemon└── 创建步骤├── um…...
兰洋科技上合组织论坛发表专题分享,全球液冷布局引领绿色算力未来
2025年6月17-19日,中国—上海合作组织数字技术合作发展论坛在新疆克拉玛依市举办。作为第四次上海合作组织成员国信息通信技术发展部门负责人会议的配套会议,论坛以“数字化转型助力可持续发展,数字包容促进上合共同繁荣”为主题,…...
桌面小屏幕实战课程:DesktopScreen 11 SPI 水墨屏
飞书文档https://x509p6c8to.feishu.cn/docx/doxcnlzpIgj3gosCZufBTCZxlMb SPI说明 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上占用…...
小知识点五、无刷电机闭环控制(电流)
0 前言 该部分只用于自学使用,作为笔记方便后续自查。 资料参考:http://dengfoc.com 硬件:2208云台电机MT6701磁编码器 1 电流控制理论 1.1 待解决的问题 简单回顾一下在之前的学习中,我们通过 U q U_q Uq和电角度 θ \the…...
Java 编程之备忘录模式
前言 有时候,我们真希望人生能有“CtrlZ”。在日常生活中,我们经常使用“撤销”功能,例如在写 Word、画图、写代码时一不小心操作失误,就希望能回到之前的状态。这种**“状态快照 恢复”**机制,在设计模式中就叫做&a…...
SQL SERVER存储过程
什么是存储过程 SQL 存储过程(Stored Procedure)是一个在数据库中预编译并存储的一组 SQL 语句。它们可以包含查询、插入、更新、删除等数据库操作,甚至包括控制流语句(如条件判断、循环等)。存储过程可以通过调用来执…...
Vue样式绑定与条件渲染详
一、Vue样式绑定 在Vue中,我们可以通过多种方式动态地绑定样式,让界面根据数据状态变化而自动更新样式。 1. class样式绑定 (1) 字符串写法 适用场景:样式的类名不确定,需要动态指定 <template><div><!-- 绑定…...
python基于协同过滤的动漫推荐系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
光场操控新突破!3D 光学信息处理迎来通用 PSF 工程时代--《自然》子刊:无需复杂算法,这一技术让 3D 光学成像实现 “即拍即得”念日
导语 在光学成像领域,如何突破分辨率与成像速度的瓶颈,一直是科研人员探索的焦点。近日,加州大学洛杉矶分校(UCLA)的研究团队在《Light: Science & Applications》发表论文,提出了一种通用点扩散函数&a…...
ubuntu20.04如何给appImage创建快捷方式
ubuntu20.04如何给appImage创建快捷方式 1. 确保AppImage是可执行的 chmod x /path/to/your/appimage2. 创建.desktop文件 在~/.local/share/applications/目录下创建一个新的 .desktop 文件: vi ~/.local/share/applications/your-appname.desktop添加以下内容…...
网络安全之SQL RCE漏洞
引言 堡垒机(Bastion Host),也称为跳板机或运维安全审计系统,是一种用于管理和控制对内部网络资源访问的安全设备。它的主要作用是作为运维人员访问内部服务器和网络设备的唯一入口,通过集中化的身份认证、权限管理和…...
DeepSeek网页版随机点名器
用DeepSeek帮我们生成了一个基于html5的随机点名器,效果非常棒,如果需要加入名字,请在代码中按照对应的格式添加即可。 提示词prompt 帮我生成一个随机点名的HTML5页面 生成真实一点的名字数据 点击随机按钮开始随机选择 要有闪动的效果 &…...
Elasticsearch索引字段的类型
在 Elasticsearch 中,索引字段的类型(即 Mapping 中的字段类型)对搜索和存储性能影响很大。下面是各种常用数据类型的用途及推荐使用场景总结: 1. keyword 类型(精确匹配) 适合数据: 不需要分词…...
大模型在慢性病毒性肝炎预测及诊疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、慢性病毒性肝炎概述 2.1 疾病定义与分类 2.2 发病机制与病理特征 2.3 流行病学现状 三、数据收集与预处理 3.1 数据来源 3.2 数据清洗 3.3 特征工程 四、大模型选择与构建 4.1 模型选择依据 4.2 模型…...
DAY 43 复习日
浙大疏锦行https://blog.csdn.net/weixin_45655710 第一步:寻找并准备图像数据集 在Kaggle等平台上,你可以找到大量用于图像分类任务的数据集,例如英特尔图像分类数据集 (Intel Image Classification) 或手写数字识别数据集 (Digit Recogni…...
SQL学习笔记3
SQL常用函数 1、字符串函数 函数调用的语法:select 函数(参数); 常用的字符串函数有: 拼接字符串,将几个字符串拼到一起:concat (s1,s2,……); select concat(你好,hello); update mytable set wherefo concat(中…...
JVM调优实战 Day 7:JVM线程分析与死锁排查
【JVM调优实战 Day 7】JVM线程分析与死锁排查 文章标签 jvm调优, 线程分析, 死锁排查, JVM监控, Java性能优化, JVM参数配置 文章简述 在Java应用的高并发场景中,线程管理与死锁问题往往是性能瓶颈的根源。本文作为“JVM调优实战”系列的第7天,深入解析…...
Android-Layout Inspector使用手册
Layout Inspector Android Layout Inspector 是 Android Studio 中用于调试应用布局的工具 启动方法: 通过下载Layout Inspector插件,在 “View - Tool Windows - Layout Inspector” 或 “Tools - Layout Inspector” 启动。 主要界面区域:…...
【51单片机5毫秒定时器】2022-6-1
缘由单片机的代码,求大家来帮帮我-编程语言-CSDN问答 #include "REG52.h" unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64}; //共阴0~F消隐减号 unsigned char Js0, miao0;//中断…...
Flutter 多平台项目开发指南
Flutter 多平台项目开发指南 本指南将帮助你从 0 到 1 创建并适配一个支持 Android / iOS / Web / Windows / macOS / Linux 的 Flutter 多平台项目。 ✅ 一、创建支持多平台的 Flutter 项目 flutter create my_multi_platform_app cd my_multi_platform_app默认会生成支持以…...
Mac电脑如何搭建基于java后端的开发的各种工具服务
1. 确认Mac的CPU架构 首先,确认您的Mac是使用Intel还是Apple Silicon(如M1芯片)架构: uname -m如果返回x86_64,表示是Intel架构。如果返回arm64,表示是Apple Silicon架构。 2.安装IDEA Download Intelli…...
深入解析前端 Meta 标签:HTML 的隐形守护者与功能大师
在构建现代网页时,我们常常关注炫目的视觉效果、复杂的交互逻辑或强大的框架,却容易忽略那些深藏于 <head> 之中、看似不起眼的 <meta> 标签。这些标签如同网页的隐形守护者,无声地承担着定义文档元数据、指导浏览器行为、优化搜…...
CRON表达式编辑器与定时任务实现技术文档
1. 前端CRON表达式编辑器组件 CronExpressionEditor.vue组件是系统中用于创建和编辑CRON表达式的核心UI组件,它提供了直观的界面来生成复杂的定时任务表达式。 1.1 组件结构与状态管理 // 核心状态变量 const second ref<string>(0); const minute ref&…...
45. 跳跃游戏 II
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…...
《解锁AudioSet:开启音频分析的无限可能》
音频新时代的 “密钥”:AudioSet 登场 在科技飞速发展的今天,音频作为信息传播与交互的关键媒介,早已渗透到现代科技的各个角落。从智能手机中的语音助手,让我们通过简单的语音指令就能查询信息、发送消息,到智能家居系…...
环境太多?不好管理怎么办?TakMll 工具帮你快速切换和管理多语言、多版本情况下的版本切换。
本篇文章主要介绍一款环境管理工具,即TakMll,通过简单的入口命令 “tkm” 即可快速的管理多种语言下、多种版本的环境切换,诸如快速切换PHP、同时存在java、mave等不同版本。 作者:任聪聪 日期:2025年6月26日 TakMll 特…...
spring-ai 1.0.0 (1)模型调用能力
听说1.0是一个非常好用的版本,最后还是扛不住听说的压力,为了落实自己悬浮心理,自己还是着手实践一下了。 第一步pom集成: 参考spring-projects/spring-ai | DeepWiki维基以及官方文档入门 :: Spring AI …...
如何在 Manjaro Linux 上启用 AUR 仓库来安装软件包
Manjaro 是基于 Arch 的系统,是了解和学习 Arch Linux 命令的绝佳方式。它自带所有流行的桌面环境界面,无论是 XFCE 还是 Gnome 的爱好者,都可以在 Manjaro 中直接使用。 Manjaro 或 Arch Linux 的默认软件包管理器是 Pacman,我们…...
简单使用python
本文章没有深入探讨python,只说语法格式,合适于有其他编程语言的基础、并想快速使用python的人查看。 一、print() 用于打印信息,括号中可以是数学运算表达式或者字符串(或者说是文字)。 print(hello!) 1.1、转义字…...
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝 前言 蜻蜓I即时通讯系统是一款不依赖第三方服务的私有化即时通讯解决方案,本指南将详细介绍如何使用宝塔面板在CentOS系统上完成系统的完整部署。私有化部署意味着您…...
用Streamlit开发第一个Python应用程序
用Streamlit开发第一个Python应用程序 Using Streamlit to Develop the First Application in Python By JacksonML 1.Streamlit简介 Streamlit是个新出世的、功能强大的Python第三方库,将为基于Web的Python应用程序大放异彩。 Streamlit官网主页面如下&#x…...
IDEA + Spring Boot + javadoc 实例应用
1、添加 javadoc 插件 依赖 pom.xml <build><plugins><!-- javadoc 插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId><version>3.6.3</version><…...
【机器学习深度学习】交互式线性回归 demo
目录 一、环境准备 二、Demo 功能 三、完整交互 demo 代码 3.1 执行代码 3.2 示例交互演示 3.3 运行结果 3.4 运行线性图 使用 PyTorch 构建交互式线性回归模型:输入数据、拟合直线、图像可视化并实现实时预测,助你深入理解机器学习从数据到模型的…...
新手向:Anaconda3的安装与使用方法
我们在刚开始接触Python时使用的是Python的直接编译器,如果我们需要进行其他的项目编写往往需要使用另一个版本的Python ,这样反复的下载很是麻烦并且还会造成系统变量的紊乱.这次我们引入Anaconda3,可创建虚拟的Python环境,满足不同项目的需要,当不用的时候可以直接放心删除不…...
详解零拷贝
目录 一、用户态(User Mode)和内核态(Kernel Mode) 1.1 用户态 (User Mode): 1.2 内核态 (Kernel Mode): 1.3 关键交互:系统调用 (System Call) 二、为什么需要区分用户态和内核态&#x…...
微服务常用的基础知识
1.微服务介绍 1.1 产生背景 随着互联网的发展,网站应用的规模不断扩大,传统单体架构逐渐难以应对大型网站高并发、高扩展性等需求,于是分布式系统架构应运而生。Spring Cloud 就是在这种背景下诞生的,它利用 Spring Boot 的开发便…...
【开源工具】Windows一键配置防火墙阻止策略(禁止应用联网)| 附完整Python源码
🛡️【开源工具】Windows一键配置防火墙阻止策略(禁止应用联网)| 附完整源码 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。 🐋 希望大家多多支持,…...
6月份最新代发考试战报:思科华为HCIP HCSE 考试通过
6月份最新代发考试战报:思科华为HCIP HCSE 考试通过 H19-423 HCSA-Presales-IP Network 数通考试通过, H12-725 HCIP-Security安全 考试通过,H13-121 HCIP-Kunpeng Application Developer鲲鹏计算 考试通过,CCNP 350-401考试通过…...
本地部署开源时间跟踪工具 Kimai 并实现外部访问( Windows 版本)
Kimai 是一款开源的时间跟踪工具,它易于使用,并提供了强大的报告功能,在个人和团队记录工作时间、项目时间和活动时间等之后可以帮助用户了解他们是如何花费时间的,从而提高生产力和效率。本文将详细介绍如何在 Windows 系统本地部…...
SpringBoot 中 @Transactional 的使用
SpringBoot 中 Transactional 的使用 一、Transactional 的基本使用二、Transactional 的核心属性三、使用避坑(失效场景)3.1 自调用问题3.2 异常处理不当3.3 类未被 Spring 管理3.4 异步方法内使用失效 四、工作实践4.1 事务提交之后执行一些操作4.2 事…...