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

Qt中10倍提升动态截屏及渲染60帧/秒

Qt中10倍提升动态截屏及渲染60帧/秒

  1. 理解模态窗口和非模态窗口
    在C++中,窗口的**模态(Modal)和非模态(Modeless)**显示是两种不同的对话框或窗口行为模式,主要区别体现在用户交互和程序流程控制上。以下是它们的核心区别:
    1. 模态窗口(Modal)
      阻塞父窗口:
      模态窗口会阻止用户与父窗口(或其他程序窗口)交互,直到该模态窗口关闭。例如,文件保存对话框通常是模态的。

同步执行:
代码会暂停在打开模态窗口的位置,等待窗口关闭后才继续执行后续逻辑。

常见用途:
必须用户响应的关键操作(如确认对话框、文件选择框等)。

实现方式:

  1. Win32 API:DialogBox() 或 MessageBox()。
  2. MFC:CDialog::DoModal()。
  3. Qt:QDialog::exec()。
// Win32 模态对话框示例
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hParentWnd, DialogProc);// MFC 模态对话框
CMyDialog dlg;
dlg.DoModal(); // 阻塞在此,直到对话框关闭
  1. 非模态窗口(Modeless)
    非阻塞父窗口:
    非模态窗口允许用户同时与父窗口和其他窗口交互,例如工具栏或查找替换对话框。

异步执行:
窗口打开后代码继续执行,不等待窗口关闭。

常见用途:
需要持续交互的辅助窗口(如工具面板、实时预览窗口等)。

实现方式:

  1. Win32 API:CreateDialog() + 消息循环处理。

  2. MFC:CDialog::Create() + ShowWindow()。

  3. Qt:QDialog::show()。

// Win32 非模态对话框示例
HWND hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hParentWnd, DialogProc);
ShowWindow(hDlg, SW_SHOW);// MFC 非模态对话框
CMyDialog* pDlg = new CMyDialog();
pDlg->Create(IDD_DIALOG1, this);
pDlg->ShowWindow(SW_SHOW);

在这里插入图片描述

  1. 动态截屏为什么不能直接使用grabWindow

WId targetWid = reinterpret_cast(hwnd);
QPixmap windowPixmap = screen->grabWindow(targetWid); 通个该方法获取程序界面 但是单击程序子对象 会弹出非模态窗口显示的界面 无法被截取到.

  1. 合成截屏方案【低效】
    解决方案:捕获所有子窗口并合成图像
  2. 获取目标窗口及其所有子窗口
    使用Windows API遍历目标窗口的所有子窗口(包括非模态弹窗):
#include <windows.h>
#include <vector>// 回调函数枚举所有子窗口
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) {std::vector<HWND>* handles = reinterpret_cast<std::vector<HWND>*>(lParam);if (IsWindowVisible(hwnd)) { // 仅处理可见窗口handles->push_back(hwnd);}return TRUE;
}std::vector<HWND> getAllChildWindows(HWND parent) {std::vector<HWND> children;EnumChildWindows(parent, EnumChildProc, reinterpret_cast<LPARAM>(&children));return children;
}
  1. 截取每个窗口的内容
    对主窗口和每个子窗口分别截图,并记录其屏幕位置:
#include <QScreen>
#include <QGuiApplication>
#include <QWindow>QPixmap captureWindowWithChildren(WId targetWid) {QScreen* screen = QGuiApplication::primaryScreen();HWND hwnd = reinterpret_cast<HWND>(targetWid);// 获取主窗口截图QPixmap mainPixmap = screen->grabWindow(targetWid);// 获取所有子窗口std::vector<HWND> childHandles = getAllChildWindows(hwnd);// 遍历子窗口并截图for (HWND childHwnd : childHandles) {WId childWid = reinterpret_cast<WId>(childHwnd);QWindow* childWindow = QWindow::fromWinId(childWid);if (childWindow) {// 获取子窗口在屏幕中的位置RECT rect;GetWindowRect(childHwnd, &rect);QPoint childPos(rect.left, rect.top);// 截取子窗口内容QPixmap childPixmap = screen->grabWindow(childWid);// 将子窗口内容绘制到主截图中QPainter painter(&mainPixmap);painter.drawPixmap(childPos - mainPixmap.rect().topLeft(), childPixmap);}}return mainPixmap;
}
  1. 处理窗口层级和覆盖
    若子窗口有重叠,需按Z序(从底到顶)绘制,确保正确覆盖:
