UnityWebGL移动端兼容性说明

测试时间2023.8.10

官方文档说明

官方文档说明

依据Unity官方最新版本文档(2021.3LTS),关于WebGL的兼容性说明为"Unity WebGL不支持移动设备。它可能适用于高端设备,但当前的设备通常不够强大,并且没有足够的内存来支持Unity WebGL内容。为了让最终用户意识到这一点,当最终用户尝试在移动浏览器上加载 Unity WebGL 应用程序时,Unity WebGL 的默认模板会显示一条警告消息。要从应用程序中删除此警告,请添加您自己的 WebGL 模板。有关如何执行此操作的信息,请参阅添加 WebGL 模板。"

按照官方文档关闭在移动浏览器上加载 Unity WebGL 应用程序时的警告后进行实际测试。

测试1

以下测试目前仅使用苹果及安卓系统测试:

项目规模桌面浏览器运行情况移动设备浏览器运行情况
空包项目/仅单模型/极小功能项目全部可运行全部可运行
已完成的部分成品项目测试(选择包体大约40-80MB,空包+必须字体包体在25M左右)全部可运行目前测试,加载速度慢为通病;安卓系统基本都可加载访问;苹果系统加载完成后重复加载导致网页崩溃。其他如鸿蒙等移动端系统未测试。

针对于苹果系统无法正常加载问题,查看Safari Console,并无任何报错及异常提示。
并且测试过程中发现并非是较大的项目会导致网页崩溃,所以项目大小与是否崩溃没有直接关系。

初步定位原因:内存溢出。

测试2

垃圾收集注意事项

使用上图附带代码测试,重新复现之前的问题,触发此循环逻辑后,项目重新加载,进而网页崩溃。

同样逻辑在pc平台无问题。

初步定位原因:内存溢出。

测试3

加载结束,进入场景后,在工厂模型内部游览,仅旋转视角浏览过程中,突发网页崩溃,。

同样在桌面浏览器无问题。

初步定位原因:未知,可能是webgl渲染导致崩溃。

测试4

加载结束,在视野中生成2-5个工厂模型,直接画布卡死/网页崩溃。

加载结束,在视野外生成2-20+个工厂模型,未出现崩溃及卡死现象。

同样在桌面浏览器无问题。

初步定位原因:未知,可能是webgl渲染导致崩溃。

结论:

总体来说,印证了Unity官方文档中所说明的“当前的移动设备通常不够强大,并且没有足够的内存来支持Unity WebGL内容。”。

不仅如此,除了官方提及的内存,渲染能力也与桌面GPU性能相差甚远。

在这样的情况下,可以进行一定程度上简单、轻量的项目开发。

  1. 性能差异:WebGL渲染需要GPU资源,而移动设备的GPU可能不如桌面GPU那么强大或者优化。
  2. 内存溢出:安卓的内存普遍较大,但不同型号的苹果手机内存不同。如,iPhone 12 Pro Max 和 iPhone 13 Pro Max,RAM 已经增加到了 6GB。iPhone 13 Mini 和 iPhone 13 则配备了 4GB 的 RAM。内存泄露一般会在Console进行异常提示,但在测试过程中并未发现有任何相关提示。WebGL 内容在浏览器中运行。浏览器在其内存空间中分配应用程序运行内容所需的内存。 可用内存量因以下因素而异:
    a. 使用的设备
    b. 使用的操作系统
    c. 使用的浏览器,以及是在 32 位还是 64 位处理器上运行
    d. 浏览器的 JavaScript 引擎解析代码所需的内存量
    e. 浏览器为每个选项卡使用单独进程,但是内容需要与所有其他打开的选项卡共享内存空间
  3. 网络限制:Unity WebGL 输出包含了引擎的大部分,在移动网络上,下载WebGL应用的数据可能会很慢,这会影响加载时间和用户体验。
  4. WebGL调试:移动设备环境无法连接到编辑器Profiler进行内存占用诊断,很难在打包后确定具体大内存资源或逻辑。
  5. 兼容性适配:为了在移动设备上获得最佳的Unity WebGL体验,需要进行大量不同移动设备(鸿蒙等其他系统)及不同浏览器(chrome,Safari及微信、手机内置浏览器等)的测试和优化,包括压缩资源、优化渲染和功能剔除等,以确保可以兼容大部分设备。

2、3注释:
UnityWebGL并未从一开始就考虑到了浏览器和设备的兼容性问题。与其他Web3d应用程序较为轻量,更容易适应各种设备和网络条件不同。

UnityWebGL的引擎仍然包含许多为其他平台设计的功能和系统,导致空包+中文字体打包后的大小就在25MB,相对于其他web3d引擎来说在移动端的加载时间很慢。这是因为其他web3d引擎通常只包括所需的部分从而减少了文件大小和加载时间。

并且专业的web3d引擎针对新的 Web 技术和浏览器更新进行的迭代更快。

UnityWebGL与其他web3d引擎由于设计哲学和目标市场的不同,它们在移动浏览器的兼容性上可能会有所不同。

