前言
对各种形式的大世界的实现方案
1.固定视角大世界
游戏类型示例:银河恶魔城、暗黑系列 横版视角或者俯视视角 显示周围的9个地图块即可 没有很大的渲染压力
核心思想: 地图块预制
细节处理:
-
边缘来回处理
-
判断连通
-
跨地图物件问题处理(电梯/机关)
-
更新时机(门、间隔、手动)
2.地图块数据量大的
游戏类型:我的世界、泰拉瑞亚
多地图块 数据量大的大世界
核心思想:
-
噪声算法(不过需要做好改动的方案 才比较正常)
-
插入副本就是策划做好的,然后随机接到世界里面
-
地图四叉树+九宫格Mesh
3.自由视角大世界
示例:
WorldStreamer插件、龙之谷2
实现核心思想:
拆分为多场景sub scene
实现细节:
拆分成多个场景,然后加载
摄像机看不到的地方隐藏
使用LOD
实现复用(每个gird都是一个预制,所有物件都是prefab,gird都是数据,根据数据去加载不同大小缩放旋转的prefab组成)
4.GPU Driven
https://github.com/MashiroShina/GPUDrivenTerrainLearn
GPU Driven Occlusion Culling(Hiz)_hiz遮挡剔除-CSDN博客
4.优化方案
- 万物皆可LOD,网格、贴图、甚至AI
- 合批
- 加载策略
不加载 :不连通的地方 远的地方 看不见的地方; 低端机不加载特效和灯光(需要拆分场景)
预加载 :一些即将要使用的预制、固定出现物都可以预先在进入场景时加载或者一些时机加载
惰性加载 :需要才用到才加载 例如怪物的动画 一些小的表格
同步加载 :logic部分
异步加载 : 基本全部异步....渲染网格和机关、特效(逻辑渲染分离)、怪物、NPC
分帧加载/删除 : 怪物、NPC、网格渲染和机关(队列)、渲染部分也被拆分分帧加载
拆分加载 : 如果场景已经制作好,可以制作工具拆分场景,拆分后配合分帧,获得更顺畅的加载
分帧LoadAsset :底层异步loadAsset分帧了 - 使用池 : unity自身StreamingTexture 、单位(怪物、特效、子弹等)
- 实例化卡顿 :Unity的实例化无法异步,比较好的方法是拆分分帧加载,和先加载低模,然后再到高模
- 内存 :如果加载了保持引用,除了切换场景,不会释放ab和asset,导致玩久了内存高 调用ab的unload(true),当asset没有引用时,适当时机调用res的unloadunuse
5.更多
- 画质要求高
网格多 画质要求高 渲染压力大的大世界
《天涯明月刀》手游引擎技术负责人:如何应用GPU Driven优化渲染效果?| TGDC 2020_的开发
《天涯明月刀》用 Unity 实现 GPU Driven 地形 - 导航
按块切割后只导航加载的块
全图导航放服务器,如果有可改变地形,把地形修改信息也一同发往服务器 - 渲染
如果使用预制无法渲染光照贴图,需要实现一套预制渲染方案,或者使用实时光,假阴影等 - 高移速
如果移速超越一个房间会有时空隧道问题(比较少这样的游戏 太变态了),需要逻辑有全图判断 - Texure https://zhuanlan.zhihu.com/p/696448586
- 卸载
需要有卸载资源释放内存的时机,并且会有几帧的卡顿(最新的Unity又有异步GC了)