// 修改回调函数获取Z序列表
std::vector<HWND> getAllChildWindowsOrdered(HWND parent) {std::vector<HWND> children;HWND hwnd = GetWindow(parent, GW_CHILD);while (hwnd) {if (IsWindowVisible(hwnd)) {children.push_back(hwnd);}hwnd = GetWindow(hwnd, GW_HWNDNEXT); // 按Z序获取}return children;
}
  1. 使用高级API处理复杂内容
    对使用DirectComposition或透明效果的窗口,使用PrintWindow API:
QPixmap captureWithPrintWindow(HWND hwnd) {RECT rect;GetWindowRect(hwnd, &rect);int width = rect.right - rect.left;int height = rect.bottom - rect.top;QImage image(width, height, QImage::Format_ARGB32);HDC hdc = GetWindowDC(hwnd);HDC memdc = CreateCompatibleDC(hdc);HBITMAP hbitmap = CreateCompatibleBitmap(hdc, width, height);SelectObject(memdc, hbitmap);// 使用 PW_RENDERFULLCONTENT 捕获所有内容(Windows 8+)PrintWindow(hwnd, memdc, PW_RENDERFULLCONTENT);BITMAPINFOHEADER bi = { sizeof(BITMAPINFOHEADER), width, height, 1, 32, BI_RGB };GetDIBits(memdc, hbitmap, 0, height, image.bits(), (BITMAPINFO*)&bi, DIB_RGB_COLORS);DeleteObject(hbitmap);DeleteDC(memdc);ReleaseDC(hwnd, hdc);return QPixmap::fromImage(image);
}

完整调用示例

// 主函数调用
HWND targetHwnd = ...; // 目标窗口句柄
WId targetWid = reinterpret_cast<WId>(targetHwnd);
QPixmap result = captureWindowWithChildren(targetWid);
result.save("capture.png");

关键注意事项
窗口可见性检查:通过IsWindowVisible过滤隐藏窗口。

坐标转换:确保子窗口位置相对于主窗口正确偏移。

性能优化:若窗口频繁更新,考虑缓存或增量截图。

DPI适配:处理高DPI缩放,使用GetDpiForWindow和Qt::AA_EnableHighDpiScaling。

通过上述方法,可确保非模态子窗口的内容被正确捕获并合成到主截图中。

  1. 通个直接访问显卡内存高效完成操作**[高效方案设计思路]**
    3.1. 使用DXGI Desktop Duplication API
    直接捕获整个屏幕的帧,避免逐个窗口截图,利用GPU加速。

3.2基于窗口位置裁剪区域
通过目标窗口及其子窗口的屏幕坐标,从全屏帧中提取所需内容。

3.3多线程缓存与合成
主线程捕获全屏帧,子线程处理坐标计算和图像裁剪,减少单帧延迟。

步骤1:初始化DXGI捕获(仅需一次)

#include <dxgi1_2.h>
#include <d3d11.h>ID3D11Device* d3dDevice = nullptr;
ID3D11DeviceContext* d3dContext = nullptr;
IDXGIOutputDuplication* duplication = nullptr;bool initDxgiCapture() {// 创建D3D设备D3D_FEATURE_LEVEL featureLevel;HRESULT hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0,nullptr, 0, D3D11_SDK_VERSION, &d3dDevice, &featureLevel, &d3dContext);if (FAILED(hr)) return false;// 获取DXGI输出IDXGIOutput* output;IDXGIAdapter* adapter;DXGI_OUTPUT_DESC outputDesc;if (SUCCEEDED(d3dDevice->QueryInterface(__uuidof(IDXGIAdapter), (void**)&adapter))) {if (SUCCEEDED(adapter->EnumOutputs(0, &output))) {output->GetDesc(&outputDesc);IDXGIOutput1* output1;output->QueryInterface(__uuidof(IDXGIOutput1), (void**)&output1);output1->DuplicateOutput(d3dDevice, &duplication);output1->Release();}adapter->Release();}return duplication != nullptr;
}

步骤2:异步捕获全屏帧(每帧调用)

#include <QtConcurrent/QtConcurrent>QPixmap dxgiFrame; // 全局帧缓存
QMutex frameMutex;void captureFrameAsync() {QtConcurrent::run([&]() {DXGI_OUTDUPL_FRAME_INFO frameInfo;IDXGIResource* resource = nullptr;HRESULT hr = duplication->AcquireNextFrame(0, &frameInfo, &resource);if (hr == DXGI_ERROR_WAIT_TIMEOUT) return;if (SUCCEEDED(hr)) {ID3D11Texture2D* texture;resource->QueryInterface(__uuidof(ID3D11Texture2D), (void**)&texture);D3D11_TEXTURE2D_DESC desc;texture->GetDesc(&desc);desc.Usage = D3D11_USAGE_STAGING;desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;ID3D11Texture2D* stagingTexture;d3dDevice->CreateTexture2D(&desc, nullptr, &stagingTexture);d3dContext->CopyResource(stagingTexture, texture);D3D11_MAPPED_SUBRESOURCE mapped;d3dContext->Map(stagingTexture, 0, D3D11_MAP_READ, 0, &mapped);QImage image(desc.Width, desc.Height, QImage::Format_RGBA8888);for (int y = 0; y < desc.Height; ++y) {memcpy(image.scanLine(y), (BYTE*)mapped.pData + y * mapped.RowPitch, desc.Width * 4);}d3dContext->Unmap(stagingTexture, 0);stagingTexture->Release();resource->Release();duplication->ReleaseFrame();QMutexLocker locker(&frameMutex);dxgiFrame = QPixmap::fromImage(image);}});
}

步骤3:实时裁剪目标窗口区域

// 缓存窗口位置(每100ms更新一次,避免频繁调用)
QTimer* updateTimer = new QTimer;
std::vector<QRect> windowRegions; // 主窗口和子窗口的区域updateTimer->start(100); // 100ms更新一次窗口位置
QObject::connect(updateTimer, &QTimer::timeout, [targetHwnd]() {HWND hwnd = reinterpret_cast<HWND>(targetHwnd);windowRegions.clear();// 主窗口区域RECT rect;GetWindowRect(hwnd, &rect);windowRegions.push_back(QRect(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top));// 子窗口区域(遍历并过滤)EnumChildWindows(hwnd, [](HWND hwnd, LPARAM lParam) -> BOOL {if (IsWindowVisible(hwnd)) {RECT rect;GetWindowRect(hwnd, &rect);auto regions = reinterpret_cast<std::vector<QRect>*>(lParam);regions->push_back(QRect(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top));}return TRUE;}, reinterpret_cast<LPARAM>(&windowRegions));
});// 合成最终图像(每帧调用)
QPixmap getTargetPixmap() {QMutexLocker locker(&frameMutex);if (dxgiFrame.isNull()) return QPixmap();QPixmap result(dxgiFrame.size());result.fill(Qt::transparent);QPainter painter(&result);for (const QRect& region : windowRegions) {painter.drawPixmap(region, dxgiFrame, region);}return result;
}

性能优化关键点

  1. GPU加速捕获
    DXGI直接访问显存,比grabWindow或PrintWindow快10倍以上。

  2. 异步线程模型
    分离捕获和合成线程,避免阻塞主循环。

  3. 减少窗口位置更新频率
    每100ms更新一次窗口位置,而非每帧更新。

  4. 内存复用
    复用全局QPixmap和纹理对象,避免重复分配内存。

在这里插入图片描述
注意事项
仅支持Windows 8+
DXGI Desktop Duplication需要较新的系统。

多显示器适配
需根据目标窗口所在显示器选择对应的IDXGIOutput。

管理员权限
部分系统要求进程具有管理员权限才能捕获其他窗口。

此方案通过底层API和异步处理,显著提升了截图性能,完全可满足60FPS需求。

相关文章:

Qt中10倍提升动态截屏及渲染60帧/秒

Qt中10倍提升动态截屏及渲染60帧/秒 理解模态窗口和非模态窗口 在C中&#xff0c;窗口的**模态&#xff08;Modal&#xff09;和非模态&#xff08;Modeless&#xff09;**显示是两种不同的对话框或窗口行为模式&#xff0c;主要区别体现在用户交互和程序流程控制上。以下是它…...

OpenCV 基础全方位剖析:夯实计算机视觉开发根基

在计算机视觉的广袤领域中&#xff0c;OpenCV 是一座极为关键的里程碑。无论是在前沿的学术研究&#xff0c;还是在蓬勃发展的工业界&#xff0c;OpenCV 凭借其强大的功能与高效的性能&#xff0c;为开发者提供了丰富的图像处理和计算机视觉算法&#xff0c;助力无数项目落地。…...

Java试题

试题&#xff1a; 解析 1-5&#xff1a; 5&#xff1a; 6&#xff1a; 7&#xff1a; 8&#xff1a; 9&#xff1a; 10&#xff1a; 11: 12: 13:...

基于 arco 的 React 和 Vue 设计系统

arco 是字节跳动出品的企业级设计系统&#xff0c;支持React 和 Vue。 安装模板工具 npm i -g arco-cli创建项目目录 cd someDir arco init hello-arco-pro? 请选择你希望使用的技术栈React❯ Vue? 请选择一个分类业务组件组件库Lerna Menorepo 项目❯ Arco Pro 项目看到以…...

解密细胞衰老与溶解:AbMole助力胰腺癌研究新突破

近日&#xff0c;一项由德国罗斯托克大学医学中心的研究团队完成的研究&#xff0c;在探索胰腺癌细胞衰老与溶解的复杂机制上取得了重要进展。这项研究不仅深化了我们对胰腺癌生物学特性的理解&#xff0c;更为未来的研究开辟了新的方向。而在这场科学探索中&#xff0c;AbMole…...

罗德与施瓦茨FSU8,频谱分析仪

罗德与施瓦茨FSU8频谱分析仪​ R&S FSU系列频谱仪是动态范围、相位噪声、电平精度和分辨率带宽等频谱仪指标&#xff0c;所有这些指标也是用户设计、测量和生产下一代无线通讯元件的重要保障。出色的表现能力 频率范围&#xff1a;从20Hz开始&#xff0c;分别到3.6 GHz, 8…...

【零基础JavaScript入门 | Day7】三大交互案例深度解析|从DOM操作到组件化开发

【零基础JavaScript入门 | Day7】三大交互案例深度解析&#xff5c;从DOM操作到组件化开发 &#x1f31f;今日知识图谱&#xff1a; ✅ 事件驱动编程 → 按钮交互与定时器控制 ✅ 组件化思维 → 可复用UI模块开发 ✅ 用户体验优化 → 动画与状态反馈设计 ✅ 工程化实践 → 代码…...

[BalticOI 2009] Radio Transmission 无线传输

题目来自洛谷网站&#xff1a; KMP思路&#xff1a; 结论&#xff1a;n - ne[n] 模拟样例&#xff0c;如下图所示&#xff1a; 代码&#xff1a; #include<bits/stdc.h> #define int long long using namespace std; const int N 1e620;int n; char s[N]; int ne[N];…...

SvelteKit 最新中文文档教程(10)—— 部署 Cloudflare Pages 和 Cloudflare Workers

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …...

32位汇编:MASM32环境搭建与汇编窗口程序

引言 “汇编语言”是计算机底层的编程语言&#xff0c;直接操作硬件资源。32位汇编相比16位汇编在寄存器宽度、内存寻址和指令集等方面有了显著提升。本文将带你从零开始搭建32位汇编开发环境&#xff0c;并编写第一个窗口程序。 1. 环境搭建 1.1 下载MASM32 MASM32是一个专门…...

如何在 `php-fpm` 启动后自动运行自定义命令

如何在 php-fpm 启动后自动运行自定义命令 在使用 php-fpm 时&#xff0c;有时需要在 php-fpm 启动后自动运行一些自定义命令&#xff0c;例如启动一个 Web 应用程序。本文将详细介绍如何通过 systemd 的 ExecStartPost 指令实现这一功能&#xff0c;并记录解决过程中遇到的问…...

26考研——图_图的代码实操(6)

408答疑 文章目录 五、图的代码实操图的存储邻接矩阵结构定义初始化插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点显示图 邻接表结构定义初始化图插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点…...

栈资源释放示例

import java.util.EmptyStackException; /** * 栈资源释放示例类 * 栈资源在编程中通常指两种概念&#xff1a;1) 内存中的调用栈空间&#xff08;存储方法调用和局部变量&#xff09;&#xff0c;由系统自动管理 * 2) 自定义的栈数据结构&#xff08;如链表实现的栈对象&…...

【Qt 01】cmake搭建Qt VS2019开发环境

文章目录 准备第一步&#xff1a;安装Qt5 库第二步&#xff1a;编写CMakeLists.txt第三步&#xff1a;编写批处理文件其他配置Qt VS Toolsqt 源码调试配置 疑问初始的.ui, .qrc文件如何生成&#xff1f; 准备 编码&#xff1a;vscode debug: vs2019 Qt vs Tools 插件 c包管理…...

余弦退火算法与学习率预热

余弦退火算法与学习率预热 总述&#xff1a; &#xff08;1&#xff09;标准余弦退火算法&#xff08;Cosine Annealing&#xff09;是通过单次的余弦曲线调整学习率&#xff0c;在一个周期内让学习率从一个最大值平滑下降η_max到最小值η_min&#xff0c;这种调整模式是非周…...

ref vs reactive,watch vs watchEffect的区别与使用场景

一、ref 与 reactive 的核心区别 使用场景 ref:处理基本数据类型&#xff1b;需要重新赋值对象&#xff08;如从api获取新数据&#xff09; reactive&#xff1a;处理复杂的嵌套对象或者数组&#xff0c;不需要整体替换&#xff0c;直接访问属性&#xff08;避免频繁写.value&…...

SQLark SQL编辑器秘籍,编写高效SQL查询

SQLark 是一款功能强大的数据库开发和管理工具&#xff0c;用于快速查询、创建和管理不同类型的数据库系统&#xff0c;支持达梦、Oracle 和 MySQL 数据库。SQLark内置的 SQL 编辑器&#xff0c;基于语法解析&#xff0c;集成智能提示、实时语法检查及语法高亮等功能&#xff0…...

LLM之RAG实战(五十二)| 如何使用混合搜索优化RAG 检索

在RAG项目中&#xff0c;大模型生成的参考内容&#xff08;专业术语称为块&#xff09;来自前一步的检索&#xff0c;检索的内容在很大程度上直接决定了生成的效果&#xff0c;因此检索对于RAG项目至关重要&#xff0c;最常用的检索方法是关键字搜索和语义搜索。本文将分别介绍…...

如何基于ios部署Deep Seek?

在 iOS 上部署深度学习模型&#xff08;如 DeepSeek 或其他自定义模型&#xff09;通常需要将模型转换为 iOS 支持的格式&#xff08;如 Core ML&#xff09;&#xff0c;并通过代码集成到应用中。以下是详细步骤&#xff1a; 1. 准备模型 模型训练 确保你的模型已训练完成&…...

spring security 使用的过滤器还是拦截器

spring security 使用的过滤器还是拦截器 Spring Security 是一个强大的安全框架&#xff0c;用于保护 Java 应用程序。它主要使用过滤器&#xff08;Filters&#xff09;来实现安全功能&#xff0c;而不是拦截器&#xff08;Interceptors&#xff09;。不过&#xff0c;它也提…...

新四化驱动,如何构建智能汽车的“全场景”可进化互联网络?

在智能化、电动化、网联化、共享化的时代浪潮中&#xff0c;汽车正从单纯的 “机械产品” 进化为先进的 “移动智能终端”。 在软件定义汽车&#xff08;SDV&#xff09;的崭新时代&#xff0c;每一次 OTA 升级的顺利完成、每一秒自动驾驶的精准决策、每一帧车载娱乐交互的流畅…...

Rust从入门到精通之进阶篇:17.宏编程基础

宏编程基础 宏是 Rust 中强大的元编程工具,允许你编写可以生成其他代码的代码。与函数不同,宏在编译时展开,可以实现更灵活的代码生成和重用模式。在本章中,我们将探索 Rust 的宏系统,包括声明宏和过程宏的基础知识。 宏与函数的区别 在深入宏编程之前,让我们先了解宏…...

MySQL基础语法

目录 一、数据定义语言&#xff08;DDL&#xff09; 1. 创建数据库 2. 删除数据库 3. 创建表 4. 删除表 5. 查看表结构 6. 修改表结构 二、数据操作语言&#xff08;DML&#xff09; 1. 插入数据 2. 更新数据 3. 删除数据 三、数据查询语言&#xff08;DQL&#xff…...

数据结构练习二习题

第七题&#xff1a; #include<bits/stdc.h> using namespace std;#define MaxSize 100 // 定义顺序表的最大长度typedef int ElemType; // 定义元素类型为inttypedef struct {ElemType data[MaxSize]; // 存储数据的数组int length; // 当前顺序表的长度…...

Flutter 中 GetX 的优缺点及常见问题解决方案

在 Flutter 生态中&#xff0c;GetX 凭借其轻量级、高效的特性&#xff0c;成为众多开发者青睐的状态管理与路由解决方案。然而&#xff0c;任何工具都有其适用场景与局限性。 一、GetX 的核心优势 1. 极简开发体验 GetX 通过响应式语法糖&#xff08;如Rx和Obx&#xff09;…...

Qt开发:QColorDialog的使用

文章目录 一、QColorDialog的基本介绍二、QColorDialog的基本用法三、完整示例 一、QColorDialog的基本介绍 QColorDialog 继承自 QDialog&#xff0c;用于让用户选择颜色。它可以以模态或非模态的方式运行&#xff0c;并支持 QColor 作为输入和输出。 二、QColorDialog的基本…...

【计算机网络编码与调制】

文章目录 一、前言二、编码与调制的基本概念1. 编码常见编码类型&#xff1a; 2. 调制常见调制类型&#xff1a; 三、常见编码技术1. NRZ编码&#xff08;Non-Return to Zero&#xff09;特点&#xff1a; 2. 曼彻斯特编码&#xff08;Manchester&#xff09;特点&#xff1a; …...

<数据集>手势识别数据集<目标检测>

数据集下载链接https://download.csdn.net/download/qq_53332949/90529961数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;10829张 标注数量(xml文件个数)&#xff1a;10829 标注数量(txt文件个数)&#xff1a;10829 标注类别数&#xff1a;26 标注类别名称&…...

魔法测试:用本地多模态大模型(Qwen2.5-VL)将PDF转为Markdown文档

安装咒语清单 &#x1f4dc; pip install -U vllm qwen-vl-utils pdf2image pip install githttps://github.com/huggingface/transformers accelerate&#xff08;温馨提示&#xff1a;念咒前请检查你的魔法棒(Python环境)是否兼容~&#xff09; 第一阶段&#xff1a;PDF变…...

【渗透测试】Fastjson 反序列化漏洞原理(二)

目录 反序列化漏洞结合 RMI 攻击详解一、RMI 和 JNDI 的基础知识(1) RMI 简介(2) JNDI 简介 二、漏洞利用的核心原理1. 构造恶意 JSON 数据2. 设置恶意 RMI 服务3. 加载并执行恶意代码 三、具体利用过程环境准备攻击步骤1. 构造恶意 JSON 数据2. 设置恶意 RMI 服务3. 部署恶意类…...

[c语言日寄MAX]深度解析:大小端字节序

【作者主页】siy2333 【专栏介绍】⌈c语言日寄MAX⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还…...

凝视型高光谱相机:钻石光谱分析研究与应用

钻石作为一种珍贵的宝石&#xff0c;其颜色和光谱特征一直是宝石学研究的重要方向。中达瑞和测试部样品科对六种不同颜色的钻石样品进行了高光谱成像测试&#xff0c;旨在分析它们在光谱下的差异和可分性。本文将详细介绍此次测试的过程、结果及其意义。 测试样品与设备 此次…...

2.基于多线程的TCP服务器实现

在我们预想中&#xff0c;服务器端应该能够同时与多个客户端建立连接并进行网络通信。然而&#xff0c;在之前的代码中&#xff0c;服务器实现只支持单一连接&#xff0c;因为在处理连接时&#xff0c;主线程会被accept()、read()或write()等方法阻塞&#xff0c;导致无法响应新…...

自动驾驶01 激光雷达原理

部分转载于 原文链接&#xff1a;https://blog.csdn.net/qq_45193988/article/details/143982588 1. 什么是激光雷达 激光雷达LiDAR的全称为Light Detection and Ranging 激光探测和测距。 激光雷达的工作原理&#xff1a;对红外光束Light Pluses发射、反射和接收来探测物体。…...

基础场景-------------------(5)重载和重写的区别

重写(Override) 从字面上看&#xff0c;重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继 承了父类原有的方法&#xff0c;但有时子类并不想原封不动的继承父类中的某个方法&#xff0c;所以在方法名&#xff0c;参数列 表&#xff0c;返回…...

基于ssm的微博网站(全套)

进入信息时代以来&#xff0c;很多数据都需要配套软件协助处理&#xff0c;这样可以解决传统方式带来的管理困扰。比如耗时长&#xff0c;成本高&#xff0c;维护数据困难&#xff0c;数据易丢失等缺点。本次使用数据库工具MySQL和编程技术JSP开发的微博网站&#xff0c;可以实…...

Java并发编程从入门到实战:同步、异步、多线程核心原理全解析

《Java并发编程从入门到实战&#xff1a;同步、异步、多线程核心原理全解析》 一、多线程基础认知&#xff08;从单核到多核的进化&#xff09; 1.1 什么是线程&#xff1f; 线程是程序执行的最小单元&#xff0c;一个进程可以包含多个线程。例如浏览器同时下载文件&#xff0…...

《引流获客》总结

第一章 入门篇 理解爆款打法和引流打法的区别 爆款打法&#xff1a;刷播放量&#xff0c;制作“爆款”视频/文案。 引流打法&#xff1a;刷有效转化&#xff0c;不在意播放量&#xff0c;而注重有多少观众被引流成为客户&#xff0c;完成消费&#xff0c;即成交转化。 定理&…...

基于Python的机器学习入门指南

在当今数字化时代&#xff0c;机器学习&#xff08;Machine Learning&#xff09;已经成为科技领域中最热门的话题之一。它不仅改变了我们对数据的理解和处理方式&#xff0c;还在许多行业中得到了广泛应用&#xff0c;如金融、医疗、交通等。Python作为一门强大的编程语言&…...

【蓝桥杯每日一题】3.25

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x “OJ超时不是终点&#xff0c;是算法在提醒你该优化时间复杂度了&#xff01;” 目录 3.25 差分数组 一、一维差分 题目链接&#xff1a; 题目描述&#xff1a; 解题思路&#xff1a;…...

Kubernetes高级应用之-重启策略

一、介绍&#xff0b;扩展应用&#xff08;涉及的高级资源在后续会写出来&#xff09; # Kubernetes Pod重启策略&#xff08;RestartPolicy&#xff09;全面解析 ## 一、重启策略的核心价值与重要性 在Kubernetes集群中&#xff0c;Pod重启策略&#xff08;RestartPolicy&a…...

Axure RP9.0教程: 多级联动【设置选项改变时->情形->面板状态】(给动态面板元件设置相关交互事件的情形,来控制其他面板不同的状态。)

文章目录 引言I 多级联动(省、市、区)实现思路添加三省、市、区下拉列表给省下拉框添加数据源将市、区下拉框添加不同状态,分别以省、市命名给省下拉控件设置选项改变时的交互事件省下拉控件的交互事件情形市下拉交互事件的配置II 知识扩展: 展示省 → 地级市 → 区县的多级…...

Next.js 严重漏洞:攻击者可绕过中间件授权检查

Next.js React 框架近日披露了一个严重的安全漏洞&#xff0c;攻击者可在特定条件下利用该漏洞绕过授权检查。该漏洞被标记为 CVE-2025-29927&#xff0c;其 CVSS 评分为 9.1&#xff08;满分 10.0&#xff09;。 漏洞详情 Next.js 在公告中表示&#xff1a;“Next.js 使用内…...

气象可视化卫星云图的方式:方法与架构详解

气象卫星云图是气象预报和气候研究的重要数据来源。通过可视化技术,我们可以将卫星云图数据转化为直观的图像或动画,帮助用户更好地理解气象变化。本文将详细介绍卫星云图可视化的方法、架构和代码实现。 一、卫星云图可视化方法 1. 数据获取与预处理 卫星云图数据通常来源…...

NLP高频面试题(十四)——DPO、PPO等强化学习训练方法介绍

强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;近年来随着深度学习的快速发展而备受关注&#xff0c;特别是在游戏控制、自动驾驶、机器人控制及大语言模型训练等领域均有广泛应用。本文将重点介绍强化学习中的经典训练方法&#xff0c;包括PPO&#x…...

从 Neo4j 数据库中提取数据并绘制图谱

代码说明&#xff1a; 连接 Neo4j 数据库&#xff1a; 使用 py2neo.Graph 连接到 Neo4j 数据库。确保替换 uri、username 和 password 为你的实际配置。 Cypher 查询&#xff1a; 查询数据库中的节点和关系&#xff0c;限制返回的记录数&#xff08;例如 LIMIT 100&#xff09…...

Android Compose 框架隐式动画之过渡动画深入剖析(二十六)

Android Compose 框架隐式动画之过渡动画深入剖析 一、引言 在移动应用开发领域&#xff0c;用户体验始终是至关重要的。动画效果作为提升用户体验的关键元素&#xff0c;能够为应用增添生动性和交互性。Android Compose 作为现代 Android UI 工具包&#xff0c;为开发者提供…...

esp32s3聊天机器人(三)

先放上最新的硬件图 添加了按钮、600毫安锂电池和充电板 关于 sherpa-onnx 语音生成的打断 按说明实现了一下&#xff0c;但是偶尔还是有问题&#xff0c;毕竟不是直接立刻打断生成 private int OnAudioData(nint samples, int n){//Console.WriteLine("OnAudioData n…...

超融合服务器是什么

超融合服务器的定义与背景 超融合服务器&#xff08;Hyperconverged Infrastructure, HCI&#xff09;是一种通过软件定义技术&#xff0c;将计算、存储、网络和虚拟化功能整合到单一硬件平台中的IT基础设施解决方案。其核心目标是通过资源的高度集成和统一管理&#xff0c;简…...

Rust从入门到精通之精通篇:22.Unsafe Rust 详解

Unsafe Rust 详解 在 Rust 的设计哲学中,安全性是核心原则之一。Rust 的所有权系统、借用检查器和类型系统共同保证了内存安全和线程安全。然而,有些底层操作无法通过 Rust 的安全检查机制进行验证,这就是 unsafe Rust 存在的原因。在本章中,我们将深入探讨 unsafe Rust,…...