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

Opengl常用缓冲对象功能介绍及使用示例(C++实现)

本文整理了常用的opengl缓冲区对象并安排了使用示例

名称英文全称作用简述
顶点数组对象Vertex Array Object (VAO)管理 VBO 和 EBO 的配置,存储顶点属性设置,简化渲染流程,避免重复设置状态
顶点缓冲区对象Vertex Buffer Object (VBO)存储顶点属性数据,提升渲染性能
索引缓冲区对象Element/Index Buffer Object (EBO/IBO)存储顶点索引,减少数据冗余
统一缓冲区对象Uniform Buffer Object (UBO)存储着色器统一变量,方便多着色器共享
着色器存储缓冲区对象Shader Storage Buffer Object (SSBO)供着色器直接读写复杂数据
像素缓冲区对象Pixel Buffer Object (PBO)加速像素数据在 CPU 和 GPU 间传输
变换反馈缓冲区对象Transform Feedback Buffer Object (TFBO)存储处理后的顶点数据用于后续渲染
原子计数器缓冲区对象Atomic Counter Buffer Object (ACBO)存储可并发修改的计数器
纹理缓冲区对象Texture Buffer Object (TBO)将缓冲区数据作为一维纹理采样
查询对象Query Object查询 OpenGL 操作状态和结果用于调试
帧缓冲区对象Framebuffer Object (FBO)自定义渲染目标实现离屏渲染
渲染缓冲区对象Renderbuffer Object (RBO)与 FBO 配合存储单一图像数据
命令缓冲区Command Buffer提前记录命令,减少 CPU - GPU 同步开销
稀疏纹理Sparse Texture仅为纹理实际部分分配内存,节省空间
采样器缓冲区对象Sampler Buffer Object结合缓冲区与采样器功能访问数据
多视图帧缓冲区对象Multiview Framebuffer Object支持同时渲染到多个视图用于特殊渲染

