关于loading:AssetBundleUnloadtrue无法卸载图集

1)AssetBundle.Unload(true)无奈卸载图集2)对于Unity 2D游戏地图预加载的问题3)Addressables是否反对某些资源不打Bundle间接加载源文件 这是第342篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:community.uwa4d.comUWA QQ群:465082844 LoadingQ:如图,AssetBundle.Unload(true)中依然有一份图集残留在内存中,应用Resources.UnloadUnusedAssets()能够卸载,但用GC.Collect无奈卸载,若不调用Resources.UnloadUnusedAssets(),有其余的方法能够卸载这个图集吗? A1:目前Unity 3D中的Atlas不须要额定的卸载操作,只须要确保Atlas的AssetBundle和援用Atlas的AssetBundle齐全卸载后,Atlas天然会卸载。感激沐风@UWA问答社区提供了答复 A2:能够试试Resources.UnloadAsset,印象中切换场景会主动调用UnloadUnusedAssets。感激Knight-132872@UWA问答社区提供了答复 LoadingQ:请问,2D游戏地图如何实现地图的无缝预加载性能?须要具体学习什么能力写进去相干的代码呢? A1:假如上一个关卡为x-1,本关卡为x,下一关卡为x+1,依据须要提前预加载x+-y的关卡数量就行了,以自身关卡ID去计算需加载的范畴,每次切换关卡依据关卡从新计算范畴。感激曹潘赣@UWA问答社区提供了答复 A2:用一个工具阐明一下思路LDTK。 导出的数据是以关卡为单位的。进入指标关卡时,要队列加载相邻的关卡,如果加载过程中卡顿体验不好则要预测下一个指标关卡,并在加载时用其它视觉效果覆盖加载卡顿。 还有一种是把所有关卡都加载完,关卡转换基本上是无感的,这种要思考解决内存和效率问题。 具体代码实现就是应用工具提供的API,有编程根底就没有问题。 如果是Unity,则波及到资源加载、场景等概念。 感激李伟@UWA问答社区提供了答复 AssetBundleQ:请问Addressables是否反对某些资源不打Bundle间接加载源文件,比方mp4、bytes文件等? A:Addressables也是基于Bundle的,像播放mp4这样的文件如果在Bundle中则可能播放出错,能够在资源更新时把这样的文件读出来,放到设施的用户目录里,应用时就能够间接用文件或门路了。 bytes这样的文件能够放到Bundle里,某个版本的TextAsset里增加了新办法 ,这个办法能够用一下: public NativeArray<T> GetData<T>() where T : struct;对于大量数据表只须要用一个ByteBuffer来解决。如果存储的数据能够分块读取,那内存也不会占用很多。 感激李伟@UWA问答社区提供了答复 封面图来源于网络 明天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,咱们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起摸索分享。欢送更多的开发者退出UWA社区。 UWA官网:www.uwa4d.comUWA社区:community.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:465082844

July 10, 2023 · 1 min · jiezi

关于loading:关于切换场景加载耗时的优化问题

