如何在Unity WebGL上实现一套全流程简易的TextureStreaming方案

项目介绍

《云境》是一款使用Unity引擎开发的WebGL产品,有展厅,剧本,Avatar换装,画展,语音聊天等功能,运行在微信小程序和PC,移动端网页,即开即用。
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

当前问题和现状

当前项目面临的问题和场景现状

  1. 首次场景包体大,首次下载时间长,用户首次进入到场景耗时较长。
  2. 项目场景本身偏展厅风格,非大世界,非大型游戏场景,云境的场景元素整体比较集中,当前项目场景多数多数是室内场景或者小场景,拆分出去的内容有限,美术人力资源有限,对场景做更细致的拆分处理和分块加载成本较高。

我们需要一套简单适用的方案,降低场景包体大小。为了优化场景资源包大小,我们首先需要分析资源包里面的不同类型的资源占比,看哪些资源可以做优化和拆分

场景资源包分析

AssetBundle使用LZ4压缩,下面是针对三个原始场景资源包的分析
公园场景park_001.bundle,8.63MB,Mesh(6.5MB)+Texture2D(5.7MB)
请添加图片描述

剧本场景scenes_bxzf.bundle,11.3MB,Mesh(8.9MB),Texture2D(8.0MB)
请添加图片描述

某个展馆scenes_jttd.bundle,5.3MB,Mesh(439.3KB),Texture2D(8.0MB)
请添加图片描述

通过针对多个场景的资源包分析,会看到Mesh+Texture2D是一个场景资源包占比最高的两种资源类型,Texture2D基本占比在50%以上,而且针对个别场景Texture2D的资源占比会超过80%

方案确定

根据场景资源包的分析,可以得出的结论,针对云境目前的场景特点,多数场景Texture纹理贴图占比在50%~80%,如果采用Texture的处理能够很大程度上降低场景资源包的大小,收益比较明显,同时TextureStreaming的实现,相对MeshStreaming相对简单,投入产出比高,TextureStreaming不会改变场景原有的结构,可以降低美术人员的参与成本。

第一期设计一套简单,易实现,工作流完善的TextureStreaming方案,降低场景资源包中Texture的占比。

Unity引擎自身基于MipMapL

### 回答1: Unity是一款广泛使用的游戏引擎,它允许开发者将游戏导出为WebGL格式,从而可以通过浏览器进行游玩。而WebGL是一种基于JavaScript的API,可以在浏览器中渲染3D及2D图形。 WebSocket是一种在浏览器和服务器之间建立实时双向通信的协议。它使得网页可以实时地更新数据,而无需使用传统的HTTP轮询。 在使用Unity开发WebGL游戏时,可能会遇到WebSocket粘包的问题。这种情况通常发生在网络传输数据时,数据包没有被完整地传输到接收端,导致数据被拆分或者合并,从而影响游戏的表现。 为了解决WebSocket粘包的问题,可以通过以下几种方式: 1. 增加缓冲区大小:可以通过增加WebSocket的缓冲区大小来减少WebSocket粘包的发生率。 2. 将数据包分割成小块:可以将较大的数据包拆分成多个小块进行传输,这样可以减少数据包的大小,从而降低粘包的概率。 3. 使用特定的协议:开发者可以使用一些特定的协议或者框架,如protobuf或者MsgPack,这些协议可以将数据格式化,从而减少数据包的大小,同时也可以降低WebSocket粘包的概率。 综上所述,WebSocket粘包是Unity WebGL游戏开发的一个常见问题,但可以通过增加缓冲区大小、将数据包分割成小块或者使用特定的协议来解决。 ### 回答2: Unity WebGL是一种基于Web的游戏引擎,它使用WebGL技术使游戏能够在Web浏览器中运行。WebSocket是一种HTML5提供的网络通信协议,与HTTP不同的是,WebSocket建立的是一个持久化的连接,可以实现双向通信。 但是,在使用Unity WebGL和WebSocket进行通信时,可能会出现粘包现象。粘包指的是在传输过程中,多个数据包被合并成一个较大的数据包,而接收端却只能对这一个较大的数据包进行处理,导致数据解析错误或出现数据丢失。 粘包的出现是由于WebSocket是基于TCP协议的,而TCP协议具有流式传输的特点,即没有边界限制。因此,在发送端连续发送多个数据包时,它们可能会依次被组成一个大数据包发送至接收端,而接收端则需要进行额外的解析和处理,才能正确获取每个数据包的信息。 解决粘包问题需要在程序设计上进行优化,可以在发送端添加边界符或长度前缀来区分每个数据包,以便接收端能够正确读取每个数据包。此外,也可以通过加密、压缩等技术来减小数据包的大小,从而减少粘包情况的发生。最好的解决方法还是在网络通信的设计过程中对TCP协议有深入的理解并且进行有效优化。 总之,对于Unity WebGL和WebSocket的开发者,需要注意粘包问题的可能性,设计时应该尽可能避免此类问题的发生。 ### 回答3: Unity WebGl游戏在使用websocket时常常会出现粘包现象。websocket是一种双向通信的网络协议,与HTTP协议相比,具有更快的速度和更低的延迟,因此在实时性要求较高的游戏开发中得到了广泛应用。 WebSocket粘包是指两个或更多个数据包被粘成一个数据包,导致数据混乱或数据丢失的现象。在Unity WebGl中,Unity引擎使用websocket协议与服务器通信时,如果两个消息同时到达,则可能会发生粘包。这会导致接收方解析数据时出现意外的数据,并可能会导致游戏异常或崩溃。 为了解决这个问题,可以在每个消息之前添加一个消息头以标识消息的长度。这样一来,在接收websocket消息时,就可以首先读取消息头,得到消息的长度,然后按照消息长度读取数据,以避免粘包的问题。 另外,在编写游戏网络通信代码时,也需要注意一些细节问题,如尽量避免长时间等待服务器响应、适量分包发送数据等,这样可以有效降低websocket粘包发生的概率,提高游戏网络通信的效率和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值