Scene Management --- scene graph

Unity渲染管线升级指南:从内置管线迁移到URP/HDRP的完整流程 渲染管线是实时图形渲染的核心架构,它定义了从3D场景到最终屏幕像素的完整绘制流程与数据处理逻辑。其原理在于通过可编程的着色器阶段与固定的硬件管线协同,高效组织几何处理、光照计算、纹理采样与后期合成。现代可编程渲染管线(SRP)的价值在于将渲染控制权交还开发者,实现更深度的性能优化与画质定制,尤其适用于移动端高帧率游戏与跨平台项目。在Unity引擎中,通用渲染管线(URP)与高清渲染管线(HDRP)是SRP的具体实现,它们通过ShaderGraph可视化工具与SRP Batcher等机制,大幅提升了材质创作效 阅读详情

Scene Management -- scene graph

仅供个人学习使用,请勿转载,勿用于任何商业用途。   

     

     下面是一个简化的游戏引擎数据流,每一帧,scene data作为数据源,输入到物理/碰撞检测和AI子系统,子系统更新所有物体的状态(包括位置,光照信息等等),之后数据流入渲染系统,最终显式在屏幕上。

         显然,后面两部分的效率都依赖于scene data所传入的数据量大小,所以scene management的目的就是高效的为其他子系统提供数据,他是引擎中最核心的部分。

         对scene management来说,要处理的第一个问题就是如何保存场景数据。为了方便讨论,假设我们的场景只包含非常有限的几个物体:地形,房屋和一个人物角色。最简单的方法就是让3个物体都派生于GameObject类,用一个数组保存所有物体以及他们的位置。每帧直接把数组中的所有元素传递给子系统。当然,还需要提供一些类似GetObjByID()或者GetObjByName()的方法以便查找某个对象。对于只有3个物体的系统来说,遍历数组,找到所需要的对象并没有什么不妥。但是当物体增加到几百或者几千以后,这样的方法就无法满足需求了。因此我们也许想改用dictionary来代替数组,以ID或者对象名作为key,这样,查找一个对象的时间就是常量。当然,我们还是每一帧把dictionary中的所有元素都传递给子系统。

         你大概正在想这样的方法完全没有技术性可言。确实是这样,不过不要小看最简单的方法,某些类似xx团的跳舞游戏就完全可以用这样的方法完成场景管理:摄像机和观察点位置都几乎不变,看到的也只是一个几乎完全静态的场景。所以只需要在Maya或者相应的编辑器里搭建好场景,导出数据保存在文件中,游戏运行时,读取文件,把所有对象保存到dictionary里,然后依次传递给其他子系统,一个xx团克隆就实现了。

         假如你希望写一些比xx团高级的游戏,比如《无冬之夜:山寨版》,由于场景将变的非常大,你考虑的第一步就是如何组织场景。

         注意到原版的无冬里不同地点的很多建筑都是类似的,不同的地下城,相似的房间。你会如何建立这样的场景呢?比如在A点和B点都有非常相似的木屋,又或者酒店里100间完全类似的客房。如果你是Brute Force超级爱好者,也许会在A点搭建一个模型,然后又在B点搭建一个模型,或者在酒店100个不同的位置建立100个相同的模型。考虑到一间木屋可能有n个房间,每个房间里可能有床,柜子,桌子,桌子上有书,刀叉,盘子,盘子里有鱼,鱼身上正站着一只可爱的苍蝇,就算不需要为每个相同的木屋建立独立模型,而是把建好的模型副本分别放到场景中的相应位置,对于有100间木屋的情况来说,也是相当可怕的工作量。

         我们当然不想这样做,理想的方法是搭建好一个木屋,以及里面所有物体,把木屋以及其中的物体作为一个整个,添加到场景时,只需要指定木屋的世界坐标,木屋内的所有物体就能自动获得其相应的坐标。为了达到这样的目标,在建立木屋时,就不能以世界坐标来记录木屋中的物体位置,而要以局部坐标,或者说相对坐标。比如房间A相对于木屋原点的坐标为(0,1),房间B的相对坐标为(0,2),而桌子相对于房间A的坐标又为(0,1),等等。当把屋子放到世界坐标中的(x,y)位置时,房间A的世界坐标就等于(x,y)+ (0,1),桌子的世界坐标则是 (x,y) + (0,1) + (0,1)。局部坐标还能处理一类很常见效果,就是当你装备上一个新武器,比如一把剑之后,无论你的角色如何移动,剑总是在角色的手中。

         因此,scene management的任务除了之前讨论的保存场景中所有物体之外,还需要记录物体之间的相互位置关系以及位置的更新,专业的说法则是保存物体层次结构并提供统一的坐标系统。通常,实现上述功能的系统就称为Scene Graph. 也许你已经听过这个术语无数次,这却是一个非常不精确的术语,因为实际的scene graph的数据通常是tree而非graph,所以在后面的部分,我都使用scene tree来代替scene graph。你肯定想看看一个scene tree是什么样子,下面就是一个例子:

 