1)对于切换场景加载耗时的优化问题2)SpriteAtlas打包AssetBundle后运行时内存大小和什么有关系3)手机上应用MRT的限度和兼容性4)如何管制粒子系统组件数量的下限 这是第317篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) LoadingQ:在切场景时,为什么调整Application.backgroundLoadingPriority为High能够缩小加载耗时呢? A:Application.backgroundLoadingPriority这个API会限度主线程的集成的工夫,默认设置是ThreadPriority.BelowNormal,也就是每一帧执行主线程集成的操作耗时不能超过4毫秒,这将会导致每一帧残余的工夫用于期待或者渲染,而这些期待和渲染的工夫都是无意义的耗时。如果把这个设置改为ThreadPriority.High,那么每一帧执行主线程集成的操作耗时能够减少到50毫秒,大大减少了所须要的帧数。 这里主线程的集成工夫体现在函数Application.Integrate Assets in Background下面,它会受到加载Texture、Mesh的Texture.AwakeFromLoad、Mesh.AwakeFromLoad的影响,另外对于比较复杂的Prefab(父子节点多,层数多)须要进行拼装,耗时也会体现在这个函数当中。 感激龙粲@UWA问答社区提供了答复,欢送大家转至社区交换 AssetBundleQ:SpriteAtlas打包AssetBundle后运行时内存大小和什么有关系?明明只有2张Atlas,2个纹理只有6MB,最终AssetBundle的内存却达到11.7MB。 A:运行时AssetBundle大小会受到打包Sprite数量的影响,打包了1700个Sprite的状况下AssetBundle内存11.7MB。 测试了同样大小的SpriteAtlas,打包了6个1024*1024大小的Sprite,AssetBundle大小却只有4.9KB。 感激宗卉轩@UWA问答社区提供了答复 RenderingQ:手机上应用MRT有什么限度吗,兼容性如何? A:在反对OpenGL ES 3.0的手机上就反对MRT,可参考:https://www.informit.com/arti... https://registry.khronos.org/... 另外实测过,在红米4X这样十分低端的手机上,MRT也是能够失常运行的。红米4X的GPU是Adreno 505。 感激Xuan@UWA问答社区提供了答复 RenderingQ:我的项目Overdraw有点高,咱们想做一个与MMO游戏里同屏角色数量下限相似的,粒子系统下限的性能。 也就是低端分档下,当粒子数量达到某个值当前,就不再往画面里画新的粒子了。但只对特效Prefab数量做限度还是比拟含糊,毕竟不同特效的粒子数量不同,所以想准确到播放状态的粒子组件数量。 A1:用Find必定很耗时,尽量用逻辑做。比方,粒子系统个别都做缓存池治理,能够间接把相干逻辑写在这里:做一个计数器C,某个特效E要实例化或出池时,同时传入它的子粒子数量A(提前配置好),加给C;入池再减掉A;对C作监控看是否在某个值内,否则进行所有实例化和出池操作。同理,给每个特效E挂一个触发器脚本,激活或暗藏的时候把子粒子数量A传给写在某处逻辑的计数器C即可。 另外理论做的时候,还能够给不同的粒子特效加上不同的计算影响系数,这样能够让某些特效(比方多人游戏中玩家角色的技能)呈现的概率更高一些,而其余特效(其余玩家的技能)显示得少一些。 感激Faust@UWA问答社区提供了答复 A2:提个思路,对于每一个特效Prefab,能够离线给这个Prefab做一个评分。对于场上存在的特效Prefab,记录总的特效评分,能够设置一个总的下限评分,超过就不显示。<br/>这样问题就抛到了离线剖析每个特戏Prefab评分上,评分参考维度能够参考:特效粒子发射器数量、特效overdraw、特效Batches、特效内存等等。感激范世青@UWA问答社区提供了答复 封面图来源于网络 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 官网:www.uwa4d.com官网技术博客:blog.uwa4d.com官网问答社区:answer.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:793972859(原群已满员)

December 15, 2022 · 1 min · jiezi

关于loading:React-loading

需要家喻户晓,利用如果少了loading,交互就显得生硬。 本文分享如何在React中从零到一实现并应用loading。 实现一个loading,应该始终呈现在视口的正中。 同时为了示意加载过程的动态性,须要适当的动画。 以及,胜利和失败的提醒与loading其实实质上是一回事,所以,实现loading的同时,也顺便将另外两个一并实现。 严格意义上,这是toast的实现。 Toast.jsximport l from './toast.module.css'import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'import {faCheck, faSpinner, faTriangleExclamation} from '@fortawesome/pro-solid-svg-icons'import PropTypes from 'prop-types'import {memo} from 'react';function Toast({type, message}) { return ( <div className={l.toast} > <div className={l.container} > { type === 'success' ? <FontAwesomeIcon icon={faCheck} /> : type === 'fail' ? <FontAwesomeIcon icon={faTriangleExclamation} /> : <FontAwesomeIcon icon={faSpinner} className={l.loading} /> } </div> { message ? message : type === 'success' ? '实现' : type === 'fail' ? '失败' : '加载中' } </div> )}Toast.propTypes = { type: PropTypes.oneOf(['loading', 'success', 'fail']), message: PropTypes.string}export default memo(Toast)toast.module.css:root { --toastSize: 136px; --containerSize: 40px;}.toast { width: var(--toastSize); height: var(--toastSize); position: fixed; top: calc(50vh - var(--toastSize)/2); left: calc(50vw - var(--toastSize)/2); background: #4C4C4C; border-radius: 12px; display: flex; flex-direction: column; align-items: center; justify-content: center; color: rgba(255, 255, 255, .9);}.container { width: var(--containerSize); display: inherit; flex-direction: inherit; align-items: inherit; margin: 0 auto 16px;}.container > svg { height: var(--containerSize);}.loading { animation: rotate linear 1s infinite;}@keyframes rotate { from { transform: rotate(0); } to { transform: rotate(360deg); }}应用路由loading的首要利用场景就是页面间的切换。 ...

August 6, 2022 · 2 min · jiezi