通过互联网流式传输巨大的 3D 场景
Streaming huge 3D scenes over internet
我想将由许多对象组成的大场景流式传输给客户,但需要一些关于采用何种方法的建议。我知道 PS4 和 Battle.NET 即使 70% 的游戏还没有下载,但它们在我的 18 Mbps 连接下运行得非常快。
谁能帮我直播大场景从哪里开始,如何开始?
如果 "huge scenes" 意味着传输 lowest-level 原始数据(单个点、三角形、每个 object, 等等).
他们经常流式传输 higher-level 数据,例如 "maps" 和大量实例数据。例如,它们可能不会传输森林中一千棵树的三角形。相反,他们可能会传输一个独特的树资产,该资产被实例化,只是缩放、旋转和定位不同以形成森林(每个树实例只有一个独特的转换矩阵)。结果可能是可以传输整个森林,而无需占用比单棵树的三角形更多的内存。
它们可能有两个或多个角色网格,它们具有相同的几何形状或拓扑结构,只有独特的变形(点位置)或纹理("skins"),显着减少了必须 sent/stored.
在执行此类 instancing/tiling 操作时,由于实例化的 non-unique 数据量,原本可能价值 TB 的唯一数据可能会变成兆字节。
因此,执行此操作的第一步通常是构建您自己的 level/map 编辑器,例如由于 tiled/instanced(共享)数据的绝对数量,该 level/map 编辑器通常可以序列化相当 higher-level 且比 Wavefront OBJ 文件更紧凑的内容。 high-level 数据最终成为您流式传输的内容。
其次是构建可扩展的服务器,这是一个单独的野兽。要做到这一点,通常需要在 OS/kernel 的核心使用非常高效的多线程来实现非常高效的异步 I/O。关于这个主题有一些很好的资源,但它太广泛了,无法用一个简单的答案来涵盖。
第三个可能是压缩数据以进一步减少所需的带宽。
商业游戏标题可能会寻求所有这三个,但可能首先要意识到的是它们不一定在所有地方流式传输独特的三角形和纹素——流式传输这样的 low-level 数据会产生巨大的影响服务器上的压力,特别是考虑到 MMO 旨在处理的玩家负载类型。这些游戏,尤其是 MMO,经常使用大量实例数据来显着减少实际必须占用内存并单独传输的独特数据。
地图和资产通常被设计为尽可能仔细地重复使用现有数据——精心制作以最大限度地重复以减少内存需求,但又不会显得过于明显冗余(变化与经济)。它们看起来 "huge" 但考虑到相同数据的大量重复,并且考虑到它们不会冗余存储重复数据,因此从数据的角度来看并不是真的。他们通常非常非常经济。
就流式传输而言,一个简单的方法可能是将世界分解为二维区域(有一些重叠以提供无缝体验,以便在玩家环游世界时对相邻区域进行流式传输)周围有 AABB。流式传输玩家所在区域的数据,并且可能在视锥内可见。它可以比这更复杂,但这可能是一个不错的起点。
我想将由许多对象组成的大场景流式传输给客户,但需要一些关于采用何种方法的建议。我知道 PS4 和 Battle.NET 即使 70% 的游戏还没有下载,但它们在我的 18 Mbps 连接下运行得非常快。
谁能帮我直播大场景从哪里开始,如何开始?
如果 "huge scenes" 意味着传输 lowest-level 原始数据(单个点、三角形、每个 object, 等等).
他们经常流式传输 higher-level 数据,例如 "maps" 和大量实例数据。例如,它们可能不会传输森林中一千棵树的三角形。相反,他们可能会传输一个独特的树资产,该资产被实例化,只是缩放、旋转和定位不同以形成森林(每个树实例只有一个独特的转换矩阵)。结果可能是可以传输整个森林,而无需占用比单棵树的三角形更多的内存。
它们可能有两个或多个角色网格,它们具有相同的几何形状或拓扑结构,只有独特的变形(点位置)或纹理("skins"),显着减少了必须 sent/stored.
在执行此类 instancing/tiling 操作时,由于实例化的 non-unique 数据量,原本可能价值 TB 的唯一数据可能会变成兆字节。
因此,执行此操作的第一步通常是构建您自己的 level/map 编辑器,例如由于 tiled/instanced(共享)数据的绝对数量,该 level/map 编辑器通常可以序列化相当 higher-level 且比 Wavefront OBJ 文件更紧凑的内容。 high-level 数据最终成为您流式传输的内容。
其次是构建可扩展的服务器,这是一个单独的野兽。要做到这一点,通常需要在 OS/kernel 的核心使用非常高效的多线程来实现非常高效的异步 I/O。关于这个主题有一些很好的资源,但它太广泛了,无法用一个简单的答案来涵盖。
第三个可能是压缩数据以进一步减少所需的带宽。
商业游戏标题可能会寻求所有这三个,但可能首先要意识到的是它们不一定在所有地方流式传输独特的三角形和纹素——流式传输这样的 low-level 数据会产生巨大的影响服务器上的压力,特别是考虑到 MMO 旨在处理的玩家负载类型。这些游戏,尤其是 MMO,经常使用大量实例数据来显着减少实际必须占用内存并单独传输的独特数据。
地图和资产通常被设计为尽可能仔细地重复使用现有数据——精心制作以最大限度地重复以减少内存需求,但又不会显得过于明显冗余(变化与经济)。它们看起来 "huge" 但考虑到相同数据的大量重复,并且考虑到它们不会冗余存储重复数据,因此从数据的角度来看并不是真的。他们通常非常非常经济。
就流式传输而言,一个简单的方法可能是将世界分解为二维区域(有一些重叠以提供无缝体验,以便在玩家环游世界时对相邻区域进行流式传输)周围有 AABB。流式传输玩家所在区域的数据,并且可能在视锥内可见。它可以比这更复杂,但这可能是一个不错的起点。