我想将由许多对象组成的大场景流式传输给客户,但需要一些建议来采取什么方法。我知道即使70%的游戏尚未下载,PS4和Battle.NET也会对游戏进行流式传输,但是我的18 Mbps连接速度非常快。
任何人都可以帮助我从哪里开始以及如何开始流式传输大型场景?
答案 0 :(得分:1)
如果"巨大的场景"很多这些不一定会流动巨大的场景本身。意味着传输最低级别的原始数据(每个对象上的单个点,三角形,独特纹理等)。
他们经常会传输更高级别的数据,例如"地图"有很多实例数据。例如,他们可能不会在森林中传输千棵树的三角形。相反,他们可能会传输一个唯一的树资产,该资产是实例化的,只是按比例缩放和旋转,并以不同方式定位以形成森林(每个树实例只有一个唯一的变换矩阵)。结果可能是整个森林可以传输,而不会占用比一棵树的三角形更多的内存。
它们可能有两个或多个字符网格,它们具有相同的几何形状或拓扑结构,只有唯一的变形(点位置)或纹理("皮肤和#34;),大大减少了必须发送的唯一数据量/储存。
在进行这种实例化/平铺处理时,由于实例化,非唯一数据的数量,可能会有太字节数量的唯一数据可能会达到兆字节。
因此,执行此操作的第一步通常是构建自己的关卡/地图编辑器,例如:由于平铺/实例化(共享)数据的数量庞大,该级别/地图编辑器通常可以序列化比Wavefront OBJ文件更高级更严格的内容。这些高级数据最终会成为您流式传输的内容。
其次是构建可扩展的服务器,这是一个独立的野兽。要做到这一点,通常需要在OS /内核的核心进行非常有效的多线程处理,以实现非常高效的异步I / O.关于这个主题有一些很好的资源,但它太宽泛,无法用一个简单的答案覆盖。
第三种可能是压缩数据以进一步减少所需带宽。
商业游戏的标题可能会寻求所有这三个,但可能首先要意识到的是,他们并不一定在任何地方流式传输独特的三角形和纹素 - 如此流式传输此类低级数据会给网站造成巨大压力服务器,特别是考虑到MMO旨在处理的玩家负载类型。这些游戏(尤其是MMO)经常使用大量实例数据来显着减少实际占用内存并单独传输的唯一数据。
地图和资产通常旨在尽可能仔细地重复使用现有数据 - 仔细制作以最大程度地重复以减少内存需求,但不要过于夸张冗余(变化与经济性)。他们看起来很大"但鉴于相同数据的重复次数很多,考虑到他们不会冗余地存储重复数据,但从数据的角度来看并非如此。他们通常非常非常经济。
就流式传输而言,一种简单的方法可能是将世界分解为二维区域(有一些重叠以允许无缝体验,以便当玩家环游世界时相邻区域正在流式传输)与AABB在他们旁边。流式传输播放器所在区域的数据,并且可能在视锥体内可见。它可以比这更精细,但这可能是一个不错的起点。