1. 顶点数组对象(Vertex Array Object, VAO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {// 初始化 GLFWif (!glfwInit()) {std::cerr << "GLFW 初始化失败" << std::endl;return -1;}// 创建窗口GLFWwindow* window = glfwCreateWindow(800, 600, "VAO 示例", nullptr, nullptr);if (!window) {glfwTerminate();std::cerr << "窗口创建失败" << std::endl;return -1;}glfwMakeContextCurrent(window);// 初始化 GLEWif (glewInit() != GLEW_OK) {glfwTerminate();std::cerr << "GLEW 初始化失败" << std::endl;return -1;}// 创建 VAOGLuint VAO;glGenVertexArrays(1, &VAO);// 绑定 VAOglBindVertexArray(VAO);// 这里可以进行 VBO 和 EBO 的绑定与设置// 解绑 VAOglBindVertexArray(0);// 主循环while (!glfwWindowShouldClose(window)) {// 处理事件glfwPollEvents();// 绑定 VAOglBindVertexArray(VAO);// 绘制操作// glDrawArrays(GL_TRIANGLES, 0, 3);// 解绑 VAOglBindVertexArray(0);// 交换缓冲区glfwSwapBuffers(window);}// 清理 VAOglDeleteVertexArrays(1, &VAO);// 终止 GLFWglfwTerminate();return 0;
}

2. 顶点缓冲区对象(Vertex Buffer Object, VBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "VBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 顶点数据float vertices[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f,  0.5f, 0.0f};// 创建 VBOGLuint VBO;glGenBuffers(1, &VBO);// 绑定 VBOglBindBuffer(GL_ARRAY_BUFFER, VBO);// 填充数据glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 解绑 VBOglBindBuffer(GL_ARRAY_BUFFER, 0);glfwTerminate();// 清理 VBOglDeleteBuffers(1, &VBO);return 0;
}

3. 索引缓冲区对象(Element Buffer Object, EBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "EBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 顶点数据float vertices[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f,  0.5f, 0.0f};// 索引数据unsigned int indices[] = {0, 1, 2};// 创建 EBOGLuint EBO;glGenBuffers(1, &EBO);// 绑定 EBOglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);// 填充数据glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);// 解绑 EBOglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);glfwTerminate();// 清理 EBOglDeleteBuffers(1, &EBO);return 0;
}

4. 统一缓冲区对象(Uniform Buffer Object, UBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>const GLuint UBO_BINDING_POINT = 0;int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "UBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建 UBOGLuint UBO;glGenBuffers(1, &UBO);// 绑定 UBOglBindBuffer(GL_UNIFORM_BUFFER, UBO);// 分配内存glBufferData(GL_UNIFORM_BUFFER, 16 * sizeof(float), nullptr, GL_STATIC_DRAW);// 绑定到指定绑定点glBindBufferBase(GL_UNIFORM_BUFFER, UBO_BINDING_POINT, UBO);// 解绑 UBOglBindBuffer(GL_UNIFORM_BUFFER, 0);glfwTerminate();// 清理 UBOglDeleteBuffers(1, &UBO);return 0;
}

5. 着色器存储缓冲区对象(Shader Storage Buffer Object, SSBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "SSBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 数据float data[] = {1.0f, 2.0f, 3.0f, 4.0f};// 创建 SSBOGLuint SSBO;glGenBuffers(1, &SSBO);// 绑定 SSBOglBindBuffer(GL_SHADER_STORAGE_BUFFER, SSBO);// 填充数据glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(data), data, GL_STATIC_DRAW);// 绑定到指定绑定点glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, SSBO);// 解绑 SSBOglBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);glfwTerminate();// 清理 SSBOglDeleteBuffers(1, &SSBO);return 0;
}

6. 像素缓冲区对象(Pixel Buffer Object, PBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "PBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建 PBOGLuint PBO;glGenBuffers(1, &PBO);// 绑定 PBOglBindBuffer(GL_PIXEL_UNPACK_BUFFER, PBO);// 分配内存glBufferData(GL_PIXEL_UNPACK_BUFFER, 800 * 600 * 4, nullptr, GL_STREAM_DRAW);// 解绑 PBOglBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);glfwTerminate();// 清理 PBOglDeleteBuffers(1, &PBO);return 0;
}

7. 变换反馈缓冲区对象(Transform Feedback Buffer Object, TFBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "TFBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建 TFBOGLuint TFBO;glGenBuffers(1, &TFBO);// 绑定 TFBOglBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, TFBO);// 分配内存glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 1024, nullptr, GL_STATIC_DRAW);// 绑定到变换反馈绑定点glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, TFBO);// 解绑 TFBOglBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0);glfwTerminate();// 清理 TFBOglDeleteBuffers(1, &TFBO);return 0;
}

8. 原子计数器缓冲区对象(Atomic Counter Buffer Object, ACBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "ACBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建 ACBOGLuint ACBO;glGenBuffers(1, &ACBO);// 绑定 ACBOglBindBuffer(GL_ATOMIC_COUNTER_BUFFER, ACBO);// 分配内存glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint), nullptr, GL_DYNAMIC_DRAW);// 绑定到指定绑定点glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, ACBO);// 解绑 ACBOglBindBuffer(GL_ATOMIC_COUNTER_BUFFER, 0);glfwTerminate();// 清理 ACBOglDeleteBuffers(1, &ACBO);return 0;
}

9. 纹理缓冲区对象(Texture Buffer Object, TBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "TBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 数据float data[] = {1.0f, 2.0f, 3.0f, 4.0f};// 创建 TBOGLuint TBO;glGenBuffers(1, &TBO);// 绑定 TBOglBindBuffer(GL_TEXTURE_BUFFER, TBO);// 填充数据glBufferData(GL_TEXTURE_BUFFER, sizeof(data), data, GL_STATIC_DRAW);// 创建纹理GLuint texture;glGenTextures(1, &texture);// 绑定纹理glBindTexture(GL_TEXTURE_BUFFER, texture);// 将 TBO 关联到纹理glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, TBO);// 解绑 TBO 和纹理glBindBuffer(GL_TEXTURE_BUFFER, 0);glBindTexture(GL_TEXTURE_BUFFER, 0);glfwTerminate();// 清理 TBO 和纹理glDeleteBuffers(1, &TBO);glDeleteTextures(1, &texture);return 0;
}

10. 查询对象(Query Object)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "查询对象示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建查询对象GLuint query;glGenQueries(1, &query);// 开始查询glBeginQuery(GL_SAMPLES_PASSED, query);// 这里进行绘制操作// glDrawArrays(GL_TRIANGLES, 0, 3);// 结束查询glEndQuery(GL_SAMPLES_PASSED);// 获取查询结果GLuint result;glGetQueryObjectuiv(query, GL_QUERY_RESULT, &result);std::cout << "采样通过数量: " << result << std::endl;// 清理查询对象glDeleteQueries(1, &query);glfwTerminate();return 0;
}

