代码改变世界

大世界需求

2023-05-08 18:51  kk20161206  阅读(20)  评论(0编辑  收藏  举报

1 实现一个主要用于俯视角游戏的地图资源管理系统。

2 场景会很大,手机可能无法全内存加载。

3 至少要保证相机视野范围内资源加载到场景中。

4 如果视野范围内的资源达到数量限制,优先加载离相机近的。

5 场景中相同的空间位置,可能根据业务逻辑需要,在不同条件下显示不同的数据。比如相机镜头拉近、拉远,显示不同的数据(不是LOD,可以是完全不同的模型、特效等)

6 系统以插件的形式实现

 

1. 场景切分,场景分块儿资源导出、序列化功能;actor导出功能;在场景导出的时候,new出分块儿资源,并把block里的actor、资源数据进行填充。场景bvh算法。

九宫格的方案其实很简单也很好理解,将完整的大世界按照固定大小拆分成小的Chunk,然后运行时根据角色位置和约定好的Chunk尺寸判断角色所在的Chunk和周围八块的索引,加载对应的Chunk文件即可。当角色移动的时候,判断是否需要加载新的Chunk和卸载老的Chunk文件。在这个阶段美术还在做效果预研,所以自己先制作一个Demo来模拟整个功能。首先还是先设想了一下整个大世界的制作流程,大致如下:

  1. 使用自动拆分工具,根据设置好的分块大小,将场景中的每一个物体根据位置坐标拆分到对应的Chunk中;

  2. 将Chunk自动保存成规定路径下对应名称的场景文件(.scene),删除拆分过的Chunk文件,剩下的作为BaseWorld.scene文件;

  3. 运行时首先加载BaseWorld,然后在角色身上绑定一个DynamicLoader,根据角色位置自动按照Additive的方式加载周围九块Chunk对应的场景

  4.  

https://blog.uwa4d.com/archives/1919.html

UCLASS(MinimalAPI)
class UBlock : public IInterface_AssetUserData
{
GENERATED_UCLASS_BODY()

public:
ENGINE_API ~UBlock();

UPROPERTY()
uint32 XCoordinate;
UPROPERTY()
uint32 YCoordinate;
UPROPERTY()
TArray<UStaticMesh*> StaticMeshes;
UPROPERTY()
TArray<UStaticMesh*> StaticMeshes;
UPROPERTY()
TArray<UkeletalMesh*> SkeletalMeshes;

UPROPERTY()
TArray<AActor*> SkeletalMeshes;

}

2. 根据相机位置加载分块儿资源,及其关联的level的actor资源;

bvh算法?哪些block可见?是否卡顿

异步加载

(1)分帧加载。https://zhuanlan.zhihu.com/p/458672730 时间。加载和实例化,分开?

 

  • 业务层场景配置的彻底分块

战斗场景中除了有基本的场景资源外,经常伴随着刷怪,刷关卡物件等场景配置类需求,需要将对应的配置资源进行彻底分块,比如怪物A和物件A隶属于分块A等,加载分块A时将怪物A和物件A进行预加载,将配置资源的彻底分块有利于减少内存和CPU的浪费

  • 业务层的分帧加载

业务层除了资源的加载外,各个项目可能还有其他许多需要处理的逻辑,比如我们项目中使用了帧同步,需要创建相应的逻辑层和显示层,我们还将部分较为耗时的Component在导出资源时进行隐藏,加载后进行分帧激活,等等的逻辑,也需要做分帧处理。

 

其他优化

  • 组件分帧加载

部分Component的启动生命周期耗时较高但激活顺序对结果没有影响时,可以将Component或GameObject在场景加载后,进行延迟分帧激活

 (2)资源打包策略的制定

 

3. 当资源达到数量限制时,优先加载离相机近的资源;相机位置移动后,检测需要卸载的block。

走进走出collider 的 triger 就会触发地形的加载和卸载,实现过程类似于 Unreal引擎实现的Level Streaming Volume。为了避免玩家在collider边界频繁的走动从而出发频繁的内存的加载和卸载,可以在卸载加载的时候加一定的延时。

 

4.每个actor有datalayer属性能够设置,当它所属的所有的datalayer都invisible的时候,他才invisible。

5. 内存、dc等。龙族大世界

https://www.bilibili.com/video/BV1Ny4y1D77G/?vd_source=7608c0f9a7423f9a65a6b18f1a3102e6

http://geekfaner.com/ue4/blog8_UOD2020_3.html

 https://xueqiu.com/1058212218/165360166