文档章节

优化Flash中的3D模型加载

clschen
 clschen
发布于 2015/02/04 16:13
字数 1122
阅读 849
收藏 1

来自:Kid's Zone

最近在做一个公司的Flash3D页游项目,遇到了这个问题,前前后后断断续续也优化了一段时间,觉得还是有必要记录一下一些优化的心得。

Flash中加载资源一个最大的问题在于难以使用另外的线程加载资源。诚然Flash有Worker线程,但Worker存在以下几个问题:
1. 使用Worker要求客户的FlashPlayer播放器版本不能过低。
2. 不同Worker之间传递数据手段非常少,缺乏共享内存。使用ByteArray共享数据的话需要先把数据序列化成AMF格式,无论序列化还是解析都是一个耗时的操作。
3. Worker实际上是另一个swf文件,增加程序复杂度。
4. 需要使用FlashBuilder4.7才能开发worker,而4.7一堆bug。

既然只能在渲染线程中加载和解析模型,那么我们就只能力求加载速度足够快。同时,作为页游,模型文件的体积也要足够小。

模型文件格式的选择

基于多种考虑,我们最终使用MD5作为模型文件格式:
1. 它支持骨骼动画。
2. 它是文本格式文件,便于查错。
3. 它是一种通用的文件格式而非我们自定义的文件格式,因此可以使用多种模型查看器浏览。
4. 它的压缩率在文本格式文件中比较高。

当然了,解析文本格式的模型有个非常严重的问题,那就是解析速度慢得难以忍受。因为解析模型需要不断地在AS3中调用string.getCharAt(),而这是个非常耗时的操作。

使用AMF加速模型解析

我首先做的一个尝试就是使用Adobe自带的AMF格式加速模型解析。具体做法就是先把解析好的模型序列化为AMF然后保存成文件。当加载的使用ByteArray.readObject()反序列化文件。这个方法解析模型相当快。快到什么程度呢?解析一个3000面的模型仅需要6毫秒。然而,序列化成AMF文件后,模型体积会增大,且无法使用zip进一步压缩。因此只能忍痛放弃。

使用JSON加速模型解析

其实解析模型慢的主要原因是AS3本身慢,假如能把解析工作移至C++中做,一切都会变得很美好。对于这点,我并没有选择使用FlasCC,原因有两个,一是Flash官方已经放弃FlasCC了(囧),二是使用FlasCC需要引入一个1m大小的库(坑爹)。

所以我就想到了使用JSON。Flash本身是自带JSON解析的,而且效率很高。同时,将MD5转成JSON格式非常简单,还保留了可读性。同样的一个3000面模型,JSON解析部分耗时9毫秒。最终,我们决定使用JSON格式。

进一步压缩文件大小

使用3ds Max导出的模型顶点数据精度都很高,有些甚至到了小数点后8位。实际上由于游戏中我们并不需要显示那么大的模型,所以要求的精度也没有那么高。根据实测,模型文件精确到小数点后4位,动作文件精确到小数点后6位,从视觉上看不出和原文件有什么不同。经过这一步处理,文件的体积可以进一步缩小20%-25%。

分片加载

实际上模型除了json本身的解析外,还需要根据骨骼和权重生成模型,计算法线等。一般来说,一个模型的解析耗时在30-50毫秒之间(AMF则不同。由于AMF是把内存中的模型直接序列化成文件,因此在反序列化时不需要做任何额外处理)。对于一个目标帧率为60的游戏来说,这个时间远远超出了一帧16毫秒。因此,最后要做的事情就是把任务分拆成小块,每帧只进行一部分的加载。经过这样的处理以后,就可以实现在场景中动态加载模型时不卡帧。

 

=》Away3d官网上关于away3d的介绍

=》33号铺 – 开源淘宝客瀑布流发布和管理系统

http://www.chenlinsheng.com/?p=1241

 

本文转载自:http://www.chenlinsheng.com/?p=1241

clschen
粉丝 4
博文 21
码字总数 10662
作品 1
广州
程序员
私信 提问
中央空调机房的运行设备动画模型 3D Flash 设计开发

【业务需求】 建立中央空调机房的运行设备动画模型,发布在网站上 Flash可以根据数值状态进行动画切换 Flash提供接口,加载XML文件 【人员要求】 熟练掌握flahs的设计和制作,具备工业产品(...

飞鸟50287
2016/01/13
5
1
3D引擎--NewX3D

这是一套基于ActionScript 3.0和Flash 10平台的3D引擎。感谢大家的建议和帮助,希望诸位给与更多的支持,我会与大家一道努力将其发展成一款成熟的引擎。 This is an opensource 3D engine ba...

匿名
2010/03/04
1K
0
Papervision3D

这个项目我是大半年前看到的,当时给我的感觉就是惊天地,泣鬼神啊。谁说FLASH不能做3D(哦,当时是只有FLEX,不知道现在FLASH 9能不能用这套类库),谁说FLASH的3D性能不好,谁说FLASH的3D编...

匿名
2010/03/27
5.1K
0
Ubuntu上让Firefox使用Chrome最新版PepperFlash插件

2016-11-11更新: 最新消息是Adobe将定期发布Flash Player的NPAPI版和PPAPI版,将保持大的版本号同步. Adobe做出这个决定主要是出于安全方面的考虑. 因此部分特性如GPU 3D加速和付费视频的DRM...

eechen
2015/01/08
0
13
打造最美HTML5 3D机房(MONO哥强势归来,第四季惊艳发布)

前言 初次见面的朋友们大家好,简单自我介绍一下:我是Mono哥,性别男,爱好。。。编程,自从一年多前入了HTML5和WebGL的坑,就再也没有爬出来过,目前正在钻研3D机房以及相关的3D应用。这篇...

MonoLog
2017/11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

抽象同步队列AQS——AbstractQueuedSynchronizer锁详解

AQS——锁的底层支持 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资...

须臾之余
今天
3
0
springboot配置百度UEditor 富文本详解

富文本简介 UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码... 准备工作 ueditor需要单独文...

wotrd
昨天
4
0
mysql 5.7之my.cnf配置大全

[client]port = 3306socket = /tmp/mysql.sock[mysqld]###############################基础设置######################################Mysql服务的唯一编号 每个mysql服务...

Online_Reus
昨天
3
0
MAVEN打包时引入外部链接的包

1.项目引入了ORACLE的jar包,MAVEN配置如下 2.打jar包的时候需要指定下main入口函数mainClass <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> ......

Cobbage
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部