11. 帧缓冲区对象(Framebuffer Object, FBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "FBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建 FBOGLuint FBO;glGenFramebuffers(1, &FBO);// 绑定 FBOglBindFramebuffer(GL_FRAMEBUFFER, FBO);// 这里可以创建并附加纹理或渲染缓冲区// 检查 FBO 是否完整if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)std::cerr << "FBO 不完整" << std::endl;// 解绑 FBOglBindFramebuffer(GL_FRAMEBUFFER, 0);glfwTerminate();// 清理 FBOglDeleteFramebuffers(1, &FBO);return 0;
}

12. 渲染缓冲区对象(Renderbuffer Object, RBO)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "RBO 示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();// 创建 RBOGLuint RBO;glGenRenderbuffers(1, &RBO);// 绑定 RBOglBindRenderbuffer(GL_RENDERBUFFER, RBO);// 分配内存glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);// 解绑 RBOglBindRenderbuffer(GL_RENDERBUFFER, 0);glfwTerminate();// 清理 RBOglDeleteRenderbuffers(1, &RBO);return 0;
}

13. 命令缓冲区(Command Buffer)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <vector>// 模拟命令结构体
struct Command {enum Type { DRAW_ARRAYS } type;GLenum mode;GLint first;GLsizei count;
};int main() {glfwInit();GLFWwindow* window = glfwCreateWindow(800, 600, "命令缓冲区示例", nullptr, nullptr);glfwMakeContextCurrent(window);glewInit();std::vector<Command> commandBuffer;// 添加命令到缓冲区Command cmd;cmd.type = Command::DRAW_ARRAYS;cmd.mode = GL_TRIANGLES;cmd.first = 0;cmd.count = 3;commandBuffer.push_back(cmd);// 执行命令缓冲区中的命令for (const auto& cmd : commandBuffer) {if (cmd.type == Command::DRAW_ARRAYS) {glDrawArrays(cmd.mode, cmd.first, cmd.count);}}glfwTerminate();return 0;
}

稀疏纹理(Sparse Texture)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>const int WIDTH = 800;
const int HEIGHT = 600;int main() {// 初始化 GLFWif (!glfwInit()) {std::cerr << "GLFW 初始化失败" << std::endl;return -1;}// 创建窗口GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Sparse Texture Example", nullptr, nullptr);if (!window) {glfwTerminate();std::cerr << "窗口创建失败" << std::endl;return -1;}glfwMakeContextCurrent(window);// 初始化 GLEWif (glewInit() != GLEW_OK) {glfwTerminate();std::cerr << "GLEW 初始化失败" << std::endl;return -1;}// 检查是否支持稀疏纹理扩展if (!GLEW_ARB_sparse_texture) {std::cerr << "不支持 ARB_sparse_texture 扩展" << std::endl;glfwTerminate();return -1;}// 创建纹理对象GLuint texture;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D, texture);// 设置纹理参数glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);// 分配稀疏纹理存储GLint alignment;glGetInternalformativ(GL_TEXTURE_2D, GL_RGBA8, GL_TEXTURE_SPARSE_ARB, 1, &alignment);glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, WIDTH, HEIGHT, GL_TRUE);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SPARSE_ARB, GL_TRUE);// 定义一个稀疏纹理的子区域GLint x = 0, y = 0, z = 0;GLint width = WIDTH / 2, height = HEIGHT / 2, depth = 1;GLint level = 0;glTexPageCommitmentARB(GL_TEXTURE_2D, level, x, y, z, width, height, depth, GL_TRUE);// 主循环while (!glfwWindowShouldClose(window)) {glfwPollEvents();// 清屏glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 这里可以进行纹理绘制操作glfwSwapBuffers(window);}// 清理资源glDeleteTextures(1, &texture);glfwTerminate();return 0;
}