Root
|
|----村庄-----房屋A---------房间A-----桌子----。。。。。
|              |                   |
|              |---房屋B      |-- 房间B               
|              |
|              |---房屋C
|
|----野外雕像
|
|
|---玩家A-----火把---火焰----烟雾
|                    |
|                    |--火把光源
|
|----Npc A。。。。。。。。。。

 
       基本上,这就是一个有n个可变节点的树,当然,你也可以使用其它任何你觉得合适的数据结构,只要能完成相同的任务就可以。树中的每个node都保存着两组坐标:世界坐标和局部坐标。每个node的世界坐标都等于其父节点坐标+自身局部坐标。比如,村庄和玩家都链接在跟节点,所以他们的局部坐标就是世界坐标;而房屋A连接在村庄上,他的坐标就等于村庄的世界坐标+房屋A的局部坐标。每当一个节点位置发生变化之后,就遍历其子节点更新坐标,保证火把总是在玩家手中。如果你有实现骨骼动画的经验,就会发现这其实和骨骼动画的原理是一样的,只不过我们把这个想法从模型范围扩大到了整个世界范围。

       特别需要注意的是,纯粹的scene tree描述的是物体的空间逻辑层次关系(很高深的词汇吧,我自己发明的),而并非空间关系!这初看起来有些矛盾,也是scene tree最容易被误解的地方,不过理解2者的区别非常,非常重要。举例来说,房屋A虽然是村庄的子节点,但A可以不在村庄所覆盖的空间范围内,A完全可以在村庄之外的某个山头上,只是我们这里恰好用A相对于村庄的位置作为他的局部坐标而已。更明显的例子是,玩家手中的火把肯定不属于玩家模型所占的空间范围之内,在裁剪时(虽然我们暂时还没讨论到裁剪),你不能说因为玩家是可见的,玩家A的所有子节点(火把,光源,烟雾)就是可见的,火把有可能刚好超出了显示范围。永远不要使用scene tree来进行裁剪,你不会得到任何好结果。如果有人告诉你他用quadtree,BSP或者任何空间划分结构来实现scene tree,那么他得到的肯定不是一个纯粹的scene tree(我会在下一次详细讨论这一点)。

       你可能想到了,可以把储存场景数据的功能合并到scene tree中来,不再需要array或者dictionary,scene tree中的每个节点就是场景中的一个对象。当然,这样就失去了快速访问对象的功能,或者为scene tree编写一些额外的代码以支持对象查找。如果你仍然决定保留最初的dictionary设计,显然,scene tree中的所有对象就仅仅是对dictionary中元素的引用而已。

         目前为止,讨论了scene management两个最基本的任务或者说功能:保存和组织场景数据。既然你已经知道如何组织大型场景,新的问题也来了,你的游戏世界变的很大,覆盖了10w * 10w 大小的区域,有成千上万个对象,显然不能都把这些物体同时加载到内存中,并且全部发送给子系统进行计算,特别是对于最终的渲染结果说,只有一小部分场景是可见的,因此,动态加载和裁减也是scene management必不可少的功能。     
 
        to be continue…….

 