开发方案

  1. 建议提前开始使用UnityWebGL进行开发,将基本功能开发完成测试,确保足够的时间进行兼容性适配。
  2. Unity WebGL转微信小游戏,将产品发布在微信小程序平台,由转换工具与微信小游戏运行环境保证适配兼容,并且转换工具提供高性能模式。但微信小游戏发布需要软著、游戏自身自查报告。(注:转换工具仅可将unityWebGL转换为微信小游戏)
  3. 使用其他web3d引擎开发。

测试时间2023.8.11

详细内存界限测试

以4G/6G内存苹果手机Chrome及Safari浏览器为例,稳定申请总内存400+MB后崩溃,因此移动设备浏览器对于UnityWebGL的内存限制大约是桌面浏览器的1/5。

并且手机浏览器加载47M模型时,同样崩溃,猜测显存超出也会导致网页崩溃;而同样模型在桌面浏览器上无论生成多少个都不会导致网页崩溃,仅帧率降低。

同样仅10M大小的模型,总大小15M的贴图文件,在桌面/手机浏览器分别测试:

  • 基础占用:桌面浏览器占用56.1 MB,手机浏览器占用99.8 MB。
  • 贴图占用:相机渲染必需(相机深度渲染贴图占用30M,渲染缓存Buffer贴图占用60M,阴影贴图32M,屏幕阴影贴图20M),模型贴图占用桌面浏览器占用24.8 MB,手机浏览器占用195.1 MB。

经此测试,贴图/UI等图片资源可能因硬件平台不同,导致资源压缩格式不同或压缩失效。相同的贴图/UI资源,在移动浏览器上会比在桌面浏览器中占用更大的内存/显存。

至此,内存/显存的超出都会导致网页崩溃。

提示:

  • 因资源加载进入引擎需要引擎内部识别及一些其他描述字段,所以加载入引擎内存的大小是有可能比原资源文件更大的。
  • 如6KB Icon图片,引擎打包时可压缩到2KB,加载入内存大小66KB,并且渲染需要其他引擎组件,如Sprite、Image等,也会额外占用一些内存大小。
  • 这是因为通常模型或图片等资源为结构紧凑的二进制文件,但在读取到内存中时将会被解压,并且有其特定的内存表示,所以会占用比原文件大小更多的内存。
  • 也正是因为以上原因,项目的大小与需要的内存大小并没有直接关系。

使用UnityWebGL在手机浏览器运行存在问题:

  • 手机浏览器资源压缩失效,将会占用比网页浏览器更多的内存。
  • 总内存占用超过400MB(实际所能使用的大概可以有接近300M)即网页崩溃。
  • 渲染较多场景物体时,网页崩溃。
  • 通常,移动设备使用集成的图形处理单元(GPU),这意味着 GPU 和中央处理单元(CPU)共享相同的物理内存。所以手机浏览器所分配的内存空间会更加吃紧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/71044.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

植被利用了多少陆地降水?

降水部分被植被利用,部分转化为河水流量。量化植被直接使用的水量对于解读气候变化的影响至关重要。 新提出的模型的预测与之前的结果进行了比较。资料来源:AGU Advances 水是地球的重要组成部分,因此,了解大尺度的水平衡及其建模…

hackNos靶机

靶机训练1 - hackNos: Os-hackNos 靶机平台 Vulnhub 是一个提供各种漏洞环境的靶场平台,供安全爱好者学习使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行。每个镜像会有破解的目…

LVS/DR+Keepalived负载均衡实战(一)

引言 负载均衡这个概念对于一个IT老鸟来说再也熟悉不过了,当听到此概念的第一反应是想到举世闻名的nginx,但殊不知还有一个大名鼎鼎的负载均衡方案可能被忽略了,因为对于一般系统来说,很多应用场合中采用nginx基本已经满足需求&a…

【C# Programming】C#第一课(自己学习的笔记)

目录 一、C# 介绍 1.1 托管代码(Manage Code ) : 1.2 基础类型库 (Base Class Library): 1.3 程序集(Assembly): 1.4 .NET 框架: 1.5 公共中间语言(Common Intermediate Language),简称 IL。 1.6 C#编译器将源代…

android Ndk Jni动态注册方式以及静态注册

目录 一.静态注册方式 二.动态注册方式 三.源代码 一.静态注册方式 1.项目名\app\src\main下新建一个jni目录 2.在jni目录下,再新建一个Android.mk文件 写入以下配置 LOCAL_PATH := $(call my-dir)//获取当前Android.mk所在目录 inclu

STM32F429IGT6使用CubeMX配置外部中断按键

