Qt Scene Graph渲染管线深度解析:从QML到GPU像素的奇幻之旅

news2026/5/18 10:46:19
揭开Qt Quick高性能渲染的黑盒掌握60fps丝滑界面的核心秘密一、为什么Scene Graph是Qt Quick的灵魂当你用QML写一个流畅的动画界面轻松跑到60fps有没有想过背后的渲染引擎到底做了什么传统的QWidget走的是CPU软件绘制路线——QPainter逐像素涂抹而Qt Quick从Qt 5.0开始全面拥抱GPU加速其核心就是Scene Graph渲染管线。Scene Graph的本质是一个保留模式的渲染树而非Qt 2D绘制系统那种立即模式。这意味着每一帧渲染时整个场景图的结构、属性、状态都会被保留在内存中渲染器可以根据需要做增量更新、批量合并、剔除优化——这些在传统QPainter里想都不敢想。┌─────────────────────────────────────────────────┐ │ Qt Quick Application │ │ ┌─────────┐ ┌──────────┐ ┌───────────────┐ │ │ │ QML UI │→│ Declarative│→│ Scene Graph │ │ │ │ Tree │ │ Engine │ │ (Render Tree) │ │ │ └─────────┘ └──────────┘ └───────┬───────┘ │ │ │ │ │ ┌────────▼────────┐ │ │ │ Renderer │ │ │ │ (OpenGL/Vulkan)│ │ │ └────────┬────────┘ │ │ │ │ │ ┌────────▼────────┐ │ │ │ GPU Framebuffer│ │ │ └─────────────────┘ │ └─────────────────────────────────────────────────┘二、Scene Graph核心架构与类层次2.1 核心类关系Scene Graph的源码位于qtdeclarative/src/quick/scenegraph/目录下核心类层次如下// qtdeclarative/src/quick/scenegraph/qsgnode.hclassQ_QUICK_EXPORTQSGNode{public:enumType{BasicNodeType,GeometryNodeType,// QSGGeometryNodeTransformNodeType,// QSGTransformNodeClipNodeType,// QSGClipNodeOpacityNodeType,// QSGOpacityNode// Qt 6.x 新增RootNodeType,// QSGRootNodeRenderNodeType// QSGRenderNode};voidpreprocess(){/* 子类重写用于异步资源准备 */}// ... 状态管理、标记dirty等};四类核心节点节点类型类名作用几何节点QSGGeometryNode携带顶点数据材质实际可见元素变换节点QSGTransformNode4x4矩阵变换平移/旋转/缩放裁剪节点QSGClipNode裁剪区域超出部分不渲染透明度节点QSGOpacityNode透明度叠加影响子树2.2 QSGGeometry——GPU数据的最小单元// qtdeclarative/src/quick/scenegraph/coreapi/qsggeometry.hstructQ_QUICK_EXPORTQSGGeometry{Attribute*attributes;// 顶点属性描述intattributeCount;intstride;// 每个顶点的字节步长// 顶点数据CPU侧QByteArray vertexData;QByteArray indexData;intvertexCount;intindexCount;DrawingMode drawingMode;// GL_TRIANGLES, GL_TRIANGLE_STRIP等// 标记顶点数据是否已更新voidmarkVertexDataDirty();voidmarkIndexDataDirty();};QSGGeometry本质是VBOVertex Buffer Object的CPU侧映射。当你修改了顶点数据并调用markVertexDataDirty()Scene Graph会在下一帧同步时将脏数据上传到GPU。三、渲染线程模型GUI线程与渲染线程的优雅共舞3.1 双线程架构这是Scene Graph最精妙的设计——GUI线程主线程与渲染线程完全解耦GUI Thread (Main) Render Thread ┌──────────────┐ ┌──────────────┐ │ QML Engine │ │ Renderer │ │ Property │───── mutex ───────→│ Render │ │ Changes │ sync/beginFrame │ Loop │ │ │←───── mutex ───────│ endFrame │ └──────────────┘ └──────────────┘关键源码在QSGRenderer中// qtdeclarative/src/quick/scenegraph/coreapi/qsgrenderer.cppvoidQSGRenderer::render(){// 1. 同步阶段从GUI线程获取最新状态// (由QSGRenderLoop::sync完成)// 2. 预处理遍历节点树调用preprocess()m_rootNode-markDirty(DirtyState::DirtySubtreeBlocked);preprocess();// 3. 更新渲染状态updateUniforms();// 4. 执行渲染renderScene();// 5. 交换缓冲区swapBuffers();}3.2 同步机制——QSGRenderLoop// qtdeclarative/src/quick/scenegraph/qsgrenderloop.cppvoidQSGRenderLoop::handleUpdateRequest(QQuickWindow*w){// GUI线程触发更新m_windowsWaitingForSyncw;// 唤醒渲染线程进行同步if(m_waitingForSync0){m_waitingForSynctrue;// 通知渲染线程开始新的一帧postSync(w,QSGRenderContext::SyncState());}}boolQSGRenderLoop::sync(QQuickWindow*w){// 在渲染线程中调用// 通过互斥锁安全地访问GUI线程的属性变化Q_D(QSGRenderLoop);// 将QML属性变化同步到Scene Graph节点w-handleSceneGraphSync();returntrue;}关键点同步阶段使用了一种叫做Animation Driver的机制来保证帧时间一致性。QSGAnimationDriver在渲染线程驱动动画进度而不是系统时钟这确保了动画不会被GUI线程的卡顿所影响。四、帧生命周期一帧渲染的完整旅程4.1 五阶段渲染管线Frame Lifecycle: ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ Poll │──→│ Input │──→│ Sync │──→│ Render │──→│ Swap │ │ Events │ │ Events │ │ │ │ │ │ Buffers │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ ↑ │ └──────────── vsync signal ───────────────────────────────┘阶段详解// qtdeclarative/src/quick/items/qquickwindow.cppvoidQQuickWindowPrivate::renderSceneGraph(){// 阶段1: 动画驱动器推进时间animationController-advance();// 阶段2: 处理输入事件deliverInputEvents();// 阶段3: 同步——将QML变更映射到Scene Graphif(dirtyNodeList){syncSceneGraph();}// 阶段4: 渲染sgContext-renderNextFrame(renderer);// 阶段5: 交换context-swapBuffers(q);}4.2 脏标记系统——增量更新的基础Scene Graph不会每帧重绘所有内容而是通过脏标记系统精确追踪哪些节点需要更新// qtdeclarative/src/quick/scenegraph/qsgnode_p.henumDirtyState{DirtySubtreeAdded0x0001,DirtyMatrix0x0002,// 变换矩阵变了DirtyNodeAdded0x0004,DirtyNodeRemoved0x0008,DirtyGeometry0x0010,// 顶点数据变了DirtyMaterial0x0020,// 材质/Shader变了DirtyOpacity0x0040,// 透明度变了DirtyClip0x0080,// 裁剪区域变了DirtyForceUpdate0x8000// 强制全量更新};Q_DECLARE_FLAGS(DirtyStates,DirtyState)当一个属性被修改时比如Rectangle的color它会标记对应的脏位。渲染器在同步阶段只处理有脏标记的节点子树。五、材质系统与Shader编译管线5.1 QSGMaterial——GPU渲染的核心// qtdeclarative/src/quick/scenegraph/coreapi/qsgmaterial.hclassQ_QUICK_EXPORTQSGMaterial{public:enumFlag{Blending0x0001,// 启用Alpha混合RequiresDeterminant0x0002,// 需要逆转置矩阵RequiresFullMatrix0x0004,// 需要完整4x4矩阵NoBatching0x0010,// 禁止批处理CustomCompileStep0x0020// 自定义编译步骤};// 返回Shader程序virtualQSGMaterialShader*createShader()const0;// 材质类型标识——同类型材质可以批处理virtualintcompare(constQSGMaterial*other)const0;};5.2 Qt内置的几种材质// 1. 纯色材质// qtdeclarative/src/quick/scenegraph/utilities/qsgflatcolormaterial.hclassQSGFlatColorMaterial:publicQSGMaterial{QColorcolor()const{returnm_color;}// 生成的Shader极其简洁只在fragment shader中输出纯色};// 2. 纹理材质// qtdeclarative/src/quick/scenegraph/utilities/qsgtexturematerial.hclassQSGOpaqueTextureMaterial:publicQSGMaterial{QSGTexture*texture()const;// 支持Texture Atlas批量渲染};// 3. 顶点颜色材质// qtdeclarative/src/quick/scenegraph/utilities/qsgvertexcolormaterial.h// 每个顶点自带颜色插值渲染5.3 自定义Shader实战// 自定义渐变材质classGradientMaterial:publicQSGMaterial{public:GradientMaterial(){setFlag(Blending);}QSGMaterialShader*createShader()constoverride{returnnewGradientShader;}intcompare(constQSGMaterial*other)constoverride{constauto*ostatic_castconstGradientMaterial*(other);returnm_color1!o-m_color1?(m_color1o-m_color1?-1:1):0;}voidsetColor1(constQColorc){m_color1c;}voidsetColor2(constQColorc){m_color2c;}private:QColor m_color1,m_color2;};// 自定义ShaderclassGradientShader:publicQSGMaterialShader{public:// vertex shaderconstchar*vertexShader()constoverride{returnR( attribute vec4 aPosition; uniform mat4 qt_Matrix; varying vec2 vCoord; void main() { gl_Position qt_Matrix * aPosition; vCoord aPosition.xy; } );}// fragment shaderconstchar*fragmentShader()constoverride{returnR( varying vec2 vCoord; uniform vec4 uColor1; uniform vec4 uColor2; void main() { float t (vCoord.y 1.0) * 0.5; gl_FragColor mix(uColor1, uColor2, t); } );}};六、Texture Atlas与批处理——性能优化的终极武器6.1 Texture Atlas原理Qt Quick将大量小图标/纹理打包成一张大纹理图集大幅减少GPU状态切换// qtdeclarative/src/quick/scenegraph/coreapi/qsgtextureatlas.cppclassQSGTextureAtlas:publicQSGDynamicTexture{// 内部使用TexturePacker算法排列小纹理// 所有使用同一Atlas的节点可以在一次draw call中渲染structEntry{QRectF rect;// 在Atlas中的位置QRectF textureRect;// 纹理坐标 [0,1] 范围QSGTexture*texture;intreserveId;};QVectorEntrym_entries;QImage m_image;// Atlas完整图像};6.2 批处理条件// qtdeclarative/src/quick/scenegraph/coreapi/qsgdefaultrenderer.cppvoidQSGDefaultRenderer::buildDrawLists(){QSGRenderNode*prevnullptr;for(QSGRenderNode*node:m_renderOrder){// 判断是否可以和上一个节点合并渲染// 1. 相同材质类型 (material-compare() 0)// 2. 相同的裁剪/透明度状态// 3. 节点之间没有状态改变矩阵、裁剪等// 4. 材质未设置NoBatching标志boolcanBatchprevprev-material()-type()node-material()-type()!(prev-material()-flags()QSGMaterial::NoBatching)sameClipState(prev,node)sameOpacityState(prev,node);if(canBatch){// 合并到当前批次currentBatch-append(node);}else{// 创建新批次startNewBatch(node);}prevnode;}}一个draw call vs 一百个draw call性能差距可以是10倍以上。这就是为什么Scene Graph界面比传统QWidget流畅的根本原因。七、多后端架构——OpenGL到Vulkan的演进Qt 6对Scene Graph做了彻底重构引入了RHIRendering Hardware Interface抽象层┌──────────────────────────────┐ │ Qt Scene Graph │ ├──────────────────────────────┤ │ RHI (Rendering │ │ Hardware Interface) │ ├────────┬─────────┬───────────┤ │OpenGL │ Vulkan │ Metal │ │(4.1) │ │ (macOS) │ └────────┴─────────┴───────────┘// qtdeclarative/src/quick/scenegraph/coreapi/qsgcontext.cpp// Qt 6.x 中根据平台自动选择后端QSGRendererInterface::GraphicsApiQSGContext::chooseBackend(){// 优先级用户指定 环境变量 平台默认#ifdefQ_OS_MACOSreturnQSGRendererInterface::Metal;#elifdefined(Q_OS_WIN)// Windows优先Vulkan回退到D3D11returnQSGRendererInterface::Vulkan;#elsereturnQSGRendererInterface::OpenGL;#endif}RHI的关键抽象// qtbase/src/gui/rhi/qrhi.hclassQRhi{public:// 顶点缓冲 QSGGeometry的GPU映射virtualQRhiBuffer*newBuffer(QRhiBuffer::Type type,quint32 size,QRhiBuffer::UsageFlags usage)0;// 纹理 QSGTexture的GPU映射virtualQRhiTexture*newTexture(QRhiTexture::Format format,constQSizesize,QRhiTexture::Flags flags{})0;// Shader管线 QSGMaterialShader的GPU映射virtualQRhiGraphicsPipeline*newGraphicsPipeline()0;};八、性能优化实战8.1 使用QSGRenderNode避免节点树膨胀当需要在Scene Graph中嵌入原生OpenGL/Vulkan绘制时classCustomOpenGLNode:publicQSGRenderNode{public:voidrender(constRenderState*state)override{// 直接在这里调用原生GL命令// 避免在Scene Graph树中插入大量中间节点glBindVertexArray(m_vao);glDrawElements(GL_TRIANGLES,m_indexCount,GL_UNSIGNED_INT,0);}// 标记渲染类型帮助渲染器做批处理决策RenderingFlagsflags()constoverride{returnBoundedRectRendering|DepthAwareRendering;}QRectFrect()constoverride{returnm_boundingRect;// 返回渲染区域用于裁剪优化}};8.2 Layer缓存——复杂子树的一次性快照// QML中使用layer.enabled实现 import QtQuick 2.15 Item { id: complexItem layer.enabled: true layer.textureSize: Qt.size(512, 512) layer.smooth: true layer.live: false // 静态内容只在变化时重绘 // 100个子元素...只渲染一次到FBO Repeater { model: 100 Rectangle { /* ... */ } } }原理layer.enabled true会将整个子树渲染到一个FBO帧缓冲对象中作为纹理缓存后续帧直接绘制这个纹理跳过子树遍历。对于复杂但不频繁变化的UI块性能提升巨大。8.3 避免常见的性能陷阱// ❌ 陷阱1在onPainted中频繁创建QSGNodeclassMyItem:publicQQuickPaintedItem{voidpaint(QPainter*painter)override{// 每帧都软件绘制完全绕过GPU加速// 性能灾难}};// ✅ 正确做法继承QQuickItem直接操作Scene GraphclassMyItem:publicQQuickItem{QSGNode*updatePaintNode(QSGNode*old,UpdatePaintNodeData*)override{auto*nodestatic_castQSGGeometryNode*(old);if(!node)nodecreateGeometryNode();// 只更新脏数据复用已有节点if(m_geometryDirty){updateGeometry(node);m_geometryDirtyfalse;}returnnode;}};// ❌ 陷阱2大量绑定导致过度同步Rectangle{width:parent.width/2// ✅ 每帧最多计算一次color:someExpensiveFunction()// ❌ 绑定每帧求值}// ✅ 使用Binding或Timer延迟更新Binding{target:myRect property:colorvalue:someExpensiveFunction()when:needsUpdate}8.4 全屏透明度——最昂贵的操作// ❌ 全屏半透明——GPU需要逐像素混合 Rectangle { anchors.fill: parent opacity: 0.5 // 整个窗口所有内容都要做alpha blend } // ✅ 只对需要透明的元素设置opacity Rectangle { width: 200; height: 200 opacity: 0.5 // 只影响200x200区域 }九、调试与分析工具9.1 内置环境变量# 打印Scene Graph调试信息QSG_INFO1./myapp# 输出每帧的draw call数量QSG_RENDER_TIMING1./myapp# 可视化脏区域QSG_VISUALIZEoverdraw ./myapp# 强制使用软件渲染对比测试QT_QUICK_BACKENDsoftware ./myapp# Qt 6.x - 显示渲染统计QSG_RENDER_DEBUGrender ./myapp9.2 性能分析代码// 在QSGRenderNode中自定义性能统计classPerfMonitorNode:publicQSGRenderNode{voidrender(constRenderState*)override{autostartstd::chrono::high_resolution_clock::now();// ... 实际渲染 ...autoendstd::chrono::high_resolution_clock::now();autousstd::chrono::duration_caststd::chrono::microseconds(end-start);if(us.count()16000){// 超过16ms60fps阈值qWarning()Render node tookus.count()us;}}};十、总结——Scene Graph的核心价值Scene Graph不是一个简单的把QPainter换成OpenGL的方案。它的核心价值在于保留模式渲染——增量更新代替全量重绘线程解耦——GUI线程卡顿不影响渲染帧率批处理引擎——智能合并draw call榨干GPU性能多后端抽象——一套代码适配OpenGL/Vulkan/Metal脏标记系统——精确到节点级别的变更追踪理解了Scene Graph你就掌握了Qt Quick性能优化的金钥匙。当别人还在用QQuickPaintedItem做软件绘制时你已经能用updatePaintNode直接操控GPU管线了。《注若有发现问题欢迎大家提出来纠正》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2621377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…