Vulkan 学习(13)---- Vulkan Framebuffercommand buffer
目录
- Vulkan Framebuffer
- 创建 VkFramebuffer
- VkFrameBuffer 创建示例
- Vulkan command buffer
- command buffer pool
- 分配指令缓存池
- 释放指令缓存池
- 录制 command buffer
- 提交 command buffer
Vulkan Framebuffer
Vulkan
帧缓冲区(FrameBuffer
) 是一个容器对象(资源管理类的对象),包含了一组图像视图(Image View),用于在渲染通道中作为附件进行渲染
每个帧缓冲区的附件和渲染通道的附件描述相对应,它们共同定义了渲染的目标,
帧缓存(VkFramebuffer
)在 Vulkan
中的概念类似于 OpenGL
中的帧缓存对象 FBO
每个帧缓存区包含一组图像视图,这些图像视图表示实际的图像资源,可以是颜色附件,深度附件或者模板附件。帧缓冲区用于将渲染输出写入到这些图像中(就是用于存储渲染通道(renderpass
输出的图像))
在 Vulkan
中,每个帧缓冲区至少需要一个颜色附件(color attachement
),这个颜色附件可以是和 Swapchain
关联的 ImageView
创建 VkFramebuffer
帧缓冲区的创建过程通常涉及下面的步骤:
-
确定帧缓冲区需要兼容的
Renderpass
,因为RenderPass
定义了渲染操作的结构和执行顺序,以及需要的附件的数量、类型和格式 -
为每个
SwapChain
图像创建对应的ImageView
,因为渲染的图像最终需要显示在屏幕上,Swapchain
的ImageView
就是用来呈现到屏幕上的 -
使用
VkFrameBufferCreateInfo
结构体创建Framebuffer
,指定渲染通道,附件个数附件信息、宽度、高度和图层信息
用于创建帧缓冲区的结构体 VkFramebufferCreateInfo
定义如下:
typedef struct VkFramebufferCreateInfo {// 必须是 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFOVkStructureType sType;const void* pNext;VkFramebufferCreateFlags flags;// 帧缓冲区创建标志,目前保留,必须为0VkRenderPass renderPass;// 和帧缓冲区相关联的渲染通道uint32_t attachmentCount;// 帧缓冲区的附件数量const VkImageView* pAttachments;// 指向 VkImageView 的指针数组,每个指针指向一个附件uint32_t width;// 帧缓冲区宽度uint32_t height;// 帧缓冲区高度uint32_t layers;// 帧缓冲区的层数(通常为 1)
} VkFramebufferCreateInfo;
VkFrameBuffer 创建示例
// 创建swapChainImageViews 作为颜色附件
swapChainImageViews.resize(swapChainImages.size());for (size_t i = 0; i < swapChainImages.size(); i++) {VkImageViewCreateInfo createInfo{};createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;createInfo.image = swapChainImages[i];createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;createInfo.format = swapChainImageFormat;createInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;createInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;createInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;createInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;createInfo.subresourceRange.baseMipLevel = 0;createInfo.subresourceRange.levelCount = 1;createInfo.subresourceRange.baseArrayLayer = 0;createInfo.subresourceRange.layerCount = 1;if (vkCreateImageView(device, &createInfo, nullptr, &swapChainImageViews[i]) != VK_SUCCESS) {throw std::runtime_error("failed to create image views!");}
}swapChainFramebuffers.resize(swapChainImageViews.size());// 创建帧缓冲区
for (size_t i = 0; i < swapChainImageViews.size(); i++) {VkImageView attachments[] = {swapChainImageViews[i]};VkFramebufferCreateInfo framebufferInfo{};framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;// 前面创建好的渲染通道framebufferInfo.renderPass = renderPass;// 附件数量framebufferInfo.attachmentCount = 1;// 附件内容framebufferInfo.pAttachments = attachments;// 缓冲区宽度framebufferInfo.width = swapChainExtent.width;// 缓冲区高度framebufferInfo.height = swapChainExtent.height;framebufferInfo.layers = 1;if (vkCreateFramebuffer(device, &framebufferInfo, nullptr, &swapChainFramebuffers[i]) != VK_SUCCESS) {throw std::runtime_error("failed to create framebuffer!");}
}
Vulkan command buffer
Vulkan
中,指令缓存(command buffer
)是用于记录和存储一系列绘制和计算指令的对象
这些指令将在 GPU
上执行,可以执行不同类型的工作,包括绑定顶点缓存、绑定流水线、录制渲染通道指令、设置视口和裁切矩形,设置绘制指令,执行图像和缓存内容的复制操作等
指令缓存提交到硬件队列的过程和它们被执行的过程是异步进行的
指令缓存的类型主要有两种:主指令缓存和次指令缓存
主指令缓存(primary command buffer
):包括次指令缓存,负责执行它们,可以提交给队列执行
次指令缓存(secondary command buffer
):不能直接提交给队列,必须嵌套在主指令缓存中执行,可以用于记录可重用的指令或者多线程录制指令
command buffer pool
一个应用程序的指令缓存数量是非常多的,Vulkan API
设计师为了最大的提高性能,指令缓存的分配通过 VkCommandPool
完成,从而降低多个指令缓存之间的资源创建带来的性能消耗
指令缓存可以是一直存在的,只需创建一个,就可以一直反复使用
分配指令缓存池
首先创建一个command buffer pool
,用于分配指令缓存
VkCommandPool
的创建:
VkCommandPoolCreateInfo poolInfo{};poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;// 也可以指定为 0poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;// 指定 queueFamilyIndex Graphic using graphic Compute using computepoolInfo.queueFamilyIndex = queueFamilyIndices.graphicsFamily.value();if (vkCreateCommandPool(device, &poolInfo, nullptr, &commandPool) != VK_SUCCESS) {throw std::runtime_error("failed to create command pool!");}
- 分配指令缓存
使用VkCommandBufferAllocateInfo
用于分配指令缓存
typedef struct VkCommandBufferAllocateInfo {// 结构体类型,必须为 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFOVkStructureType sType;// 可选的扩展指针,通常为 nullptrconst void* pNext;// 用于分配命令的 command poolVkCommandPool commandPool;// 命令缓冲区的级别,主级别或者次级别VkCommandBufferLevel level;// 要分配的命令缓冲区的数量,一个或者多个uint32_t commandBufferCount;
} VkCommandBufferAllocateInfo;
其中 level 属性可以选择的下面的值:
VK_COMMAND_BUFFER_LEVEL_PRIMARY
: 主命令缓冲区,可以直接提交到对垒并执行VK_COMMAND_BUFFER_LEVEL_SECONDARY
:次级命令缓存区,不能直接提交,需要在主命令缓存区内调用
分配 command buffer
的参考代码:
VkCommandBufferAllocateInfo allocInfo{};allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;allocInfo.commandPool = commandPool;allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;allocInfo.commandBufferCount = 1;if (vkAllocateCommandBuffers(device, &allocInfo, &commandBuffer) != VK_SUCCESS) {throw std::runtime_error("failed to allocate command buffers!");}
释放指令缓存池
vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer);
vkDestroyCommandPool(device, commandPool, nullptr);
录制 command buffer
指令缓存是用来记录指令的,通过函数 vkBeginCommandBuffer()
和 vkEndCommandBuffer()
完成,这两个函数定义个范围,这个范围内的所有 vulkan 指令都会被记录下来
// 定义缓冲区的开始信息结构体
VkCommandBufferBeginInfo beginInfo = {};
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
beginInfo.flags = 0;
beginInfo.pInheritanceInfo = nullptr;VkResult result = vkBeginCommandBuffer(commandBuffer, &beginInfo);
if (result != VK_SUCCESS) {throw std::runtime_error("Failed to begin recording command buffer!");
}// 录制vulkan 指令// 1. 设置视口(可选)
VkViewport viewport = {};
viewport.x = 0.0f; // viewport 左上角 x 坐标
viewport.y = 0.0f; // viewport 左上角 y 坐标
viewport.width = (float)swapChainExtent.width; // 视口宽度,通常是交换链的宽度
viewport.height = (float)swapChainExtent.height; //视口高度,通常是交换链的高度
viewport.minDepth = 0.0f; // 最小深度值
viewport.maxDepth = 1.0f; // 最大深度值
vkCmdSetViewport(commandBuffer, 0, 1, &viewport); // 录制设置 viewport 指令,提交到缓存区// 2. 设置裁剪区域
VkRect2D scissor = {};
scissor.offset = {0, 0}; // 裁剪区域的偏移量,从左上角开始
scissor.extent = swapChainExtent; // 裁剪区域的大小,通常是交换链的尺寸
vkCmdSetScissor(commandBuffer, 0, 1, &scissor); // 录制设置裁剪区域的指令// 3. 开始渲染通道(render pass)
VkRenderPassBeginInfo renderPassInfo = {}; // 初始化 VkRenderPassBeginInfo 结构体
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; // 指定结构体类型
renderPassInfo.renderPass = renderPass; // 指定关联的渲染通道
renderPassInfo.framebuffer = framebuffer; // 指定要渲染的帧缓冲区
renderPassInfo.renderArea.offset = {0, 0}; // 渲染的起点,通常是从左上角(0,0)开始
renderPassInfo.renderArea.extent = swapChainExtent; // 渲染区域大小,通常和交换链区域一致VkClearValue clearColor = {{{0.0f, 0.0f, 0.0f, 1.0f}}}; // 定义清屏颜色为黑色
renderPassInfo.clearValueCount = 1; // 清屏的值数量,这里只设置一个清屏颜色
renderPassInfo.pClearValues = &clearColor;// 开始录制渲染通道
vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); // 开始渲染通道的录制// 4. 绑定图形管线
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline); // 绑定图形管线到命令缓冲区// 5. 绑定顶点缓冲区(可选)
VkBuffer vertexBuffers[] = {vertexBuffer}; // 顶点缓冲区数组,包含顶点数据的缓冲区
VkDeviceSize offsets[] = {0}; // 偏移量数组,表示从缓冲区的哪个位置开始读取数据
vkCmdBindVertexBuffers(commandBuffer, 0, 1, vertexBuffers, offsets); // 绑定顶点缓冲区,设置偏移量// 6. 绘制图元
vkCmdDraw(commandBuffer, static_cast<uint32_t>(vertexCount), 1, 0, 0); // 录制绘制指令,指定要绘制的顶点数量// 结束渲染通道
vkCmdEndRenderPass(commandBuffer); // 结束当前渲染通道// 结束命令缓冲区的录制
result = vkEndCommandBuffer(commandBuffer); // 结束命令缓冲区的录制
if (result != VK_SUCCESS) {throw std::runtime_error("Failed to record command buffer!");
}
提交 command buffer
使用 VkQueueSubmit
将指令缓存提交给队列执行:
VkSubmitInfo submitInfo{};
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;// wait a semaphore and trigger an fence
VkSemaphore waitSemaphores[] = { imageAvailableSemaphore };
VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT };
submitInfo.waitSemaphoreCount = 1;
submitInfo.pWaitSemaphores = waitSemaphores;
submitInfo.pWaitDstStageMask = waitStages;submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &commandBuffer;VkSemaphore signalSemaphores[] = { renderFinishedSemaphore };
submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = signalSemaphores;if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFence) != VK_SUCCESS) {throw std::runtime_error("failed to submit draw command buffer!");
}
相关文章:
Vulkan 学习(13)---- Vulkan Framebuffercommand buffer
目录 Vulkan Framebuffer创建 VkFramebufferVkFrameBuffer 创建示例 Vulkan command buffercommand buffer pool分配指令缓存池释放指令缓存池录制 command buffer提交 command buffer Vulkan Framebuffer Vulkan 帧缓冲区(FrameBuffer) 是一个容器对象(资源管理类的对象)&…...
从零开始学习安时积分法(STM32实现程序)
在STM32微控制器上实现安时积分法(Coulomb Counting)来估算电池的SOC(State of Charge),需要完成以下几个步骤: 硬件配置: 使用STM32的ADC模块测量电池的电流。使用定时器模块进行时间积分。配置…...
基于Kamailio、MySQL、Redis、Gin、Vue.js的微服务架构
每个服务使用一台独立的服务器的可行部署方案,尤其是在高并发、高可用性要求较高的场景中。这种方案通常被称为分布式部署或微服务架构。以下是针对您的VoIP管理系统(基于Kamailio、MySQL、Redis、Gin、Vue.js)的详细分析和建议。 1. 分布式部…...
Unity 粒子特效在UI中使用裁剪效果
1.使用Sprite Mask 首先建立一个粒子特效在UI中显示 新建一个在场景下新建一个空物体,添加Sprite Mask组件,将其的Layer设置为UI相机渲染的UI层, 并将其添加到Canvas子物体中,调整好大小,并选择合适的Spriteÿ…...
Android 开发:新的一年,新的征程
回顾 2023 年,Android 开发领域可谓成果斐然。这一年,Android 系统不断迭代,新技术、新工具层出不穷,为开发者们带来了前所未有的机遇与挑战。如今,我们站在新的起点,怀揣着对技术的热爱与追求,…...
手写MVVM框架-环境搭建
项目使用 webpack 进行进行构建,初始化步骤如下: 1.创建npm项目执行npm init 一直下一步就行 2.安装webpack、webpack-cli、webpack-dev-server,html-webpack-plugin npm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin 3.配置webpac…...
SQL进阶实战技巧:某芯片工厂设备任务排产调度分析 | 间隙分析技术应用
目录 0 技术定义与核心原理 1 场景描述 2 数据准备 3 间隙分析法 步骤1:原始时间线可视化...
[HOT 100] 0167. 两数之和 ||
文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 167. 两数之和 II - 输入有序数组 - 力扣(LeetCode) 2. 题目描述 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 &…...
CSS整体回顾
一. 邂逅CSS和常见的CSS 1.1. CSS的编写方式 1.2. 常见的CSS font-size/color/width/height/backgroundColor 二. 文本属性 2.1. text-decoration 2.2. text-indent 2.3. text-align 三. 字体属性 3.1. font-family 3.2. font-style 3.3. font-weight 3.4. font-size 3.5. …...
使用 Grafana 和 Prometheus展现消息队列性能
引言 上篇文章通过JMX提取Kafka数据,本篇文章将通过JDBC存储Kafka性能数据存储于数据库,并通过Grafana 和 Prometheus进行展示,实现开发中常用的可视化监控 1. 环境准备 Kafka:运行中的 Kafka 集群,确保可以…...
openssl 生成证书 windows导入证书
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
Skyeye 云 VUE 版本 v3.15.6 发布
Skyeye 云智能制造,采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程,CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…...
25.2.3 【洛谷】作为栈的复习不错(学习记录)
今天学习的东西不算多,放了一个星期假,感觉不少东西都没那么清楚,得复习一下才行。今天搞个栈题写,把栈复习一下,明天进入正轨,边复习边学习新东西,应该会有二叉树的学习等等... 【洛谷】P1449 …...
【C++】线程池实现
目录 一、线程池简介线程池的核心组件实现步骤 二、C11实现线程池源码 三、线程池源码解析1. 成员变量2. 构造函数2.1 线程初始化2.2 工作线程逻辑 3. 任务提交(enqueue方法)3.1 方法签名3.2 任务封装3.3 任务入队 4. 析构函数4.1 停机控制 5. 关键技术点解析5.1 完美转发实现5…...
大模型领域的Scaling Law的含义及作用
Scaling Law就像是一个“长大公式”,用来预测当一个东西(比如模型)变大(比如增加参数、数据量)时,它的性能(比如准确率)会怎么变化。 它能帮助我们提前知道,增加多少资源…...
用FormLinker实现自动调整数据格式,批量导入微软表单
每天早上打开Excel时,你是否也经历过这样的噩梦? 熬夜调整好的问卷格式,导入微软表单后全乱套 客户发来的PDF反馈表,手动录入3小时才完成10% 200道题库要转为在线测试,复制粘贴到手指抽筋 微软官方数据显示…...
C#,shell32 + 调用控制面板项(.Cpl)实现“新建快捷方式对话框”(全网首发)
Made By 于子轩,2025.2.2 不管是使用System.IO命名空间下的File类来创建快捷方式文件,或是使用Windows Script Host对象创建快捷方式,亦或是使用Shell32对象创建快捷方式,都对用户很不友好,今天小编为大家带来一种全新…...
洛谷 P11626 题解
[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] 给定长度为 n n n 的数组 A 1 ⋯ n A_{1 \cdots n} A1⋯n,求 ∑ a 1 n ∑ b a 1 n ∑ c b 1 n ∑ d c 1 n ∑ e d 1 n ∑ f e 1 n ∑ g f 1 n ( gcd …...
Android学习制作app(ESP8266-01S连接-简单制作)
一、理论 部分理论见arduino学习-CSDN博客和Android Studio安装配置_android studio gradle 配置-CSDN博客 以下直接上代码和效果视频,esp01S的收发硬件代码目前没有分享,但是可以通过另一个手机网络调试助手进行模拟。也可以直接根据我的代码进行改动…...
一文读懂 RAG:LLM 借助检索打开思路
一、引言 在自然语言处理(NLP)领域,随着深度学习技术的飞速发展,大型语言模型(LLMs)展现出了强大的语言理解和生成能力。然而,LLMs也存在一些局限性,如容易产生幻觉、知识更新不及时…...
使用istio实现权重路由
istio概述 **概述:**Istio 是一个开源的 服务网格(Service Mesh)解决方案,主要用于管理、保护和监控微服务架构中的服务通信。它为微服务提供了基础设施层的控制功能,不需要更改应用程序的代码,从而解决服…...
DeepSeek发布新模型,遭遇大规模攻击,梁文锋回应证实为假,吴恩达盛赞DeepSeek!AI Weekly 1.27-2.2
📢本周AI快讯 | 1分钟速览🚀 1️⃣ 🖼️Janus-Pro-7B:DeepSeek发布7B开源多模态模型,视觉理解&生成能力超越DALL-E 3! 2️⃣ 🚨DeepSeek遭遇大规模攻击:DDoS暴力破解ÿ…...
20250202在Ubuntu22.04下使用Guvcview录像的时候降噪
20250202在Ubuntu22.04下使用Guvcview录像的时候降噪 2025/2/2 21:25 声卡:笔记本电脑的摄像头自带的【USB接口的】麦克风。没有外接3.5mm接口的耳机。 缘起:在安装Ubuntu18.04/20.04系统的笔记本电脑中直接使用Guvcview录像的时候底噪很大! …...
直方图:摄影中的视觉数据指南
目录 一、直方图基础:揭开它的神秘面纱 二、解读直方图类型:亮度与色彩的密码 (一)亮度直方图 (二)RGB 直方图 三、拍摄中巧用直方图:优化曝光与效果 (一)精准判断曝…...
OpenGL学习笔记(七):Camera 摄像机(视图变换、LookAt矩阵、Camera类的实现)
文章目录 摄像机/观察空间/视图变换LookAt矩阵移动相机(处理键盘输入)移动速度欧拉角移动视角(处理鼠标输入)缩放场景(处理滚轮输入)Camera类 摄像机/观察空间/视图变换 在上一节变换中,我们讨…...
冲刺一区!挑战7天完成一篇趋势性分析GBD DAY1-7
Day1. 公开数据库的挖掘太火热了,其中GBD数据库的挖掘又十分的火爆.那我就来挑战一篇GBD、一篇关于趋势性分析的GBD! GBD数据库挖掘是目前的四大刊常客,经常出现在顶级期刊上面。这个数据库亮点就是:可视化,统计学简单、而数据可…...
解锁数据结构密码:层次树与自引用树的设计艺术与API实践
1. 引言:为什么选择层次树和自引用树? 数据结构是编程中的基石之一,尤其是在处理复杂关系和层次化数据时,树形结构常常是最佳选择。层次树(Hierarchical Tree)和自引用树(Self-referencing Tree…...
【AudioClassificationModelZoo-Pytorch】基于Pytorch的声音事件检测分类系统
源码:https://github.com/Shybert-AI/AudioClassificationModelZoo-Pytorch 模型测试表 模型网络结构batch_sizeFLOPs(G)Params(M)特征提取方式数据集类别数量模型验证集性能EcapaTdnn1280.486.1melUrbanSound8K10accuracy0.974, precision0.972 recall0.967, F1-s…...
ARM嵌入式学习--第十二天(WDOG,RTC)
--WDOG -介绍 WatchDog是为了能够防止程序跑飞而使用的一种硬件模块,如果你的程序没有跑飞,那么你的程序会定时的去喂看门狗;如果你的程序跑飞了,那么就不会再去喂狗了,如果超过了喂狗时间,那么狗就会自己…...
自动化构建-make/Makefile 【Linux基础开发工具】
文章目录 一、背景二、Makefile编译过程三、变量四、变量赋值1、""是最普通的等号2、“:” 表示直接赋值3、“?” 表示如果该变量没有被赋值,4、""和写代码是一样的, 五、预定义变量六、函数**通配符** 七、伪目标 .PHONY八、其他常…...
三天急速通关JavaWeb基础知识:Day 2 前端基础知识(计划有变,前端工程化部分暂时搁置)
三天急速通关JavaWeb基础知识:Day 2 前端基础知识 0 文章说明1 HTML1.1 介绍1.2 基本结构及语法1.3 常见标签2 CSS2.1 介绍2.2 引入方式2.3 选择器2.4 浮动 定位 盒子模型 3 JavaScript3.1 介绍3.2 组成3.3 基础语法 4 Ajax4.1 介绍4.2 示例 未完待续,前…...
Chapter2 Amplifiers, Source followers Cascodes
Chapter2 Amplifiers, Source followers & Cascodes MOS单管根据输入输出, 可分为CS放大器, source follower和cascode 三种结构. Single-transistor amplifiers 这一章学习模拟电路基本单元-单管放大器 单管运放由Common-Source加上DC电流源组成. Avgm*Rds, gm和rds和…...
14-9-3C++STL的set容器
set容器的pair对组——set容器set.equal range(elem) 1.返回容器中与elem相等的上下限的两个迭代器;上限是闭区间,下限是开区间,如[beg, end) 2.函数返回两个迭代器,而这两个迭代器被封装在pair中 pair< set<int>::ite…...
用Impala对存储在HDFS中的大规模数据集进行快速、实时的交互式SQL查询的具体步骤和关键代码
AWS EMR(Elastic MapReduce)中应用Impala的典型案例,主要体现在大型企业和数据密集型组织如何利用Impala对存储在Hadoop分布式文件系统(HDFS)中的大规模数据集进行快速、实时的交互式SQL查询。以下是一个具体的案例说明…...
如何确认Linux嵌入式系统的触摸屏对应的是哪个设备文件(/dev/input/event1)?如何查看系统中所有的输入设备?输入设备的设备文件有什么特点?
Linux嵌入式系统的输入设备的设备文件有什么特点? 在 Linux 中,所有的输入设备(如键盘、鼠标、触摸屏等)都会被内核识别为 输入事件设备,并在 /dev/input/ 目录下创建相应的 设备文件,通常是: …...
C++泛型编程指南08 auto decltype
文章目录 [TOC]第3章:auto占位符(C11~C17)3.1 auto关键字的重新定义3.2 类型推导规则 3.3 何时使用auto3.4 返回类型推导3.5 在Lambda表达式中使用auto3.6 非类型模板参数占位符 总结第4章 decltype说明符(C11…...
php的使用及 phpstorm环境部署
php语法 环境搭建:在小皮中新建网站,注意先填写域名再点击选择根目录。 成功创建网站后,打开发现forbidden,因为新建的网站里是空的,需要新建index.php文件----> 在Phpstorm中左上角打开文件,打开那个文…...
人工智能学习(五)之机器学习逻辑回归算法
深入剖析机器学习逻辑回归算法 一、引言 在机器学习领域,逻辑回归是一种极为经典且应用广泛的算法。虽说名字里带有 “回归”,但它主要用于解决分类问题,在医学、金融、互联网等多个领域都发挥着关键作用。例如,在医学上辅助判断…...
Kubernetes学习之包管理工具(Helm)
一、基础知识 1.如果我们需要开发微服务架构的应用,组成应用的服务可能很多,使用原始的组织和管理方式就会非常臃肿和繁琐以及较难管理,此时我们需要一个更高层次的工具将这些配置组织起来。 2.helm架构: chart:一个应用的信息集合…...
数据结构课程设计(四)校园导航
4 校园导航 4.1 需求规格说明 【问题描述】 一个学校平面图,至少包括10个以上的场所,每个场所带有编号、坐标、名称、类别等信息,两个场所间可以有路径相通,路长(耗时)各有不同。要求读取该校园平面图&a…...
(done) MIT6.S081 2023 学习笔记 (Day7: LAB6 Multithreading)
网页:https://pdos.csail.mit.edu/6.S081/2023/labs/thread.html (任务1教会了你如何用 C 语言调用汇编,编译后链接即可) 任务1:Uthread: switching between threads (完成) 在这个练习中,你将设计一个用户级线程系统中的上下文切…...
大年初六,风很大
北京的风在立春附近的几天突然大了,正在盘算着这个冬天可能就这样平庸的去了,没成想风来了。走在风中,穿着本应该是三九天穿的冬装,紧闭着嘴,缩着身子,感受着这冬天该有的低温。这是冬天该有的样子…...
【算法】回溯算法专题③ ——排列型回溯 python
目录 前置小试牛刀回归经典举一反三总结 前置 【算法】回溯算法专题① ——子集型回溯 python 【算法】回溯算法专题② ——组合型回溯 剪枝 python 小试牛刀 全排列 https://leetcode.cn/problems/permutations/description/ 给定一个不含重复数字的数组 nums ,返…...
利用deepseek参与软件测试 基本架构如何 又该在什么环节接入deepseek
利用DeepSeek参与软件测试,可以考虑以下基本架构和接入环节: ### 基本架构 - **数据层** - **测试数据存储**:用于存放各种测试数据,包括正常输入数据、边界值数据、异常数据等,这些数据可以作为DeepSeek的输入&…...
99.20 金融难点通俗解释:中药配方比喻马科维茨资产组合模型(MPT)
目录 0. 承前1. 核心知识点拆解2. 中药搭配比喻方案分析2.1 比喻的合理性 3. 通俗易懂的解释3.1 以中药房为例3.2 配方原理 4. 实际应用举例4.1 基础配方示例4.2 效果说明 5. 注意事项5.1 个性化配置5.2 定期调整 6. 总结7. 代码实现 0. 承前 本文主旨: 本文通过中…...
为AI聊天工具添加一个知识系统 之79 详细设计之20 正则表达式 之7
本文要点 要点 “正则表达式” 本来是计算机科学计算机科学的一个概念。本项目将它推广(扩张)到认知科学的“认知范畴”概念, 聚合(收敛)到 神经科学 的“神经元”概念。 做法是:用reg 来系统化定义认知…...
[ Spring ] Spring Boot Mybatis++ 2025
文章目录 StructureMyBatis Controller AbilitiesConfigure Plugins and RepositoriesApply Plugins and Add DependenciesMyBatis Spring PropertiesMyBatis ApplicationMyBatis BeansMyBatis MapperMyBatis Query Builder Structure this blog introduce 3 ways using mybat…...
虚幻基础17:动画层接口
能帮到你的话,就给个赞吧 😘 文章目录 animation layer interface animation layer interface 动画层接口:动画图表的集。仅有名字。 添加到动画蓝图中,由动画蓝图实现动画图表。...
前缀和算法
文章目录 算法总览题目1371.每个元音包含偶数次的最长子字符串 算法总览 题目 1371.每个元音包含偶数次的最长子字符串 1371.每个元音包含偶数次的最长子字符串 参考博主的讲解 思路分析:就是得使用前缀和记录情况,dp[i][j]表示s[0] 到s[i] 中&…...
稀疏混合专家架构语言模型(MoE)
注:本文为 “稀疏混合专家架构语言模型(MoE)” 相关文章合辑。 手把手教你,从零开始实现一个稀疏混合专家架构语言模型(MoE) 机器之心 2024年02月11日 12:21 河南 选自huggingface 机器之心编译 机器之心…...