采样器缓冲区对象(Sampler Buffer Object)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>const int WIDTH = 800;
const int HEIGHT = 600;int main() {// 初始化 GLFWif (!glfwInit()) {std::cerr << "GLFW 初始化失败" << std::endl;return -1;}// 创建窗口GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Sampler Buffer Object Example", nullptr, nullptr);if (!window) {glfwTerminate();std::cerr << "窗口创建失败" << std::endl;return -1;}glfwMakeContextCurrent(window);// 初始化 GLEWif (glewInit() != GLEW_OK) {glfwTerminate();std::cerr << "GLEW 初始化失败" << std::endl;return -1;}// 创建缓冲区对象GLuint buffer;glGenBuffers(1, &buffer);glBindBuffer(GL_TEXTURE_BUFFER, buffer);// 分配缓冲区数据const int bufferSize = 1024;float* data = new float[bufferSize];for (int i = 0; i < bufferSize; ++i) {data[i] = static_cast<float>(i);}glBufferData(GL_TEXTURE_BUFFER, bufferSize * sizeof(float), data, GL_STATIC_DRAW);delete[] data;// 创建纹理对象并绑定到缓冲区GLuint texture;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_BUFFER, texture);glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, buffer);// 主循环while (!glfwWindowShouldClose(window)) {glfwPollEvents();// 清屏glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 这里可以在着色器中使用采样器缓冲区对象进行采样操作glfwSwapBuffers(window);}// 清理资源glDeleteTextures(1, &texture);glDeleteBuffers(1, &buffer);glfwTerminate();return 0;
}

多视图帧缓冲区对象(Multiview Framebuffer Object)

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>const int WIDTH = 800;
const int HEIGHT = 600;int main() {// 初始化 GLFWif (!glfwInit()) {std::cerr << "GLFW 初始化失败" << std::endl;return -1;}// 创建窗口GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Multiview Framebuffer Object Example", nullptr, nullptr);if (!window) {glfwTerminate();std::cerr << "窗口创建失败" << std::endl;return -1;}glfwMakeContextCurrent(window);// 初始化 GLEWif (glewInit() != GLEW_OK) {glfwTerminate();std::cerr << "GLEW 初始化失败" << std::endl;return -1;}// 检查是否支持多视图扩展if (!GLEW_NV_multiview) {std::cerr << "不支持 NV_multiview 扩展" << std::endl;glfwTerminate();return -1;}// 创建帧缓冲区对象GLuint fbo;glGenFramebuffers(1, &fbo);glBindFramebuffer(GL_FRAMEBUFFER, fbo);// 创建纹理附件GLuint texture;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D_ARRAY, texture);glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, WIDTH, HEIGHT, 2); // 2 个视图// 将纹理附件附加到帧缓冲区glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0);// 设置多视图GLuint views[] = {0, 1};glNamedFramebufferMultiviewOVR(fbo, GL_COLOR_ATTACHMENT0, texture, 0, 0, 2, 2, views);// 主循环while (!glfwWindowShouldClose(window)) {glfwPollEvents();// 清屏glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 这里可以进行多视图渲染操作glfwSwapBuffers(window);}// 清理资源glDeleteTextures(1, &texture);glDeleteFramebuffers(1, &fbo);glfwTerminate();return 0;
}

相关文章:

Opengl常用缓冲对象功能介绍及使用示例(C++实现)

本文整理了常用的opengl缓冲区对象并安排了使用示例 名称英文全称作用简述顶点数组对象Vertex Array Object (VAO)管理 VBO 和 EBO 的配置&#xff0c;存储顶点属性设置&#xff0c;简化渲染流程&#xff0c;避免重复设置状态顶点缓冲区对象Vertex Buffer Object (VBO)存储顶点…...

