资讯详情

资讯详情

Godot 渲染帧缓冲缓存 FramebufferCacheRD 完全指南:RenderingDevice 多通道帧缓冲的复用与生命周期管理

文档教程游戏开发【免费下载链接】godot-docsGodot Engine official documentation项目地址https://gitcode.com/GitHub_Trending/go/godot-docs点击查看免费下载导读FramebufferCacheRD 是 Godot 引擎中面向RenderingDevice系渲染器Vulkan、Direct3D 12、Metal、WebGPU 等现代低层图形 API的帧缓冲Framebuffer缓存管理器。它的核心价值在于当你反复创建结构相同的帧缓冲时无需重复申请 GPU 资源而是直接复用已有对象并在所依赖的纹理Texture被释放时自动完成清理。阅读本文后你将掌握如何通过其静态方法get_cache_multipass()创建并复用单通道/多通道帧缓冲、如何用RDFramebufferPass描述子通道与附件布局以及理解缓存生命周期与底层RenderingDevice相关接口的协作方式从而写出更高效、更省内存的自定义渲染管线代码。一、FramebufferCacheRD 是什么根据 class_framebuffercacherd.rst 的定义Framebuffer cache manager for RenderingDevice-based renderers.FramebufferCacheRD 是一个用于「基于 RenderingDevice 的渲染器」的帧缓冲缓存管理器继承自Object。它的设计目标非常明确创建帧缓冲并复用为后续调用提供一种「先创建、后复用」的帧缓冲获取方式只要所用纹理依然存在就可以反复取到同一个帧缓冲对象自动清理当依赖的纹理等对象被释放时缓存的帧缓冲会自动随之清理无需手动追踪资源生命周期。这与RenderingDevice.framebuffer_create()直接创建帧缓冲需要自己持有 RID 并调用free_rid()释放形成了鲜明对比。FramebufferCacheRD 把「创建、缓存、复用、随依赖自动失效」这几件事封装成一个静态入口显著降低自定义渲染代码的样板负担和资源泄漏风险。二、RenderingDevice 与帧缓冲的基础概念在深入缓存机制之前需要先理清上下文。Godot 的 RenderingDevice 是「面向现代低层图形 API如 Vulkan的抽象层」比RenderingServer低得多允许你更直接地与底层图形 API 交互例如使用计算着色器Compute Shader、自定义渲染管线等。关键获取途径来自 class_renderingserver.rstRenderingServer.get_rendering_device()获取 Godot 启动时创建的全局 RenderingDevice用于绘制到屏幕RenderingServer.create_local_rendering_device()创建「次要」RenderingDevice可在独立线程上执行绘制与 GPU 计算。两点重要限制记录在 RenderingDevice 文档中RenderingDevice 假定你已具备现代图形 APIVulkan、Direct3D 12、Metal、WebGPU的中级知识在Headless 模式或使用Compatibility 渲染方法时RenderingDevice 不可用——因此 FramebufferCacheRD 仅适用于 ForwardVulkan等基于 RenderingDevice 的渲染路径。帧缓冲Framebuffer是渲染目标颜色附件、深度附件等纹理与渲染通道Render Pass的组合RenderingDevice.draw_list_begin()等绘制入口都以帧缓冲 RID 作为参数。FramebufferCacheRD 正是围绕这一组合提供缓存服务。三、核心 APIget_cache_multipass 静态方法FramebufferCacheRD 对外只暴露一个静态方法完整签名来自 class_framebuffercacherd.rststatic RID get_cache_multipass( textures: Array[RID], passes: Array[RDFramebufferPass], views: int ) → RID因为是static方法调用时无需实例化直接使用类名调用即可var fb_rid: RID FramebufferCacheRD.get_cache_multipass(textures, passes, views)3.1 三个参数的语义参数类型含义texturesArray[RID]列出本帧缓冲所访问的纹理 RID 列表颜色附件、深度附件等passesArray[RDFramebufferPass]定义子通道subpass与纹理分配方式若为空数组则自动创建单通道帧缓冲并根据纹理的使用标志usage flags分配附件viewsint渲染时使用的视图view数量方法行为创建或获取一个缓存的帧缓冲。若缓存中已有「相同纹理集合 相同子通道布局」的帧缓冲直接返回其 RID不再重新创建 GPU 资源若不存在则创建新帧缓冲并放入缓存只要传入的纹理仍然存活缓存项就持续有效纹理被释放时缓存自动失效。3.2 单通道与多通道的差异passes留空生成一个单通道single-pass帧缓冲。纹理如何作为颜色/深度/输入附件使用由各纹理创建时携带的 usage flags 决定。这是最常见、最简单的情形适合大多数自定义渲染目标组合。passes非空生成多通道multipass帧缓冲由RDFramebufferPass数组精确描述每个子通道的附件布局支持输入附件input attachment、保留附件preserve、MSAA 解析附件resolve等高级配置。需要留意的是multipass 帧缓冲在移动端可以优化某些配置而在桌面端几乎不会带来优势见 class_rdframebufferpass.rst 的说明。因此是否使用多通道应结合目标平台与渲染场景权衡。四、用 RDFramebufferPass 描述子通道附件passes参数的元素类型是 RDFramebufferPass它继承自RefCounted用于「描述一次帧缓冲通道的附件列表」。每个附件通过索引指向textures参数中提供的纹理 RID 列表从而把「纹理」与「附件角色」解耦。4.1 属性总览与默认值属性类型默认值含义color_attachmentsPackedInt32ArrayPackedInt32Array()从 0 开始的颜色附件列表若某槽位未被着色器使用传ATTACHMENT_UNUSED跳过depth_attachmentint-1深度附件不需要深度缓冲时使用ATTACHMENT_UNUSED即 -1input_attachmentsPackedInt32ArrayPackedInt32Array()用于多通道帧缓冲把一个附件转为输入附件需同时在RDUniform中正确提供preserve_attachmentsPackedInt32ArrayPackedInt32Array()本通道需要保留的附件否则会被擦除resolve_attachmentsPackedInt32ArrayPackedInt32Array()当颜色附件为多重采样MSAA时可提供非多重采样的解析附件常量ATTACHMENT_UNUSED -1表示「该附件槽位未使用」。4.2 一个多通道的构造示例var fb_pass : RDFramebufferPass.new() # textures 数组索引0 颜色附件纹理, 1 深度纹理, 2 输入附件纹理 fb_pass.color_attachments PackedInt32Array([0, RDFramebufferPass.ATTACHMENT_UNUSED]) fb_pass.depth_attachment 1 # 多通道把纹理 2 作为本通道的输入附件需在 RDUniform 中一并注册 fb_pass.input_attachments PackedInt32Array([2]) var passes : PackedInt32Array() # 注应按类型使用 Array[RDFramebufferPass] passes.append(fb_pass) var fb_rid : FramebufferCacheRD.get_cache_multipass( [color_tex_rid, depth_tex_rid, input_tex_rid], passes, 1 # views )注意PackedInt32Array的返回值是拷贝修改它不会改变属性本身正确的做法是先用get_color_attachments()取回再整体set_color_attachments()或如上例直接对属性整体赋值。五、与 RenderingDevice 原生创建接口的对比RenderingDevice提供了一系列更底层的帧缓冲创建接口来自 class_renderingdevice.rstFramebufferCacheRD 可以看作这些接口之上的「缓存封装」接口说明framebuffer_create(textures, validate_with_format -1, view_count 1)创建普通帧缓冲当任一纹理被释放时自动释放framebuffer_create_multipass(textures, passes, validate_with_format -1, view_count 1)创建多通道帧缓冲生命周期规则同上framebuffer_create_empty(size, samples 0, validate_with_format -1)创建空帧缓冲framebuffer_format_create(attachments, view_count 1)创建帧缓冲格式含多视图/VR 的 multiview 支持framebuffer_format_create_multipass(attachments, passes, view_count 1)创建多通道帧缓冲格式free_rid(rid)显式释放 RID可以看到get_cache_multipass的三个参数textures、passes、views与framebuffer_create_multipass的核心参数一一对应前者不做格式校验无validate_with_format并把view_count简化为views。区别在于原生接口每次调用都会新建 RID 且需要手动free_rid()而缓存版本在结构相同相同纹理集合与通道布局时直接命中缓存返回既有 RID。当passes留空时缓存内部相当于执行一次「按 usage flags 自动分配附件的单通道创建」从而在语义上贴近framebuffer_create的便捷性。从源码结构推断缓存的键key应当由纹理 RID 集合与子通道配置共同构成这正是textures与passes必须保持稳定有序的原因——顺序或内容变化会产生新的缓存项。六、生命周期与自动清理机制FramebufferCacheRD 的两条生命周期规则来自 class_framebuffercacherd.rst 的类描述只要所用纹理存在帧缓冲即可复用即缓存项的生命周期被绑定到纹理 RID 的存活周期依赖对象被释放时缓存自动清理当textures中的任一纹理 RID 被释放例如调用RenderingDevice.free_rid()或纹理对象析构对应的帧缓冲缓存条目会自动失效并被回收。这与RenderingDevice.framebuffer_create()文档中的描述一致「当任一纹理被释放时本帧缓冲会自动释放」。FramebufferCacheRD 正是借用了这一底层语义来实现自动清理使用者无需维护复杂的「帧缓冲 → 纹理」引用计数。七、在自定义渲染管线中的典型用法FramebufferCacheRD 通常用于需要反复「绑定同一组渲染目标」的引擎级或插件级自定义渲染代码例如创建若干渲染目标纹理颜色纹理、深度纹理、必要时加输入附件纹理在每帧渲染前调用FramebufferCacheRD.get_cache_multipass(...)获取或复用帧缓冲 RID将其传给RenderingDevice.draw_list_begin(framebuffer, ...)开始绘制通道绘制结束后draw_list_end()无需手动释放帧缓冲——缓存在纹理释放时自动回收。# 每帧获取或复用帧缓冲的惯用写法 var fb : FramebufferCacheRD.get_cache_multipass( [color_rid, depth_rid], [], # 空 passes → 单通道附件按纹理 usage flags 分配 1 # 单视图 ) var draw_list : rd.draw_list_begin(fb, RenderingDevice.DRAW_FLAG_CLEAR_COLOR) # ... 绑定管线、描述符、执行绘制 ... rd.draw_list_end()如果需要 VR / 立体渲染可把views设为 ≥ 2其语义对应RenderingDevice.framebuffer_format_create()中view_count ≥ 2时启用的 multiview要求 Vulkan multiview 扩展支持。八、使用注意与限制仅限 RenderingDevice 系渲染器FramebufferCacheRD 是RenderingDevice的配套缓存Headless 模式与 CompatibilityOpenGL/WebGL渲染方法下不可用多通道收益视平台而定移动端可能因多通道配置获得优化桌面端通常无显著收益见 class_rdframebufferpass.rst按需使用而非无脑多通道参数的一致性即缓存命中率textures与passes的顺序和内容决定了缓存键建议保持稳定的构造顺序以提高复用率输入附件需双端注册使用input_attachments时除了在RDFramebufferPass中声明还必须在对应的RDUniformuniform set中正确提供该附件否则渲染结果不符合预期PackedInt32Array 为拷贝语义读取属性后再修改数组不会写回对象需整体 set/get。九、小结FramebufferCacheRD 用「一个静态入口 自动生命周期」把 RenderingDevice 的帧缓冲创建、缓存、复用与释放整合为一致的体验传入纹理 RID 集合、可选的RDFramebufferPass子通道描述与视图数量即可获得一个随纹理存活而有效、随纹理释放而自动清理的帧缓冲 RID。配合 RDFramebufferPass 的附件描述能力与 RenderingDevice 的原生帧缓冲接口开发者可以在自己的渲染管线或插件中安全、高效地管理 GPU 渲染目标避免重复分配与资源泄漏。如需进一步学习底层概念可参考 RenderingDevice 文档所指向的计算着色器教程tutorials/shaders/compute_shaders.rst。赞分享文档教程游戏开发【免费下载链接】godot-docsGodot Engine official documentation项目地址https://gitcode.com/GitHub_Trending/go/godot-docs点击查看免费下载相关推荐如何使用WaybackProxy在5分钟内访问历史网页简单教程与配置指南如何使用WaybackProxy在5分钟内访问历史网页简单教程与配置指南 WaybackProxy是一款强大的HTTP代理工具能够通过互联网档案馆Wayba如何使用Sokol实现高性能帧缓冲跨平台渲染技术完全指南如何使用Sokol实现高性能帧缓冲跨平台渲染技术完全指南 Sokol是一个轻量级跨平台C语言头文件库提供了简洁而强大的API来处理帧缓冲等高级渲染技术。本文图形学3D渲染游戏开发如何掌握bgfx帧缓冲管理多渲染目标与高级后处理效果终极指南如何掌握bgfx帧缓冲管理多渲染目标与高级后处理效果终极指南 bgfx作为一款跨平台、图形API无关的渲染库其帧缓冲管理功能是构建现代图形渲染管线的核心技术图形学3D渲染游戏开发上一篇Corsair API2PDF 插件指南在应用中集成 HTML/PDF 生成、转换与条码能力下一篇Bootique现代Java应用的极简平台如何用最少配置构建高性能应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →