基于Adobe Flash平台的3D页游技术剖析
写在前面
从黑暗之光,佛本是道,大战神的有插件3D页游。再到如今的魔龙之戒。 足以证明,3D无插件正在引领页游技术的潮流。
目前,要做到3D引擎,有以下几个选择。
说到这里,我们发现。这些都不重要。 因为本文目的就是从头到尾分析一下Adobe Flash平台目前对3D游戏的支持情况。
言归正转
本来是想写一些关于Stage3D、FlasCC以及基于Flash的3D页游引擎方面的文章。 也做了几天的准备工作,希望把这些事情能够给大家(主要是公司项目组内的成员)分享,并理清头绪。
然而就在周末准备资料的时候,我发现我需要解决的是平日里开始过程中经常问的一些问题。比如:
“我们用哪个版本的Flash Player比较好”
“在项目中使用了worker和mutex,不知道会不会提高对flash player版本的要求“
“AGAL 1.0,2.0,3.0的差异以及对应的FP版本是什么”
诸如此类的问题在项目开发过程中屡见不鲜。那要能准确回答这些问题,则需要对FP各版本的特性有一个充分的了解。就像下面这样的一个二维表
在网上搜索flash player特性与版本号的对应关系无果后,我最后决定自己来。 从各个版本的release notes中提取想要的这个信息。
而要。我打算从Flash Player第一个支持3D加速的版本开始。通过各个Flash Player版本的特性更新,以及周边支持来分析出Adobe Flash目前对3D支持的情况 。
Adobe Flash Player各版本中与3D游戏相关的特性进化史
Flash Player 11 and Adobe AIR 3 (October 4, 2011)
Release Notes: https://release-notes-flash-player-11.html
• Stage 3D Accelerated Graphics Rendering (Player & AIR desktop + AIR for TV)
这是第一个支持3D加速的FP版本。FP通过Stage3D提供了GPU的3D加速支持,但是这个版本还不支持移动版本。
Flash Player 11.1 and Adobe AIR 3.1
Release Notes: https://developer-releases-notes-11_1.html
这个版本并没有什么值得关注的特性,主要是修复BUG和提升对Android的支持力度
Flash Player 11.2 and Adobe AIR 3.2 (March 28, 2012)
Release Notes: https://release-notes-developer-flash-player.html
• Stage3D for Adobe AIR (mobile)
• Mouse Lock
此版本提供了mobile版本的GPU加速支持。
另外,还增加了一个鼠标锁的特性。可以让我们无限制地滑动鼠标,但是这个只在全屏模式下有效。 在实现CS这种FPS游戏的时候非常有用。
与此同时,发布了游戏开发者页面 http://gaming.adobe.com
Adobe Flash Player 11.3 and AIR 3.3 (June 8,2012)
Release Notes: https://developer-release-notes-11_3.html
• Full screen keyboard input
全屏模式下的键盘输入。 在此版本之前,全屏模式下是不能进行键盘交互的。 这个特性是我们做3D全屏游戏不可缺少的东西。
这个版本没有任何3D相关的新特性,只是增加了WIN8的支持。
Adobe Flash Player 11.4 and AIR 3.4 (August 21,2012)
Release Notes: https://fp_114_air_34_release_notes.html
•ActionScript Workers (Flash Player)
•Licensing support: Flash Player Premium Features for Gaming (Flash Player)
•Stage3D "constrained" profile for increased GPU reach (Flash Player and AIR)
•LZMA support for ByteArray (Flash Player and AIR)
•StageVideo attachCamera/Camera improvements (Flash Player and AIR)
•Compressed texture with alpha support for Stage3D (Flash Player and AIR)
•DXT Encoding(Flash Player and AIR)
这是一个相当重要的版本,可以说是自Flash Player 11.0发布后,第一次对3D相关的内容进行补充和完善。如上所示
一、它提供了多线程支持。对于大型文件的解压和解析,不会使游戏造成卡顿了。
二、给Stage3D添加了一个‘受限’模式。 在受限模式下,Stage3D可用的资源相对而言会变少,但是可以兼容更老的显卡。
三、FLASH也提供了原生的LZMA支持。 这样一来,我们只需要将配置文件使用LZMA压缩。然后ByteArray读取后,采用LZMA解压即可。 无需再集成第三方的解压库。
四、ATF支持ALPHA通道的压缩格式。 同时,也添加了上传纹理时,使用DXT压缩的支持。
五、除开Stage3D本身,Adobe又引入了一项新技术 Flash Player Premium Features for Gaming 从链接指向的网页介绍和FAQ中可以看出。 这个所谓的Premium Features,就是Adobe提供给开发者的,将C++等其它语言编译为Flash Player的基础API集合。 XC APIs 。 而其后推出的FlasCC,则是XC APIs的 C++绑定。 当年Unity发布FLASH平台的时候,应该是直接使用的XC APIs。 目前在官网上已找不到XC APIs的东西了。 官方提供的链接也已经重定向到了游戏开发者页面。 我猜是被FlasCC取代了。
Adobe Flash Player 11.5 and AIR 3.5 (November 6,2012)
Release Notes: https://fp_115_air_35_release_note.html
•Shared ByteArray
•Debug stack trace in release builds of flash player
shaderd bytes array用于减少workers通信时的内存拷贝
RELEASE下的TRACE,则让我们在RELEASE的情况下更容易查错
这个版本没有任何3D相关的新特性,添加了Invoke事件支持。 即AIR EXE启动的时候,可以传递参数。
Adobe Flash Player 11.6 and AIR 3.6 (February 2,2013)
Release Notes: https://fp_116_air_36_release_notes.html
• Separate sampler state for Stage3D
在此之前,我们只能用 tex ft0,v0,fs0<2d,linear,repeat>方式来决定一个纹理的采样方式。 11.6提供了一个Context3D.setSamplerStateAt方法,使我们可以动态改变一个纹理的采样规则而不用重建AGAL。
这个版本没有任何3D相关的新特性,添加了一些iOS需要的特性。
Adobe Flash Player 11.7 and AIR 3.7 (April 9,2013)
Release Notes: https://fp_117_air_37_release_notes.html
•added Context3DTextureFormat.BGR_PACKED
•addedContext3DTextureFormat.BGRA_PACKED
新增了Context3DTextureFormat.BGR_PACKED和Context3DTextureFormat.BGRA_PACKED纹理格式。 注:BGR_PACKED = bgr565, BGRA_PACKED = bgra4444
添加了一些iOS需要的特性。
Adobe Flash Player 11.8 (July 9,2013) and AIR 3.8 (July 24,2013)
Release Notes: https://fp_118_air_38_release_notes.html
•Context3DProfile.BASELINE_EXTENDED
•Context3D.createRectangleTexture
新增了Context3DProfile.BASELINE_EXTENDED模式,在这个模式下,贴图和RT的大小最多可以为4096*4096。
Context3D.createRectangleTexture创建一个用于RT的纹理
添加了一些移动端需要的特性。
Adobe Flash Player 11.9 and AIR (October 8,2013)
Release Notes: https://fp_119_air_39_release_notes.html
这个版本没有任何3D相关的新特性,添加了一些移动端需要的特性和WIN8支持
不过,伴随11.9,ADOBE提供了ASC 2.0 compiler。 据说可以提升编译后的AS3代码执行效率。
Adobe Flash Player 12 and AIR 4 (January 14,2014)
Release Notes: https://fp_12_air_4_release_notes.html
•Graphics: Buffer Usage flag for Stage3D
•Stage3D Creation of Context3D with Profile Array
如上
这个版本提供了Buffer使用标记。用于告诉显卡,Buffer提交的数据是永久有效,还是临时数据(一般用在动态填充的情况,比如粒子系统)。 能够显著的提升渲染效率。
同时,这个版本使我们在创建一个设备时,给一串profile,Stage3D会帮我们选择最适合的那一个。这个一般是拿来做兼容性测试。 用于检查设备支持哪一个档位的profile。 而材质LOD,还是得自己做。
Adobe Flash Player 13 and AIR 13 (April 8,2014)
Release Notes: https://fp_13_air_13_release_notes.html
•New Stage3D Texture Wrapping Modes
•Stage3D Anti-Aliasing for Texture Rendering
这个版本使提供了更多的纹理环绕模式。之前只能是是否要repeat。 现在添加了clamp,并且可以分别决定U,V的wrapping方式。
为RT添加了MSAA抗锯齿功能。
Adobe Flash Player 14 and AIR 14 (June 10,2014)
Release Notes: https://fp_14_air_14_release_notes.html
•Anisotropic Filtering
•New Stage3D "Standard" Profile
•AGAL v2.0
•MRT up to 4
•Context3DTextureFormat.RGBA_HALF_FLOAT
提供了各异向性纹理采样方式,这种方式比双线性采样开销大,但是效果会更好。
添加了新的 "Standard" Profile。 在这个Profile下。 AGAL v2.0可用。 MRT(4) 可用。 浮点纹理 HALF_FLOAT (FMT_F16)可用。 至于AGAL 2.0和1.0的区别。如下图所示
Adobe Flash Player 15 and AIR 15 (Sept. 9,2014)
Release Notes: https://fp_15_air_15_release_notes.html
•Relaxing Stage3D Render Target Clear
•Stage3D “Standard” profile support for iOS and Android
之前的版本中,要求present必须配套使用clear操作。 现在不用了。 这样就可以让多个RT共享深度信息。
将上一个版本的 "Standard" Profile上到移动平台上。
Adobe Flash Player 16 (November 9,2014) and AIR 16 (January 13,2015)
Release Notes: https://fp_16_air_16_release_notes.html
•Stage3D Wireframe Mode Support
•Stage3D - Standard Constrained Profile
支持线框模式,不过仅限于AIR版本的桌面环境
支持受限的Standard Profile
各Profile特性差异比较如下图
Adobe Flash Player 17 and AIR 17 (March 12,2015)
Release Notes: https://fp_17_air_17_release_notes.html
•Stage3D - Standard Extended Profile for AIR Mobile
支持 Standard Extended Profile。 也就是传说中的AGAL v3.0。 但是这个版本只对移动端有效。 是的,你没有看错,这个版本中,移动端先有。 PC还要等一下。
AGAL v3的东西,可以参考上面Flash Player 14的那张图。同时,下面附带了一张小图
Adobe Flash Player 18 and AIR 18 (June 9,2015)
Release Notes: https://fp_18_air_18_release_notes.html
• Stage3D - Standard Extended Profile for Desktop
• ETC2 Support for ATF
嗯。17版本的承诺,在这里兑现了。 PC也可以用AGAL 3.0了
ETC2就是带透明通道的ETC,不过是ANDROID用的。
Adobe Flash Player 19 and AIR 19 (Sept. 9,2015)
Release Notes: https://fp_19_air_19_release_notes.html
• Improved Stage3D Error Messages
加强化Stage3D的错误信息机制。 就是说,如果实在不好查错,不妨试试高版本的FP编译。 看看能不能快速定位错误。
Alchemy --> FlasCC --> CrossBridge
Flash Player暂时放一边,我们来说说Adobe游戏技术中,另一个主要成员 FlasCC。
之所以本文还叫它FlasCC,是因为这是Adobe给它的正式的名字。它的主要功能就是将C++代码编译为SWC和SWF,以供在FLASH平台上使用。
它的前身叫Alchemy,是一个试验性的东西。 网上很多AS3嵌入LUA的教程,用的就是这个版本。
后来Adobe在2012年12月4日正式发布了 FlasCC 1.0.0。试图让一些端游公司能够借用这个技术,快速地将游戏移植到页游平台。 试想,这是一个多么棒的策略啊。 似乎所有的端游CP,在一夜之间,就成了ADOBE的人。 可惜此版本因为编译出来的包巨大,以及很多端游采用的其实是D3D,并非OPENGL。 FlasCC并未得到太多团队的认可。
FlasCC在2013年2月7日发布了1.0.1版本。 做了许多优化。 而团队博客上最后一篇文章是 2013年3月18日。 说了一些关于编译和优化的建议。 此后,再无消息。
此后在Github出现了CrossBridge。 其更新也停止在了2014年。
Away3D
Away3D,Flare3D,Alternativa3D等引擎在Adobe发布FP 11的时候,都不约而同地发布了第一个3D加速版本。 此后的一年里,更是穷追猛打。一口气更新了许多个版本。 首当其冲的应该要算Away3D。 拉到了Adobe的投资,建立了Away Fundation。 同时,被收入到了 Adobe Gaming SDK中。
然而,这个引擎在2014年1月24日,发布了4.1.6后,再也没有发布过新版本。 团队博客最后一篇文章是2014年7月26日。
结束语
本意是想写一篇描述Adobe对3D技术的支持情况和未来可能的发力程度。 不想挖出了这么多黑历史。 而最关键的因素就是时间。
我们可以看出。Flash Player 11.6是一个稳定且可用的版本。 在这个版本中,我们可以使用Adobe的Stage3D加速功能,可以使用多线程,可以使用FlasCC做复杂的数学运算。可以在全屏下无限制地移动鼠标和做键盘操作。 可以使用ATF进行纹理格式压缩。
同时,也有像Away3D一样的开源或者商业引擎使用。
然而,2013年底到2014年初。 Adobe似乎停止了Stage3D和FlasCC方面的开发工作。 从后面的FP版本更新内容看来,仅是对Stage3D做了一些小的特性支持。 并且加强对移动平台的支持力度。
同时,FlasCC以CrossBridge的方式在Github上出现,到2014年初也停止了更新。
Away3D亦是如此,Away3D的Github也停止在了2014年。
紧接着,Adobe将Flex SDK交给了Apache,以及关闭大中华区研发部门。
我想这可能是Adobe的资金出现了问题。导致了一些工作重心的转移。 Adobe毕竟最赚钱的还是它的PS,AE,FLASH IDE工具。
最近也有很多朋友问我,用Flash做3D页游靠谱么? 为什么不直接用WEBGL。
在写这篇文章之前,我想我无法说服他。
但是有了这篇文章,我可以明确地告诉他。
1、Flash Player 11.6 就足够我做出画质很NB的游戏
2、Away3D 4.1.0 就已经是一个稳定版本。
3、FlasC 1.0.1 就俱备了实用性
4、电信宽带已经20MB普及了
更何况,Flash Player 17已经把Stage3D推到了Opengl ES 3.0的高度。 还有什么实现不了呢!
这篇文章确实没有对Stage3D,FlasCC,Away3D做详细的分析。 待我有空,再向大家尾尾道来! 谢谢捧场!!
参考资料:
Flash Player Release Notes:
https://helpx.adobe.com/flash-player/flash-player-releasenotes.html
FP & AIR Feature List:
http://www.adobe.com/devnet/articles/flashplayer-air-feature-list.html
AGAL Binary Format:
http://help.adobe.com/en_US/as3/dev/WSd6a006f2eb1dc31e-310b95831324724ec56-8000.html
Adobe Gaming Website:
FlasCC Reference :
http://www.adobe.com/devnet-docs/flascc/docs/Reference.html
FlasCC Blog:
作者:麒麟子
出处:http://www.cnblogs.com/qilinzi/
蛮牛专栏:麒麟子
简介:麒麟子,编程15年,科技创始人,技术作家。
09年进入游戏行业,16年创立成都幼麟科技有限公司。十年从业经验练就了游戏全栈技能,目前专注于手机游戏领域。
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。