docker独立部署milvus向量数据库

milvus镜像&#xff1a;国外封锁&#xff0c;国内源也不好用。基本上所有源都不能用 首先想到阿里云服务&#xff0c;但是阿里云国外服务器便宜的300~400呢。 基于成本考虑终于装上心心念念的milvus(*^▽^*) 安装 Milvus 安装 Milvus 独立版 wget https://raw.githubuserco…...

【JT/T 808协议】808 协议开发笔记 ② ( 终端注册 | 终端注册应答 | 字符编码转换网站 )

文章目录 一、消息头 数据1、消息头拼接2、消息 ID 字段3、消息体属性 字段4、终端手机号 字段5、终端流水号 字段 二、消息体 数据三、校验码计算四、最终计算结果五、终端注册应答1、分解终端应答数据2、终端应答 消息体 数据 六、字符编码转换网站 一、消息头 数据 1、消息头…...

github配置sshkey

使用命令生成sshkey ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 依此会要求输入以下信息&#xff0c;可以使用默认值 设置保存密钥的路径 设置SSH密钥密码&#xff08;备注&#xff1a;空内容表示不设置SSH密钥密码&#xff09; 再次确认SSH密钥密…...

Java数据结构第十二期:走进二叉树的奇妙世界(一)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 目录 一、树型结构 1.1. 树的定义 1.2. 树的基本概念 1.3. 树的表示形式 二、二叉树 2.1. 概念 2.2. 两种特殊的二叉树 2.3. 二叉树的性质 2.4. 二叉树的存储 三、二叉树的基本操作 一、树型结构 1.…...

Web的增删改查

准备环境 1. 添加web 点击项目右键——>选择**添加框架**选择**web应用程序** 2.创建lib目录 在web应用程序的**WEB-INF目录下**创建lib目录添加jar包(5个)解压&#xff1a;右键——>选择**添加库** 3.创建Dao层 在src目录下创建包com.zmq在该包下创建dao层添加工具…...

Java 前后端时间格式转换

在 Web 开发里&#xff0c;时间格式处理既常见又关键。由于前端和后端对时间的表示、处理方式存在差异&#xff0c;熟练掌握时间格式的转换方法就显得尤为重要。这篇文章会深入探讨 Java 前后端时间格式转换的相关知识&#xff0c;特别是 Java 时间转换的多种方式&#xff0c;其…...

【用deepseek和chatgpt做算法竞赛】——还得DeepSeek来 -Minimum Cost Trees_5

往期 【用deepseek和chatgpt做算法竞赛】——华为算法精英实战营第十九期-Minimum Cost Trees_0&#xff1a;介绍了题目和背景【用deepseek和chatgpt做算法竞赛】——华为算法精英实战营第十九期-Minimum Cost Trees_1&#xff1a;题目输入的格式说明&#xff0c;选择了邻接表…...

C++ 互斥锁的使用

mutex std::mutex 是C标准库中用于线程同步的互斥锁机制&#xff0c;主要用于保护共享资源&#xff0c;避免多个线程同时访问导致的竞态条件。 它提供了以下功能&#xff1a; 加锁&#xff08;lock&#xff09;&#xff1a;阻塞当前线程&#xff0c;直到获取锁。 解锁&#…...

【Elasticsearch】Retrieve inner hits获取嵌套查询的具体的嵌套文档来源,以及父子文档的来源

Retrieve inner hits 是 Elasticsearch 中的一个功能&#xff0c;用于在嵌套查询或父子查询中&#xff0c;返回导致主文档匹配的具体嵌套对象或子/父文档的详细信息&#xff0c;帮助用户更直观地理解查询结果的来源。 在 Elasticsearch 中&#xff0c;Retrieve inner hits是一…...

C语言中的typedef关键字详解

C语言中的typedef关键字详解 在C语言编程中&#xff0c;typedef 关键字是一个非常实用的特性&#xff0c;它可以帮助我们创建新的类型名&#xff0c;从而简化代码&#xff0c;提高可读性。本文将详细解析typedef的使用方法、场景以及注意事项。 1. typedef简介 typedef 是Ty…...