1、硬件电路 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置GPIO引脚 4、NVIC配置 PC13相同 5、生成工程配置 6、部分代码 中断回调函数 /* USER CODE BEGIN 0 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(GPIO_Pin GPIO_PIN_0){HAL_GPIO…

C语言属刷题训练【第八天】

文章目录 🪗1、如下程序的运行结果是( )💻2、若有定义: int a[2][3]; ,以下选项中对 a 数组元素正确引用的是( )🧿3、在下面的字符数组定义中,哪一个有语法错…

uniapp创建项目入门【详细】

大家在学习vue和微信小程序之后,就可以开始来学习uniapp了,在uniapp中,一套代码可以跨越所有的平台,可以很方便的维护。接下来我们先来学习如何创建uinapp的项目 一、uniapp的创建需求 大家只要会vue和微信小程序的基础来学习unia…

PHP最简单自定义自己的框架定义常量自动生成目录(三)

1、框架入口增加模块定义&#xff0c;实现多模块功能 index.php 定义模块 <?php //定义当前请求模块 define("MODULE",index); require "./core/KJ.php"; 创建后台模块admin.php <?php define("MODULE",admin); require "./cor…

运维监控学习笔记2

硬件监控&#xff1a; 1&#xff09;使用IPMI 2&#xff09;机房巡检 路由器和交换机&#xff1a; 使用SNMP&#xff08;简单网络管理协议&#xff09;进行监控。 Linux 安装snmp&#xff1a; yum install -y net-snmp net-snmp-utils 说明&#xff1a;net-snmp是安装在snm…

【C语言】结构体详解

现实生活中一个事物&#xff0c;会有许多属性连接起来。而C语言引入一种构造数据类型——结构体 将属于一个事物的多个数据组织起来以体现其内部联系。 一、结构体类型的定义 结构体类型 是一种 构造类型&#xff0c;它是由若干成员组成的&#xff0c;每个成员可以是一个基本…

系统架构设计专业技能 · 系统安全分析与设计(四)【加解密、数字信封、信息摘要、数字签名、数字书证、网络安全、信息安全】

系列文章目录 系统架构设计专业技能 网络规划与设计&#xff08;三&#xff09;【系统架构设计师】 系统架构设计专业技能 系统安全分析与设计&#xff08;四&#xff09;【系统架构设计师】 系统架构设计高级技能 软件架构设计&#xff08;一&#xff09;【系统架构设计师…

概率论与数理统计:第二、三章:一维~n维随机变量及其分布

文章目录 Ch2. 一维随机变量及其分布1.一维随机变量1.随机变量2.分布函数 F ( x ) F(x) F(x)(1)定义(2)分布函数的性质 (充要条件)(3)分布函数的应用——求概率3.最大最小值函数 2.一维离散型随机变量及其概率分布(分布律)3.一维连续型随机变量及其概率分布(概率密度)4.一般类型…

openocd调试esp32(通过FT232H)

之前在学习ESP32&#xff0c;其中有一部分课程是学习openocd通过JTAG调试程序的&#xff0c;因为我用的是ESP32-wroom&#xff0c;usb端口没有集成对应的usb转jtag的ft232&#xff0c;查了ESP32相关的资料&#xff08;JTAG 调试 - ESP32 - — ESP-IDF 编程指南 latest 文档 (es…

Linux 目录和文件常见操作

就常见的命令&#xff1a; pwd pwd 显示当前的目录 目录迁移 我以如下的目录大致结构做一个简单的例子 cd 迁移到指定的路径&#xff0c;可以指定相对路径和绝对路径&#xff0c;默认相对 .指向当前路径&#xff0c;…/ 指向上一级的目录。 ls 列出文件及其目录 命令选…

android 如何分析应用的内存(十八)终章——使用Perfetto查看内存与调用栈之间的泄露

android 如何分析应用的内存&#xff08;十八&#xff09; 在前面两篇文章中&#xff0c;先是介绍了如何用AS查看Android的堆内存&#xff0c;然后介绍了使用MAT查看 Android的堆内存。AS能够满足基本的内存分析需求&#xff0c;但是无法进行多个堆的综合比较&#xff0c;因此…

第六章 SpringBoot注解 @ConditionalOnBean

满足条件的则进行组件的注入 Configuration(proxyBeanMethods true) //告诉SpringBoot这是一个配置类 配置文件 ConditionalOnBean(name "tom") public class MyConfig {Bean("tom")public Pet tom(){return new Pet("tomPet");}/*** 外部无论…

linux 命令--查看网络端口命令

使用 netstat 检查端口 netstat 是一个命令行工具&#xff0c;可以提供有关网络连接的信息。 netstat - atulnp会显示所有端口和所有对应的程序&#xff0c;用grep管道可以过滤出想要的字段 -a &#xff1a;all&#xff0c;表示列出所有的连接&#xff0c;服务监听&#xff…

对文件的读取和修改 JAVA

目录 1、try catch:2、hasNextLine():3、java读取某个文件夹信息&#xff1a;4、修改&#xff1a; 1、try catch: 1、try语句对你觉得可能会有问题的语句进行尝试 2、try内语句出现错误会被catch语句捕捉&#xff0c;且整个程序不会崩溃 3、try语句出错才会执行下方catch语句…

在R中比较两个矩阵是否相等

目录 方法一&#xff1a;使用all.equal()比较两个R对象是否近似相等 方法二&#xff1a;使用identical比较两个R对象是否精确相等。 方法一&#xff1a;使用all.equal()比较两个R对象是否近似相等 使用函数&#xff1a;all.equal(x,y) 比较两个R对象x和y是否近似相等 > M1…