开放大世界的数据管理

embedded/2024/9/24 8:24:57/

        经过前面几个章节的介绍,开放世界的数据管理就已经初具雏形了。实际上,开放世界数据最麻烦的,就是各种地图渲染数据。如果地图渲染数据解决了,逻辑数据处理起来也是相对容易的。所以这里讲的,核心也是在地图渲染数据。

        这个视频是使用这一套技术整出来的Demo,有美术的配合就好看很多了。

Island_G效果演示(8月版本)_哔哩哔哩_bilibili岛屿效果演示视频,项目中的Island_G。除了常规的天气、后期等,此版本主要增加了草海效果。这个版本的草海是根据新的草海插件美术手动绘制的,在CPU多线程进行渲染。目前此版本没有接入 Gpu Instance 对场景静态物件的渲染,但显示效果相同,只是性能会差些。, 视频播放量 88、弹幕量 0、点赞数 1、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 魔术师dix, 作者简介 我们这么努力,不是为了改变世界,而是为了不让世界改变我们。,相关视频:玲珑岛12贴图版本_1.0,原型工程1.0演示视频,GpuTerrain+草海,Unity3D 战斗系统核心技术: 高度可扩展的技能与多Buff系统(收藏级),Xlua热更新版本检查与更新机制详解,【Unity3D/资产发布】拟真向URP海面渲染系统——HigWaterSystem,新的场景试玩,转载巴哈《怪物猎人:荒野》煌雷龙、沙海龙等讨伐演示,Houdini开放世界欣赏,unity教程零基础全套合集15节(Unity实战案例-弹幕射击)2024最新游戏制作开发教程icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Hu4y1d75p

1、数据梳理

        这里需要确保大家看过之前的几篇文章:

GPU驱动的大规模静态物件渲染-CSDN博客基于 Dots + GPU Instance 的大规模物体渲染-CSDN博客【Unity】移动端草海解决方案_unity 移动端 不交草-CSDN博客        

        通过上述几篇文章,整理出需要的数据如下:

  • 地形的高度法线图(512*512,每块地形固定1张)
  • 地形的AlphaMap(512*512*N,N为支持的地形贴图数量/4,例如12种贴图就需要3张)
  • 地形贴图(不定尺寸,全局通用一套)
  • 草海密度图(512*512,每块地形固定1张)
  • 静态物件数据(按照地块、LOD或者逻辑划分,不定尺寸)
  • 物件网格、材质球(全局通用)

        通过上述整理,我们发现,其实只有在视野范围内的 512*512 的地块的独特数据是需要动态加载的,其余的都可以提前预载准备好。至于物件网格、材质球这些,甚至可以等用到了的时候再加载(懒加载)。

        如下图所示,整个地图都可以直接切分成棋盘格模式进行管理:

2、AOI 管理

        相信各位看上文,心里就已经把 AOI 喊出来了。我们将地图设计为规整棋盘格模式,确实太适合使用 AOI 管理了。我这里处理是将地图按照 512*512 进行分块,当相机移动到 AOI 范围内之后去加载对应数据,离开了则卸载。

AOI效果演示

        我这里做的其实是个简化版本,通过相机计算出当前需要显示的最大最小点,然后直接框出来多个 AOI 块,然后分别处理激活/卸载等逻辑。

3、资源管理

        我在处理资源时,加入了缺省资源用于辅助。即:如果有正式资源,就用正式的,如果尚未加载出来就用缺省资源。在开发上,缺省资源很方便地处理了流程上各种判空。反正每一个模块总是能取到代码上正确的值,等正式加载完成之后再替换一下图片之类的就行了。

        对于网格和材质球,因为用到时都是在最后一步上屏的时候才需要调用,所以就直接在最后判定即可。如果发现这个网格需要渲染就加载,过一段时间清理下很久没有使用过的网格。如果没有加载出来,就直接不上屏就行。

