初级执事
阅读权限 2
积分 1985
侠名
UID 43
主题
帖子
精华
好友
银子
金子
贡献
威望
推广
活跃
荣耀
注册时间 2017-11-7
最后登录 1970-1-1
在线时间 小时
个人主页
|
【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 TKCB 于 2020-2-20 22:47 编辑
flash/AIR解决方案中,
对嵌入在swf/swc中的声音进行播放不会引起明显卡顿,
但是对调用loadSound或首次播放操作会造成游戏卡顿。
如此scout截图。
黄色柱部分,标记为“网络和视频”的,是声音loadSound或者首次播放开销
推测为loadSound中打开文件流、mp3初步解压等造成。
此开销是同步的,即使在PC也会造成游戏卡顿,在手机客户端上更加明显。
解决的方案,利用worker将其变为异步。
此worker代码不多,不会改变已有项目结构,对已上线的项目也能安全使用。
个人认为有做的价值。
主项目初始化worker代码
- worker = WorkerDomain.current.createWorker(loader.data, true);
- outputStream = Worker.current.createMessageChannel(worker);
- inputStream = worker.createMessageChannel(Worker.current);
- worker.setSharedProperty("w2m", inputStream);
- worker.setSharedProperty("m2w", outputStream)
复制代码
worker项目构造函数
- outputStream = Worker.current.getSharedProperty("w2m")
- inputStream = Worker.current.getSharedProperty("m2w");
- inputStream.addEventListener(Event.CHANNEL_MESSAGE, onInput);
复制代码
主项目在需要加载和播放声音时,用调用worker取代之前的sound.loadSound和sound.play
- outputStream.send({soundAddress:声音文件地址, command:"loadSound"})
- outputStream.send({soundAddress:声音文件地址, command:"play"})
复制代码
worker的对接代码
- public var soundDic:Dictionary = new Dictionary
- public function onInput(event:Event):void
- {
- while(inputStream.messageAvailable){
- var obj:Object = inputStream.receive();
- switch(obj.command){
- case "play":
- soundDic[obj.soundAddress].play()
- break
- case "loadSound":
- if(!soundDic[obj.soundAddress]){
- soundDic[obj.soundAddress] = new Sound
- }
- soundDic[soundDic[obj.soundAddress]].loadSound(new URLRequest(obj.soundAddress));
- break
- }
- }
- }
复制代码
一些扩展,例如设置音量、中途停止声音等,可以以此格式编写。
此后声音加载消耗会转移到cpu的其他核心上,
主项目的声音加载消耗变成0,避免声音加载时造成游戏的瞬间卡顿。
一些值得注意事项:
在IOS上实测worker可以使用,甚至能用来热更。
作为worker的swf如果不能正常加载,试导出发布版的swf
在scout上开启 “编辑>首选项>测试版功能>启用用于ActionScript Worker的会话” 即可在Scout上查看worker的trace
即使能通过scout看trace,仍强烈推荐对worker执行部分进行try...catch并把错误信息发送给主项目处理
在用户客户端,主项目检查到worker不可用时,不管什么原因可以无缝切换回原来的声音在主项目播放的模式。
从主项目传递声音地址到worker时,可接受"app:/"开头的地址,但是不能传递"app-storage:/"的地址。worker对app-storage的指向和原本项目不同。一定传递的话,可改为传递new File(原地址).nativePath
|
评分
-
参与人数 1 | 银子 +30 |
金子 +1 |
贡献 +3 |
收起
理由
|
TKCB
| + 30 |
+ 1 |
+ 3 |
11RIA 对大神的敬仰,如滔滔江水连绵不绝~~. |
查看全部评分
|