10. CPU-GPU协作渲染

1.GPU是如何知道要渲染对象

2.CPU 怎么知道 GPU 渲染完毕

3.GPU 的显存数据是什么时机上传的


1.GPU是如何知道要渲染对象

GPU是典型的"被动执行设备",自己不会主动渲染,所有渲染任务都由CPU通过"命令缓冲区(Command Buffer)"下方,流程分 四步:1).CPU准备"渲染材料"+"执行指令"游戏每帧,CPU会先完成"应用阶段"的工作 a.准备数据:计算模型的世界坐标,骨骼动画顶点,材质参数(比如颜色,纹理采样器),将这些数据整理成GPU能识别的格式 b.准备指令:明确告诉GPU"要做什么",比如:-绑定哪个Shader程序-绑定哪个纹理/顶点缓冲区-执行DrawCall(绘制命令,比如"绘制这个模型的1000个三角形")-设置渲染目标(比如把画面画到帧缓冲区,还是RenderTexture)
2).CPU把"指令 + 数据地址"打包到命令缓冲区 CPU不会直接和GPU对话,而是通过图形驱动,把上述"指令 + 数据在显存的地址"写入一块GPU可以访问的内存区域(命令缓冲 区)a.命令缓冲区里不存原始数据(比如顶点,纹理),只存"数据的显存地址""操作指令"(比如:绑定地址0x123的纹理)b.Unity的CommandBuffer类,就是对底层命令缓冲区的封装-可以手动创建CommandBuffer,添加绘制指令,再提交给GPU 实现自定义渲染逻辑
3).CPU把命令缓冲区提交到GPU的命令队列 当CPU把一帧的渲染指令都打包进命令缓冲区后,会通过图形API(比如:Dx12的ExecuteCommandLists),将命令缓冲区提交 到GPU的命令队列 a.命令队列是GPU内部的"任务排队区","先提交先执行"的顺序处理 b.此时CPU的工作就暂时结束了,可以去处理下一轮的游戏逻辑,不用等GPU渲染完
4).GPU主动"取任务 + 执行渲染"GPU内部有一个"命令处理器(Command Processor)",会持续轮询命令队列 a.一旦发现队列里有新的命令缓冲区,就将它取出来 b.按指令顺序执行:绑定shader->绑定显存数据->执行DrawCall->逐像素渲染 c.整个过程完全由GPU硬件独立完成,无需CPU干预
Unity中的直观例子:脚本中调用Graphics.DrawMesh(mesh,matrix,material,layer),本质就是让CPU往命令缓冲区里添加了一条"绘制这个""Mesh"的指令,最终提交给GPU执行

2.CPU 怎么知道 GPU 渲染完毕

CPU和GPU是"异步并行工作"(CPU处理下一帧逻时,GPU还在渲染上一帧),CPU要获知GPU渲染完成,靠的是硬件同步原语,核 心有两种方式:1).同步等待(阻塞CPU)-低性能,仅调试用 这是最直接但最影响性能的方式,原理是"CPU主动等GPU发完成新号"a.CPU提交命令缓冲区时,会创建一个"围栏(Fence)",将这个围栏和命令缓冲区绑定 b.围栏有两种状态:未触发(GPU未完成)/已触发(GPU完成)c.CPU调用WaitForFence()函数,主动等待围栏状态变为"已触发"-此时CPU会完全阻塞,不处理任何任务,直到GPU渲染完毕 d.GPU执行命令缓冲区的所有指令后,会自动把绑定的围栏标记为"已触发",CPU收到信号后才继续工作
Unity中的对应操作 调用Graphics.WaitForPresent()或AsyncGPUReadback.WaitForCompletion()本质就是触发同步等待,游戏运行时绝对要避免

2).异步通知(不阻塞CPU)-高性能,游戏开发主流 这是最优解,原理是"GPU完成后主动给CPU发回调信号, CPU无需等待, 可继续处理其他任务"a.CPU提交命令缓冲区时,注册一个回调函数,并绑定一个"信号量(Semaphore)"b.GPU执行完渲染指令后,会触发信号量,并通过图形驱动通知CPU"任务完成"c.CPU收到信号后,在空闲时执行回调函数(比如:处理渲染结果,读取RenderTexture像素,更新UI显示)d.整个过程CPU完全不阻塞,始终在处理游戏逻辑,只有收到信号后才花少量时间执行回调
Unity中的核心应用 a.AsyncGPUReadback:读取显存中RenderTexture的像素数据时,用AsyncGPUReadback.Request(texture,(request)=>{if(request.hasError)return;vardata=request.GetData<Color>();})—— 这个Lambda表达式就是异步回调函数 GPU读取完成后才会执行 b.URP/HDRP的后处理回调:比如在渲染完成后执行高斯模糊,本质也是GPU触发的异步回调

3.GPU 的显存数据是什么时机上传的