4、流式加载

        前文所述,其实整个资源已经被我拆得很碎了,图片的最小单位是 512*512 的图片,在硬盘上少的几十,多的几百KB,对于现代手机来讲基本不存在加载瓶颈。至于网格、材质球等其他资源,已经精确到单一网格,在异步处理时也感受不到 IO 造成的性能瓶颈。

        对于 GpuInstance 的静态数据,这里我是用二进制流的模式存的(自己写加载写入的方式),也就是 C# 的 Binary/FileStream 模式,这个方法的读取速度可以是最快的(比Json快得多)且内存占用最小。而且我是放在多线程中操作的,对于玩家基本无感。

        而且上述这些资源,少调任何一个都不会影响框架正常运转,也不会影响逻辑,都可以异步。所以通过多线程、异步资源加载等方式,整个地图的 IO 影响非常少。

其他

        地图管理其实是比较简单的,因为之前已经把数据组织成方便处理的结构了。我在开发上更多的是遇到的数据加载、卸载、对接资源加载插件等。

        对于网络数据、游戏逻辑相关的地图数据,这里就没有涉及,后面单开一章来讲。


http://www.ppmy.cn/embedded/101803.html

相关文章

Stable Diffusion【XL Lora】推荐!AI助力服装设计,让服装拆分设计就是这么高效!

今天给大家介绍一个服装饰品分类背景的基于SDXL的Lora模型:分类背景 XUER。该模型是由作者(B站绪儿已成精)炼制,非常适合饰品服装分类背景。绪儿大佬其实推出了很多非常棒的模型,比如之前非常受大家喜欢的敦煌飞天、超…

【Python机器学习】NLP概述——聊天机器人的自然语言流水线

构建对话引擎或者聊天机器人所需的NLP流水线类似于某些问答系统。 聊天机器人需要4个处理阶段和一个数据库来维护过去语句和回复的记录。这4个处理阶段中的每个阶段都可以包含一个或多个并行或串行工作的处理算法。如下图所示: 1、解析:从自然语言文本中…

Java字符串练习

StringAPI Exercise package JavaExercise120240827;public class JavaExercise1 {public static void main(String[] args) {// String API ExerciseString str "hello world";// 返回字符串长度(包括空白字符)int length str.length();Sy…

前端学习Day32

Day32:P139-P151 学习笔记: 1.普通字符: 大多数的字符仅能够描述它们本身,这些字符称作普通字符, 例如所有的字母和数字。 也就是说普通字符只能够匹配字符串中与它们相同的字符。 元字符(特殊字符): 是一些具有特殊含义的字符&#x…

实际项目中,运用Retrofit和OkHttp调用其他项目接口

先引入依赖 dependencies {implementation com.squareup.retrofit2:retrofit:2.9.0implementation com.squareup.retrofit2:converter-gson:2.9.0 // 使用 Gson 转换器implementation com.squareup.okhttp3:okhttp:4.10.0implementation com.squareup.okhttp3:logging-interce…

数据结构(邓俊辉)学习笔记】优先级队列 09——左式堆:合并算法

文章目录 1. LeftHeap模板类2. 算法3. 实现4. 实例 1. LeftHeap模板类 接下来这节,来讨论左式堆的合并算法。再给出具体算法之前,首先要给出左式堆模板类的定义。 比如这就是一种可能的实现方式,可以看到,我们这里再次利用了 C…

【MySQL数据库管理问答题】第6章 管理 MySQL 用户

目录 1. 对于验证和授权,它们有什么区别,各自发生在用户访问过程的哪个阶段? 2. MySQL 用户账户的定义信息保存在数据库的什么地方? 3. 在定义用户时,要避免在主机名中使用通配符,除非绝对必要。请给出如…

【JS】localeCompare实现中文排序

如何对两个中文进行字典顺序排序&#xff0c;如’本’拼音首字母’b’&#xff0c;‘初’拼音首字母’c’&#xff0c;所以’本’<‘初’。 JS默认根据编码顺序排序 使用localeCompare即可&#xff0c;如 ‘本’ < ‘初’ 则返回负数 使用方法 referenceStr.localeComp…