【问题标题】:Unity best practices for unloading unused areas of a map卸载地图未使用区域的 Unity 最佳实践
【发布时间】:2020-01-13 15:21:30
【问题描述】:

对于不需要每帧更新的游戏世界区域,我想知道减少 CPU 和内存开销的最佳方法。

我刚刚开始考虑这个问题,因为我目前正在使用 Raycast 实现阴影检测系统。

我的问题是这样的:

  • 我的关卡中可以有大约 100 个灯光,它们在每一帧都会向附近的角色发送 Raycast,以确定这些角色是否处于阴影中。

我的游戏是一款低多边形 PC 游戏,我知道 Raycasting 的开销并没有那么大。所以这不是主要问题。但我仍然不确定优化它的最佳方法。

我一直在考虑几个解决方案,但不确定是否有“标准”。

1。如果玩家距离太远,则退出更新循环

void Update() {
   if (Vector3.Distance(playerPos, transform.position) > someRadius) {
       return
   }
}

这是最明显的解决方案,但问题更为明显。

  1. 此更新循环仍将占用 CPU 周期,对每个光点的每一帧执行 2 次计算。

2。当玩家距离太远时禁用 Light gameObjects

这种方法在 CPU 开销方面更有效,因为这些开销将被否定。但是我仍然在占用不必要的内存。

为了使这个解决方案更具可扩展性,我必须设计某种“启动器”来跟踪应该根据玩家位置启用/禁用的游戏对象。

但在这一点上,我知道我正在重新发明轮子,并且非常确定这有一个行业标准。

是否有启用/禁用的替代方法?

我看到很多游戏开发者都在谈论在玩家不在附近时从内存中物理卸载游戏区域并将这些区域写入磁盘。

我想知道这是通过简单地销毁和重新实例化对象来实现的。

问题

Unity 对此有意见吗?

页面here 列出了一个示例,类似于我的第一个解决方案。但他们在这里谈论的是每帧成千上万的更新。

也许我不需要像我想的那样担心

谢谢!

【问题讨论】:

  • 您是否考虑过遮挡,它是根据您的相机所在的位置计算出来的,并且只显示可见的。

标签: unity3d game-development


【解决方案1】:

如果您不想渲染不在相机区域内的对象,遮挡剔除正是您所需要的。观看此链接:

https://docs.unity3d.com/Manual/OcclusionCulling.html

如果您想根据相机和对象之间的距离更改对象的外观,您必须使用 LOD(Level Of Detail)。这是文档:

https://docs.unity3d.com/Manual/class-LODGroup.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2012-12-21
    • 2018-10-07
    • 1970-01-01
    • 2015-09-25
    • 2011-03-14
    相关资源
    最近更新 更多