2010年2月22日 | 标签: , ,

1. 关于存储

  • 使用适当的Display Object
    • Shape – 没有交互(占内存少)
    • Sprite – 有交互(占内存多)
    • MovieClip – 有时间线(占内存更多)
  • 尽可能重用对象,而不要重新创建
  • 强制类型转换int(exp)要比Math.floor()和Math.ceil()快很多
  • 使用对象池技术重用对象
  • 释放内存 – 将所有对象的引用设置为null
  • 尽可能重用BitmapData
  • Callback要比event快而且消耗更少的内存

2. 减少CPU使用率

  • 即便将一个Display Object从stage上移除了(removeChild)甚至是已经将它的引用设置为null,它依然有可能在消耗CPU。所以要在其移出display list时将其完全停下来(比如mc.stop())。
  • 卸载从外部装载的内容时,使用loader.unloadAndStop(),而不要使用loader.unload()。
  • 尽可能禁用鼠标交互。obj.mouseEnabled = false; obj.mouseChildren = false;
  • Timer在某些情况下比ENTER_FRAME要好。
  • 减少tweening的使用。

3. ActionScript性能

  • 尽 可能使用Vector替代Array。固定长度的Vector更快。(Vector可以这样初始化:var coords:Vector.<Number> = Vector.<Number>([132, 20, 46, 254, 244, 100, 20, 98, 218, 254]);)
  • 新的drawing API更快,它们是:drawPath, drawGraphicsData, drawTriangles。
  • 使用setVector()方法来处理像素。
  • 使用setPixel()和setPixel32方法时,要配合使用lock()和unlock()方法。
  • 使用TextField时,appendText()方法比+=操作符要快。
  • 尽可能在避免在循环内更新TextField。
  • 尽可能少使用方括号操作符访问Vector或Array元素,可以利用一个临时变量来操作。
  • 尽量将代码内嵌,避免过多的函数调用。(比如用 value > 0 ? value : -value; 来代替Math.abs())
  • 代码量过大也会造成性能的降低。尽量少使用大型第三方库(Flex, TLF)。
  • 避免在循环内使用evaluating statements(myArray.length)。用临时局部变量来操作。
  • 更多优化技巧参考:http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/

4. 渲染性能

  • 尽可能避免使用alpha参数。
  • 适当的使用cacheAsBitmap可以大幅提高性能。(对于变化少的矢量元件)
  • 针对每个子元件使用cacheAsBitmap而不是针对父元件使用。
  • 使用TextLine处理静态文本比TextField快而且使用更少的内存。
  • 使用cacheAsBitmap和opaqueBackground参数可以改进渲染性能(包含TextField)。
2010年1月21日 | 标签: , ,

不幸今天遇到了getBounds的怪现象,一搜果然很多人也曾经郁闷过。后来改用getRect。

以下是参考文章:

2010年1月19日 | 标签: , ,

以前我转载过一篇文章,说的是如何防止flash中的滚轮事件影响到整个页面。但是那个方法是通过在页面中插入一段js代码来实现的。

今天,我又看到一篇文章,它不是在页面上解决此问题,而是在flash内部解决的,这无疑更加方便了开发者。

请参考:

在SWF内滚动,而不是页面上

2010年1月14日 | 标签: ,

国外一个牛人用纯JS写的swf播放器,不知道支持到什么程度。无论如何,其效果让人震惊。

以下是demo:

http://paulirish.com/work/gordon/demos/

2010年1月13日 | 标签: , , ,

全局变量、右键支持等…

地址:http://www.uza.lt/codex/

2010年1月8日 | 标签: , ,
2010年1月4日 | 标签: , , ,

出于一些安全原因,flash player对本地swf文件做了许多限制。比如从本地装载一些文件并加以分析之类的操作。

那么应该怎么做呢?其实很简单,吧swf编译成exe即可。

据我的测试,用这个方法加载分析本地的文件没有任何问题。

只是exe是不是真的不受任何安全策略的限制? 如果你知道答案请留言。 :twisted:

2009年12月11日 | 标签: , , , , ,

近期的一个FB工程里面需要用到比较复杂的Flash CS3资源(就是MC套子MC,子MC又有很多帧,帧上又有很多MC的那种…)。而且在这些MC中,某些帧上是有代码的。

遇到两个问题:

  1. Flash资源帧上的代码没有执行。
  2. gotoAndStop之后无法马上得到目标帧上的元件。

原因与解决:

  1. 对于FB导入Flash资源,我一直使用的是[Embed (source="???.swf", symbol="???")]方法。其实这种方法适合导入静态资源(即不包含AS代码的资源),而不适合导入动态资源(包含AS代码)。后来通过使用SWC导入的方法解决了。
  2. 帧上的内容不经过渲染是得不到里面的内容的(比如MC),这是Flash Player长久以来的一个问题。一般gotoAndStop之后,经过一次渲染(也就是下一帧的时候)内容才可访问。但经过我的测试,好像也有隔一帧仍然无法访问的情况,还要再隔一帧(共两帧)才行。(另,据说FB4已经解决了此问题。)

参考文章:

关于导入Flash动态和静态资源到Flex

关于Flash Player运行与渲染原理