ps: 本来要写关于model design的第三部分,不过后来发现如果不介绍场景管理,实在很难把最终的设计结果说清楚,所以打算先写一部分关于scene management的文章,再继续讨论模型:)

【Unity每日一记】SceneManager场景资源动态加载 场景异步加载 和 资源异步加载 一样。 阅读详情

相关推荐

游戏场景管理框架揭秘:从“我就切个场景”到“大厂那套到底怎么跑的”

现代大型游戏开发中,场景管理框架是关键基础设施,它负责处理游戏场景的无缝切换、资源加载和生命周期管理。文章系统介绍了游戏场景管理的行业需求、架构设计和实现方案,包括分层设计理念、异步资源加载优化、多场景并行支持等核心技术。通过《原神》《王者荣耀》等案例,展示了优秀场景管理框架如何支撑开放世界无缝衔接、高并发赛事场景切换等复杂需求。文章还展望了AI驱动智能加载、云端动态部署等未来趋势,指出场景管理框架正朝着更智能、自适应的方向发展,成为游戏世界的"数字基石"。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 553

Unity3D开发(三):场景管理插件Scene Manager

Unity3d中提供了场景Scene的概念,Scene就是一组相关联的游戏对象的一个集合,通常每个集合就是一个场景,但是也有可能只是一个场景的一部分! 场景中的游戏对象是任意的,可以是HUD的UI组件,场景地图,模型等等 Unity3d提供了一些切换场景的规则和方法(例如在切换场景时不销毁某些GameObject,同步,异步加载场景API),但是并没有提供一个通用的场景管理的模块(想要做到“通...

445822357 1738

COLMAP在Ubuntu下的编译陷阱与实战避坑指南——从环境配置到三维重建全流程

本文详细介绍了在Ubuntu系统下编译和配置COLMAP三维重建工具的全流程,包括环境准备、依赖库安装、CUDA加速配置以及常见编译问题的解决方案。通过实战案例演示了从图像特征提取到稠密重建的完整步骤,并提供了性能优化和问题排查的实用技巧,帮助用户高效完成三维重建任务。

weixin_29003437的博客 1048

UnityAPI-SceneManager

使用前需先引入:using UnityEngine.SceneManagement 1. SceneManager.LoadScene(string, LoadSceneMode) 加载场景,并决定当前场景是否保留 LoadSceneMode是枚举类型 类型 描述 Additive 加载场景保留当前场景 Single 加载场景清除当前场景 2. SceneManager.LoadSceneAsync(string, LoadSceneMode) 协程加载场景 返回:AsyncOper

qq_50682713的博客 1210

云服务器安装ros教程

要在 CentOS 7 系统上安装 RouterOS,您需要将 RouterOS 安装为虚拟机或直接安装到物理硬盘上。这里提供的是将 RouterOS 安装到物理硬盘上的步骤,这将完全替换现有的 CentOS 7 系统。请确保您已经备份了所有重要数据。

qq_37662563的博客 2145

Gromacs基础教程一:入门建议

本系列教程针对的群体:非计算化学专业,而是偏生物方向的、有少量分子动力学模拟需求的人群。

m0_67843839的博客 8572

Unity3D 11-SceneManager场景管理用法总结

一、Unity关卡Unity 使用过程中关卡加载和卸载是大多数三维引擎都要提供的基本功能。 因为关卡切换在游戏中非常常用。 在之前的版本中Unity的关卡切换使用的是:Application.loadedLevel();看看Application类,此时这个类的功能比较繁杂,比较多。只看与关卡相关的: [Obsolete("Use SceneManager.LoadScene")]

Try My Best! 5万+

实测对比:DECIMER、Img2Mol、MolScribe,哪个化学结构识别工具更靠谱?

化学结构识别(CSR)工具的核心任务是将分子结构图像转换为SMILES(Simplified Molecular Input Line Entry System)表示。这一过程需要克服图像质量差异、绘制风格变化以及特殊基团识别等挑战。三款工具采用不同的技术路线:DECIMER:基于EfficientNetV2+Transformer架构,优势在于处理标准期刊文献中的分子图示Img2Mol。

weixin_32576389的博客 342

Scene Management - Scene Graph

http://www.cnblogs.com/soroman/archive/2009/12/31/1637176.html     Scene Graph故名思意就是场景图,或者说是用来组织场景的一种“图”数据结构,通常是以逻辑关系(比如整体-部分)划分数据,当然也有按照其它关系(比如空间关系,状态等)划分数据的。其特点是都是层次结构,层次结构的好处是某个层次的数据的规模相比整体数据能大规

痞子龙3D编程 1362

Python爬虫实战:使用Scrapy+Playwright高效获取电力市场数据

本文将详细介绍如何使用Python构建一个高效的电力市场数据爬虫系统。我们将结合Scrapy框架和Playwright浏览器自动化工具,解决电力市场网站常见的反爬机制,实现数据的稳定抓取。文章包含完整的项目搭建流程、代码实现、数据处理方案以及部署建议,帮助读者掌握现代爬虫开发的核心技术。关键词:Python爬虫、Scrapy、Playwright、电力市场、数据采集、反爬对策python复制下载# 基本字段region = scrapy.Field() # 区域。

2201_76125261的博客 1881

锂电池剩余使用寿命预测(RUL) | 基于Stacked-LSTM-Autoencoder的锂电池寿命多变量多步预测(Tensorflow)

锂电池剩余使用寿命预测(RUL) | 基于Stacked-LSTM-Autoencoder的锂电池寿命多变量多步预测(Tensorflow)

前程算法屋的博客 851

Scene Management -- scene graph

Scene Management -- scene graph http://blog.youkuaiyun.com/soilwork/article/details/3977539 仅供个人学习使用,请勿转载,勿用于任何商业用途。 下面是一个简化的游戏引擎数据流,每一帧,scene data作为数据源,输入到物理/碰撞检测和AI子系统,子系统更新所有物体的状态(包括位置,光照信息等等),之后数据流...

weixin_33757911的博客 140

Spring AI 实战:如何使用 MCP Server 搭建 MCP 天气查询服务

MCP(Model Context Protocol)是 Anthropic 提出的一种开放协议,它定义了AI 模型与外部世界交互的标准方式。通俗地说:大模型本身只拥有训练数据中的知识,它不知道今天的天气、无法查询你的数据库、不能调用你的内部 API。MCP 就是解决这个问题的"桥梁"——它让模型能够发现并使用外部工具(Tools),就像人用手去操作工具一样。角色职责对应依赖MCP Server暴露工具(Tool),供模型调用MCP Client连接 Server,让模型发现和使用工具本文我们先聚焦。

SmartSi 756

Unity Visual Effect Graph 示例项目教程

### 1.1 目录结构 ``` VisualEffectGraph-Samples/ ├── Assets/ │ ├── Scenes/ │ ├── Scripts/ │ ├── Shaders/ │ └── ... ├── Packages/ ├── ProjectSettings/ ├── .gitattributes ├── .gitignore ├── LICENSE

gitblog_00640的博客 468

《AgentScope-Java 深入浅出教程》第8章 工具高级特性

掌握工具组、预设参数、执行上下文等高级特性。

步子哥的博客 265

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

More on Scene Management

 More on Scene Management仅供个人学习使用,请勿转载,勿用于任何商业用途。      相信很多人都看过Tom Forsyth那篇著名的文章>。我第一次看时,只觉得是Tom开的一个小玩笑。不过最近,随着对scene management研究的深入,感觉对于大多数游戏来说,scene graph确实不是那么必须。      由于scene graph实在是一个被严重

Clayman的专栏 3774

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

关于渲染引擎设计,Scene Management的文章

在这里感激各位大虾。GameDev所有和Scene Management相关的文章和帖子,看到各种牛人的讨论,受益匪浅啊,对研究引擎设计非常有用,把部分特别有意思的帖子列出来,希望对你也有帮助:)(以下顺序不分前后)The Technology of a 3D Enginepart 1,part 2,part 3Scene Graph Resourceshttp://www.gam...