显存数据(纹理,顶点,shader等)的上传时机,核心原则是"静态资源一次性上传, 动态资源每帧按需上传",完全由CPU主动 发起,分两种场景:1).静态资源(长期复用)-加载时一次性上传,常驻显存 静态资源表示"游戏运行中很少变化的资源",比如场景模型,UI纹理,Shader程序,上传时机资源加载完成后,第一次使用前 a.CPU从硬盘加载资源(比如AssetBundle加载纹理/模型),先把压缩数据放到内存 b.CPU调用图形API(比如Dx12CreateCommittedResources),向GPU申请一块显存空间 c.CPU通过PCle总线,把内存中的静态资源数据一次性拷贝到显存(压缩格式,比如ETC2/ASTC,无需解压)d.资源上传完成后,会在显存中常驻,直到游戏退出或主动释放(比如Texture2D.Destroy)e.后续每帧渲染时,CPU只需在命令缓冲区中"绑定显存地址",无需重复上传
Texture2d.uploadedToGPU-这个属性为true,说明该纹理已经上传到显存,内存中只保留一份轻量级数据,原始数据会 被Unity自动释放(节省内存)2).动态资源(每帧变化)-每帧提交DrawCall前,实时上传 动态资源指"每帧都会变化的资源",比如粒子系统的顶点数据,骨骼动画的蒙皮顶点,动态生成的RenderTexture,上传时机 是"每帧CPU准备渲染指令时, 提交DrawCall前"a.每帧游戏逻辑阶段,CPU计算动态资源的最新数据(比如粒子的新位置,骨骼的新姿态),更新内存中的顶点缓冲区 b.CPU调用"更新显存"指令(比如Dx12的UpdateSubresource),将内存中更新后的动态数据拷贝到显存的"动态区域"-这里的拷贝是"增量拷贝(只传变化的部分, 不是全量)",减少PCIe总线压力 c.数据上传完成后,CPU才会把"绑定该动态资源"的指令写入命令缓冲区,提交给GPU d.GPU渲染时,直接从显存的动态区域读取最新数据

延迟上传(懒加载)-Unity的默认优化 Unity对静态资源默认采用"延迟上传"策略 a.资源加载后,不会立刻上传到显存,而是等"第一次被渲染时"才触发上传 b.比如你加载了一个场景纹理,但前10帧都没有用到它,Unity不会浪费显存和PCIe带宽区上传,直到第11帧它被绑定到材质 上,才会由CPU发起上传
CPU-GPU协作+数据上传的一帧流程 a.CPU游戏逻辑阶段:计算 AI、物理碰撞、更新模型位置,生成动态顶点数据 b.CPU数据上传阶段-静态资源:若未上传则延迟上传-动态资源:增量拷贝到显存动态区域 c.CPU指令打包阶段:构建命令缓冲区,写入"绑定资源 + 执行 DrawCall"指令 d.CPU提交阶段:把命令缓冲区提交到GPU命令队列,注册异步回调 e.GPU执行阶段:从命令队列取指令,执行渲染,输出画面到屏幕 f.同步阶段:GPU渲染完成,触发信号量,CPU执行回调(比如读取渲染结果)g.回到步骤1,开始下一帧

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

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

相关文章

学霸同款8个AI论文写作软件,继续教育学生轻松搞定论文!

学霸同款8个AI论文写作软件&#xff0c;继续教育学生轻松搞定论文&#xff01; AI 工具如何让论文写作更高效&#xff1f; 在当前的学术环境中&#xff0c;AI 工具已经成为许多学生和研究者不可或缺的助手。尤其是在继续教育领域&#xff0c;面对繁重的课程任务和论文写作压力…

Kibana中操作索引返回201:深入理解Elasticsearch创建成功机制

Kibana 中创建索引返回 201&#xff1f;别急&#xff0c;先搞懂 Elasticsearch 的“成功”到底意味着什么你有没有在 Kibana 的Dev Tools 控制台里敲下一行PUT /my-index&#xff0c;按下运行&#xff0c;看到绿色对勾和201 Created的那一刻&#xff0c;心里默默松了口气&#…

3.1 File

