优化Flash中的3D模型加载

来自: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的介绍

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

时间: 2024-08-09 08:08:49

优化Flash中的3D模型加载的相关文章

OpenGL学习脚印:模型加载初步-加载obj模型(load obj model)

写在前面 前面介绍了光照基础内容,以及材质和lighting maps,和光源类型,我们对使用光照增强场景真实感有了一定了解.但是到目前为止,我们通过在程序中指定的立方体数据,绘制立方体,看起来还是很乏味.本节开始介绍模型加载,通过加载丰富的模型,能够丰富我们的场景,变得好玩.本节的示例代码均可以在我的github下载. 加载模型可以使用比较好的库,例如obj模型加载的库,Assimp加载库.本节作为入门篇,我们一开始不使用这些库加载很酷的模型,而是熟悉下模型以及模型加载的概念,然后我们封装一个

cocos2d-x模型加载的重构,我眼中的面向对象

这两天在写cocos2d-x加载ogre的mesh模型的东西,完成了一半了,还差动画文件没接进来.这篇文章并不是教如何加载模型文件的,因为那种东西没什么可教的,无非就是加载文件,然后解析出自己想要的顶点.关键帧等数据,最后给coco2d-x中的MeshData赋好值.这里我想表达一些我有关代码格式.代码设计.代码重构的想法,我会分一些有关或者无关的问题,来逐一分析. 一.为什么要支持多种模型格式?cocos2d-x自己定义一种新的格式c3d.c3t这样好不好? 首先,我认为,一个成熟的游戏引擎不

DirectX的OBJ模型加载与渲染

在之前的DirectX例子里我用的模型是.x文件,DirectX有一个方法D3DXLoadMeshFromX可以加载.x模型,但是这里有个问题,.x文件是没法用文本编辑器打开查看结构的,这里我来演示一下如何解析.obj模型. 首先让我们看一下.obj模型的组成部分以及结构,一个完整的obj模型一共分为三个部分:obj模型文件,mtl材质文件,纹理贴图;其中obj文件和mtl文件是可以用文本编辑器打开的,先打开obj文件,可以看到这样的内容: v -3.000767 2.993211 2.0142

页面性能优化-原生JS实现图片懒加载

在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再加载更多的图片.这种加载图片的方式叫做图片懒加载,又叫做按需加载或图片的延时加载.这样做的好处是:1.可以加快页面首屏渲染的速度:2.节约用户的流量. 一.实现思路 1.图片img标签自定义一个属性data-src来存放真实的地址. 2.当滚动页面时,检查所有的img标签,判断是否出现在事业中,如果

【vue】vue-cli3构建项目中实现图片懒加载

前两天正好写了文章如何用实现图片懒加载[性能优化]JS实现图片懒加载,今天在使用vue构建项目的时候就遇到了要做图片懒加载的优化需要,本想把前两天的代码直接copy过来的,后来想查查看有没有更简便的方法,果不其然,vue中直接有插件可以使用,看了下实现时候的效果,实现原理都和原生js是一样的,vue果然真香! 接下来我们来讲vue-lazyload插件的使用: 1.安装插件 cnpm i vue-lazyload -S 2.入口文件main.js中配置: import Vue from 'vue

Hadoop中WordCount代码-直接加载hadoop的配置文件

Hadoop中WordCount代码-直接加载hadoop的配置文件 在Myeclipse中,直接编写WordCount代码,代码中直接调用core-site.xml,hdfs-site.xml,mapred-site.xml配置文件 package com.apache.hadoop.function; import java.io.IOException; import java.util.Iterator; import java.util.StringTokenizer; import 

Qt中如何 编写插件 加载插件 卸载插件

Qt中如何 编写插件 加载插件 卸载插件是本文要介绍的内容.Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库.由于在开发项目的过程中,要开发一套插件系统,就使用了Qt的这套类库. 一 编写插件 编写一个Qt的插件需要以下步骤 1.声明一个插件类, 2.定义一个类,实现这个插件类定义的接口,定义的这个类必须从QObject集成下来. 3.使用Q_INTERFACESQ_INTERFACE

Android中ViewPager+Fragment懒加载问题解决方案

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878 本文出自[DylanAndroid的博客] Android中ViewPager+Fragment懒加载问题解决方案 在Android中我们经常会用到ViewPager+Fragment组合.然而,有一个很让人头疼的问题就是,我们去加载数据的时候 由于ViewPager的内部机制所限制,所以它会默认至少预加载一个.这让人很郁闷,所以,我就想到要封装一个Fragme

Android新浪微博客户端(七)——ListView中的图片异步加载、缓存

原文出自:方杰|http://fangjie.sinaapp.com/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54该项目代码已经放到github:https://github.com/JayFang1993/SinaWeibo 一.ListView的图片异步加载 我们都知道对每一个Weibo Item都有用户头像,而且每一条微博还可能带有图片.如果在加载列表的同时加载图片,这样有几个缺点,第一很费事,界面卡住,用户体验很不