weixin_30737433的博客 120

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++ 图形中间件库Magnum详细介绍

Magnum是一个模块化的C++11+图形中间件库,专注于为游戏引擎、AR/VR等应用提供高效的图形开发基础。它封装了OpenGL/Vulkan等API,提供跨平台支持(包括WebAssembly)、数学计算工具、资源管理和场景图系统。Magnum采用轻量级设计,核心依赖Corrade库,强调模块化组合而非全功能引擎。适合需要定制渲染流程的项目,但学习曲线较陡且生态较小。其特点包括现代C++接口、SIMD优化数学库和灵活的资源加载系统,定位介于底层API与完整引擎之间,适合原型开发和专业图形应用。

Tipriest的博客 1043

昇腾CANN/GE数据转储模块设计

--- ### Module Overview #### Module Boundary The Dump module writes operator input/output tensor data, overflow information, and exception context to disk during model execution. You use this data

gitblog_01008的博客 1083

Unity Addressables Profiler:精准定位资源泄漏与性能瓶颈的利器

在Unity游戏开发中,资源管理是性能优化的核心环节,其原理在于通过高效的加载、引用与释放机制控制内存占用。传统的Profiler工具在面对异步加载和引用计数模型时,往往难以精准定位问题根源,导致内存泄漏和性能瓶颈排查困难。Addressables Profiler作为一套深度诊断系统,其技术价值在于将资源在Addressables内部的生命周期状态(如加载、实例化、引用计数)可视化,并结合Debug Layout模式提供完整的调用堆栈与依赖关系链。这使得开发者能够从模糊感知升级到精准定位,有效解决由隐式依

