[发明专利]基于Unity引擎的网络图片加载方法、装置及介质有效
申请号: | 202210856964.0 | 申请日: | 2022-07-20 |
公开(公告)号: | CN115225623B | 公开(公告)日: | 2023-08-29 |
发明(设计)人: | 段凌云;何柯庆;唐进;陈正超 | 申请(专利权)人: | 贵阳语玩科技有限公司 |
主分类号: | H04L67/02 | 分类号: | H04L67/02;H04L67/568;H04L9/06;G06F16/955 |
代理公司: | 杭州研基专利代理事务所(普通合伙) 33389 | 代理人: | 刘然 |
地址: | 550081 贵州省贵阳市贵阳国家高新技术*** | 国省代码: | 贵州;52 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 unity 引擎 网络 图片 加载 方法 装置 介质 | ||
本申请提供一种基于Unity引擎的网络图片加载方法、装置及介质,通过将网络图片加载请求转到程序中使用HttpListener开辟的HTTP服务,以在HTTP服务线程完成缓存的校验和文件下载,解决了UnityWebRequest下载的图片无法缓存的问题。结合DownloadHandlerTexture可以在工作线程解码图片的特性,完美避免了在主线程执行缓存校验带来的URL编码耗时操作及文件数据I/O耗时操作,也避免了主线程对图片解码带来的CPU耗时操作,从而支持随时高效加载并缓存高清网络图片。
技术领域
本申请涉及软件开发技术领域,具体而言,涉及一种基于Unity引擎的网络图片加载方法、装置及介质。
背景技术
Unity引擎是一个较为流行的跨平台3D引擎,引擎通过主线程不断刷新画面实现运动的展示,每秒刷新的画面次数越多(即FPS,每秒传输帧数),运动的画面越流畅,常见的FPS档位有30、60、90、120。以60FPS为例,要达到该帧数,每一帧的代码执行时间不能超过16.66毫秒。同时Unity引擎为了避免线程安全问题,几乎所有API(应用程序接口)只能在主线程调用,其中就包括图片(2D纹理)的加载API。
一张图片的加载分为两个核心阶段,首先将文件二进制数据读取进内存,其次在内存中对二进制数据进行解码。从文件系统上将图片文件二进制数据读入内存属于耗时操作(I/O密集型),在内存中对图片进行解码也属于耗时操作(CPU密集型)。图片越高清,总像素数越多,文件所占的大小也越大,二进制数据载入内存与解码的时间也越长。
Unity引擎读取并解码图片的API只能在主线程调用,如果主线程执行代码耗时超过1帧最大时长,则画面就会掉帧,运动图像的视觉效果与操作就会变卡,降低或避免主线程在这两个阶段耗费过多时间将使得画面更加流畅。如果这张图片并不在本地,是放在网络服务器上,还需要增加额外的图片下载时长,如果一张图片需要频繁显示,重复的下载既慢且浪费用户网络流量。
无论使用什么引擎开发,游戏加载网络图片,基本都是在进入游戏前提前下好所有资源,在加载场景的界面等待图片加载、解码,加载完成后进入场景直接显示。
Unity中加载网络图片,可以使用UnityWebRequest进行动态按需加载图片,该API可以下载网络图片,并在引擎内部工作线程(不对外公开)中进行图片解码,不阻塞主线程,解码完成后得到纹理对象用来显示。但是该API无法对下载的图片进行缓存,每次显示同样的图片都需要重新下载,会浪费许多流量。
如果自行编写下载服务实现缓存,则需要对URL进行规则化定长编码,作为文件名进行保存、查找,但每次对URL进行编码需要消耗主线程执行时间。而加载和解码目前有两种方案,第一种是调用WWW类的LoadImageIntoTexture方法加载图片,但该方案会导致在主线程执行加载和解码而阻塞主线程。第二种是在子线程读取文件二进制数据到内存形成字节数组,主线程调用Texture2D类的LoadImage方法加载,这种方案虽然在文件加载时不阻塞主线程,但会因为必须在主线程解码而阻塞主线程。
发明内容
本申请实施例的目的在于提供一种基于Unity引擎的网络图片加载方法、装置及介质,以避免URL编码耗时,避免同一个文件重复下载,避免文件加载到内存及解码阻塞主线程,实现高效加载并缓存高清网络大图。
为了实现上述目的,本申请的实施例通过如下方式实现:
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于贵阳语玩科技有限公司,未经贵阳语玩科技有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202210856964.0/2.html,转载请声明来源钻瓜专利网。