1.文件基础操作 2.文件读取操作 3.文件写入操作 4.文件属性/状态判断1.文件基础操作using System; using System.IO;class FileBasicOps {static void Main(){string sourcePath "test.txt";string copyPath "test_copy.txt";string movePath "new…

Thinkphp-Laravel人脸识别考勤管理系统

目录技术架构与框架选择核心功能模块安全与性能优化应用场景与优势项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理技术架构与框架选择 ThinkPHP-Laravel人脸识别考勤管理系统采用混合框架设计&#xff0c;结合ThinkPHP的高效开发特性与Laravel的…

WinDbg在蓝屏诊断中的项目应用详解

从崩溃中破译真相&#xff1a;WinDbg实战解析蓝屏背后的系统密码你有没有遇到过这样的场景&#xff1f;客户急匆匆发来一张蓝屏截图&#xff0c;上面只有一行冰冷的错误代码0x000000D1&#xff0c;再无其他信息。运维团队一头雾水&#xff0c;硬件工程师怀疑内存条老化&#xf…

向量数据库全生命周期管理终极指南:从部署到亿级数据运维,收藏级干货助你打造高性能AI检索系统

向量数据库需全生命周期管理&#xff0c;涵盖数据导入、索引构建、监控、更新和清理五大阶段。核心挑战包括嵌入漂移、索引衰退和数据时效性等。通过构建幂等性导入流水线、实施定期索引维护、建立质量监控体系、采用原子化更新机制及执行严格留存策略&#xff0c;可确保系统在…

Thinkphp-Laravel基于Vue的健身房信息管理系统_q3su4

目录系统概述技术栈核心功能系统优势应用场景项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理系统概述 Thinkphp-Laravel基于Vue的健身房信息管理系统是一个结合后端框架&#xff08;ThinkPHP与Laravel&#xff09;和前端框架&#xff08;Vue.js&…

开源远程桌面工具RustDesk详解:绿色便携、无需注册的远程控制新选择

在远程办公、IT运维和异地协作日益普及的今天&#xff0c;一款稳定、安全且成本可控的远程桌面工具至关重要。虽然TeamViewer、AnyDesk等软件广为人知&#xff0c;但其免费版的限制和商业版的费用常令用户却步。RustDesk​ 作为一款由Rust语言编写的开源项目&#xff0c;以其开…

收藏!揭秘:90%的前端AI项目都是“伪AI“,大厂级AI产品的前端核心能力深度解析

文章揭示了当前前端AI开发的现状&#xff1a;多数项目仅停留在简单调用API的Demo阶段。真正的企业级AI产品需要前端掌握流式输出、模型状态管理、Tool Calling调度等核心能力&#xff0c;将AI产品视为状态机UI而非简单聊天框。前端开发者需深入理解AI模型工作原理&#xff0c;参…

【必看收藏】LangChain v1.0大更新!create_agent核心功能详解,让你的AI助手更强大

LangChain v1.0更新后&#xff0c;create_agent成为核心入口&#xff0c;可统一配置模型、工具和中间件。Tool作为AI的"手脚"&#xff0c;通过tool装饰器定义&#xff0c;让AI能执行实际操作。Middleware则可在模型调用前后插入自定义逻辑&#xff0c;实现业务解耦。…

Edge浏览器143便携版:基于Chromium内核的官方增强,免安装更轻便

随着Chromium内核的Edge浏览器在性能、兼容性和扩展生态上的显著提升&#xff0c;它已成为许多用户替代Chrome的首选。然而&#xff0c;官方安装版会深度集成到系统中。这个便携版则提供了另一种更灵活的使用方式&#xff0c;既保留了Edge的全部功能&#xff0c;又具备了绿色软…

从零实现数字信号观测:Proteus示波器使用方法

从零开始玩转数字信号&#xff1a;手把手教你用Proteus示波器看懂电路“心跳”你有没有过这样的经历&#xff1f;写了一段单片机代码&#xff0c;烧进芯片后LED就是不闪&#xff1b;或者搭了个555振荡电路&#xff0c;万用表测电压正常&#xff0c;可信号就是不对劲。这时候要是…

基于Windows的Packet Tracer网络仿真项目应用实例

用Packet Tracer搭建企业网&#xff1a;从零开始的实战仿真之旅你有没有遇到过这种情况&#xff1f;学了一堆网络协议&#xff0c;背了无数命令行&#xff0c;可一到真机配置就手忙脚乱——IP配错了、路由不通、ACL莫名其妙拦掉了流量……别急&#xff0c;这不是你不够努力&…

Thinkphp-Laravel基于体能分析的个性化健身方案生成

目录 基于体能分析的个性化健身方案生成数据采集与处理方案生成逻辑动态调整与反馈技术实现要点 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 基于体能分析的个性化健身方案生成 ThinkPHP和Laravel作为流行的PHP框架&#xff0c;能够高效支持…

智能体路由模式深度解析:4种实现方式+5步落地方法,收藏级干货

路由模式是智能体系统的"动态决策中枢"&#xff0c;通过"接收输入→评估决策→导向路径"的闭环&#xff0c;让智能体从固定流程升级为上下文感知的决策者。文章详解了4种主流实现方式&#xff08;基于LLM、嵌入、规则、机器学习模型&#xff09;的优缺点和…

上升下降时间对比:TTL与CMOS开关特性的深度解析

上升时间与下降时间之争&#xff1a;TTL 和 CMOS 到底谁更快&#xff1f; 你有没有遇到过这样的问题&#xff1a;明明逻辑功能都对&#xff0c;信号波形一上示波器&#xff0c;边沿却“软绵绵”的&#xff1f;时序勉强过关&#xff0c;但系统一提速就出错&#xff1f;噪声干扰下…

Java中的三大特性 - 超详细篇_java类的三特性探讨,零基础入门到精通,收藏这篇就够了

前言 这一节的内容可能有点多&#xff0c;大家可以选择性的来看 简介 Java的三大特性&#xff1a;封装、继承、多态 乍一听&#xff0c;好像很高大上&#xff0c;其实当你真正用的时候&#xff0c;会发现高大上的还在后面呢。。。 热身 在正式讲解三大特性之前&#xff0…