chuiqi9947的博客 347

Unity VR项目升级:解决sampler_CameraDepthTexture报错与渲染管线迁移

在计算机图形学中,深度纹理是渲染管线中用于存储场景深度信息的关键资源,广泛应用于后期处理、遮挡检测和立体视觉等场景。其原理是通过存储每个像素到摄像机的距离,为着色器提供几何空间关系数据。在Unity引擎中,深度纹理的管理方式随着渲染管线的演进发生了根本性变化——从Built-in渲染管线的全局隐式管理,转变为Universal Render Pipeline(URP)中的显式声明与传递。这一变革对于依赖深度信息的VR开发尤为重要,因为VR应用对渲染性能、帧率稳定性和立体视觉一致性有着严苛要求。在项目升级过程

hqmln的博客 549

Unity开发从入门到精通:系统学习路径与核心模块深度解析

在游戏开发与实时3D内容创作领域,Unity引擎因其强大的跨平台能力和丰富的生态系统,成为众多开发者的首选工具。其核心原理基于组件化架构,通过GameObject与MonoBehaviour的组合,实现了灵活的实体行为管理。这一设计为快速原型开发提供了便利,但要在生产环境中构建高性能、可维护的项目,则需深入理解其底层机制。技术价值体现在能够显著提升开发效率、优化运行时性能,并支持从移动端到主机、VR/AR的多样化应用场景。本文聚焦于Unity学习中的核心挑战,系统拆解了从快速原型到性能优化的进阶路径,并深入

weixin_33912638的博客 703

昇腾CANN/GE编码红线

### 1. Prohibit Hardcoding Sensitive Information and Using Prohibited Sensitive Words 1. Hardcoding plaintext passwords, keys, and other high-level sensitive data in source code. 2. Having deprecated

gitblog_00724的博客 361
上一篇: 0.033秒的艺术 --- 二叉树遍历
下一篇: 3D Game Engine Design, Second Edition --- Go to Get it !
soilwork
博客等级 码龄23年 290粉丝 116原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值