怎麼利用靜態ISP住宅代理在指紋流覽器中管理社媒帳號?

靜態ISP住宅代理是一種基於真實住宅IP的代理服務。這類代理IP通常由互聯網服務提供商&#xff08;ISP&#xff09;分配&#xff0c;具有非常高的真實性&#xff0c;與普通數據中心代理相比&#xff0c;更不容易被平臺檢測到為“虛假IP”或“代理IP”&#xff0c;靜態ISP住宅代理…...

【多语言生态篇一】【DeepSeek×Java:Spring Boot微服务集成全栈指南 】

(手把手带你从零实现AI能力调用,万字长文预警,建议收藏实操) 一、环境准备:别输在起跑线上 1.1 硬件软件全家桶 JDK版本:必须 ≥17(Spring Boot 3.2+强制要求,低版本直接报错)IDE推荐:IntelliJ IDEA终极版(社区版缺Spring AI插件支持)构建工具:Maven 3.9+ / Grad…...

IOS UITextField 无法隐藏键盘问题

设置UITextField 键盘按钮返回键为“完成”&#xff0c;即return key 设置done .m代码设置代理 //设置代理协议 UITextFieldDelegate&#xff0c; self.mobileTextField.delegate self; ///点击完成键隐藏键盘 - (BOOL)textFieldShouldReturn:(UITextField *)textField{//取…...

einops测试

文章目录 1. einops2. code3. pytorch 1. einops einops 主要是通过爱因斯坦标记法来处理张量矩阵的库&#xff0c;让矩阵处理上非常简单。 conda : conda install conda-forge::einopspython: 2. code import torch import torch.nn as nn import torch.nn.functional as…...

25轻化工程研究生复试面试问题汇总 轻化工程专业知识问题很全! 轻化工程复试全流程攻略 轻化工程考研复试真题汇总

轻化工程复试心里没谱&#xff1f;学姐带你玩转面试准备&#xff01; 是不是总觉得老师会问些刁钻问题&#xff1f;别焦虑&#xff01;其实轻化工程复试套路就那些&#xff0c;看完这篇攻略直接掌握复试通关密码&#xff01;文中有重点面试题可直接背~ 目录 一、这些行为赶紧避…...

小米路由器 AX3000T 降级后无法正常使用,解决办法

问题描述 买了个 AX3000T 路由器&#xff0c;想安装 OpenWRT 或者 安装 Clash 使用&#xff0c;看教程说是需要降级到 v1.0.47 版本。 结果刷机之后路由器无法打开了&#xff0c;一直黄灯亮&#xff0c;中间灭一下&#xff0c;又是黄灯长亮&#xff0c;没有 WIFI 没有连接。以…...

qt5实现表盘的旋转效果,通过提升QLabel类

因为工作需要&#xff0c;需要实现温度的表盘展示效果 实现思路&#xff1a; 通过提示声QLabel控价类&#xff0c;实现报盘的旋转和展示效果 1. 编写一个QLabel的类MyQLabel,实现两个方法 1. void paintEvent(QPaintEvent *event); //重绘函数 2. void valueChanged(int va…...

【HeadFirst系列之HeadFirst设计模式】第7天之命令模式:封装请求,轻松实现解耦!

命令模式&#xff1a;封装请求&#xff0c;轻松实现解耦&#xff01; 大家好&#xff01;今天我们来聊聊设计模式中的命令模式&#xff08;Command Pattern&#xff09;。如果你曾经需要将请求封装成对象&#xff0c;或者希望实现请求的撤销、重做等功能&#xff0c;那么命令模…...

HTTPS(下)

主要讲加密算法RSA&#xff0c;ECDHE TLS的握手涉及四次通信&#xff0c;根据不同的密钥交换算法&#xff0c;TLS 握手流程也会不一样的&#xff0c;现在常用的密钥交换算法有两种&#xff1a;RSA 算法和 ECDHE 算法 正常情况下&#xff0c;需要先TCP三次握手后进行TLS四次握手…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...