Actionscript3.0 性能优化(二)

AS3 性能优化


1.visible 与 removeChild 比较
将visible设为false,并不能停止重绘。应该停掉动画(包括子元件),显示对象移除舞台之外,改对象是不会重绘的。只是不会重绘,但里面的代码逻辑等依然会占用cpu周期和内存。
对于要从舞台中删除的对象,如果稍后还会再用到这个对象的话,使用visibility=false将其“删除”,而不是使用removeChild把它从显示列表中删除。因为Flash Player中重建对象要比隐藏对象复杂的多。
因此选择哪一个操作隐藏对象,依情况而定。


2.catchAsBitmap
cacheAsBitmap这个属性很多人都知道,但少有人明白它到底是如何生效的。虽然看名字是转换为位图处理,但用起来的时候感觉却也不是如此。所以,不少人最终选择自己转换Bitmap。 
当然,自己转Bitmap也是可以的,也只是多浪费点内存和处理速度,然后麻烦点罢了。但事实上,很多时候cacheAsBitmap已经足够使用了。 
先得说说FLASH的屏幕更新机制。在Debug播放器内,可以勾选显示重复区域来以红框显示更新区域。也就是说,FLASH并不会每帧都渲染所有的区域。这点上的确如此。但是在红框内呢?比如我有一张很复杂的静态矢量图在背景上,然后上面显示了一个很简单的动画(甚至是一个透明的不断重刷的矩形),以通常的想法,FLASH应该缓存背景的图像,仅仅是重新更新上面的图形,但事实上并不会这样。FLASH才不管你哪些动哪些不动,只要是红框内的图形,它一定都会重新刷新一次,如果不解决这个问题,根本没法做“全屏”的东西,因为哪怕你空刷一个占满屏幕的Bitmap都会导致所有的矢量图全部更新。 
事实上,cacheAsBitmap就是用来解决这个问题的。你可以理解成它能够影响FLASH的渲染机制。只要一个显示对象被设为 cacheAsBitmap,除了他自己之外,外部将无法令其重新刷新,而是像我们想象的那样简单的叠加。当然,副作用是,被设置为 cacheAsBitmap的图形,内部只要变了一点,哪怕是很小的区域,也会导致整个对象更新,但是,也只有这种情况才会更新。 
除此之外,还有以下的影响: 
它相当于被设置为layer混合,混合关系会出现问题(诸如Alpha混合)。 
由于实现方式是缓存位图,会遇到整数坐标问题。所以,平移和缩放都会一顿一顿的,此外影响到的还有设备文本。好在设备文本也可以设置为 cacheAsBitmap,这样就和外部容器一起“顿”,就看不出来了。 
此外,我发现这种做法还会影响到Draw的区域。这点我还没认真测试过。 
cacheAsBitmap是有效的。我们觉得它没有效果,可能是因为把这个设置放在了动画上(动画是一直动的),或者设置在了运动的物品外部(内部物品运动外部不动的话,可能还比原来更慢)。其实我们大可以自己尝试,一般来说,只要别出现显示上的问题,在非容器对象设置cacheAsBitmap都会有一定的性能提升。而且它并不像自己实现的Bitmap,缓存位图并没有消耗多余的性能,而且也不可能出现内存泄漏。 
最好不要把它当作缓存位图,而是当成一种改变FLASH渲染机制的手段。cacheAsBitmap具有两面性,错误的设置也可能会更慢。当然,它是个运行期间属性,有心的话,也可以动态修改。


当在一个容器中有很多个分别独立的对象,他们在移动或各自做形变时,Flash Player需要不停的对这些单独区域进行重新绘制, 
导致重绘占用了大量的cpu时间。这时可以把容器的cacheAsBitmap设为true,这时Flash Player 将缓存显示对象的内部位图表示形式, 
这样就好像我们并没有把那么多显示对象添加到容器中,而是像位图处理一样把这些对象逐个draw到BitmapData上(draw前lock,结束后unlock),完成后在统一重绘这张位图。这样重绘每个对象的时间转会成了重绘一张位图。不过这里是会进行像素紧贴的,所以就不会有小数级的控制了。 
当对象非常多的时候,我们会发现效率的提升是非常高的。 
比如我们最原始做List组件的方法,是使用一个矩形的遮罩,遮盖住需要显示的item范围上,滚动条滚动时改变容器的y坐标, 
当只有四五十个item的时候还行,如果数量很多的时候,打开你的任务管理器就会发现,只要一滚动List,cpu就会升的非常高, 
甚至的占据了一个核。 
改进的方法是使用DisplayObject的scrollRect来进行滚动,然后开启cacheAsBitmap,然后就会看到一个性能上的惊喜。
默认情况下cacheAsBitmap属性为false。开启cacheAsBitmap的最通俗易懂的作用就是拿内存换cpu。使用cacheAsBitmap有以下可以注意的几点: 
    1.如果显示对象无需alpha,那么opaqueBackground于cacheAsBitmap配合使用可以很好控制呈现的性能。 
    2.不要将整个场景进行cacheAsBitmap设置,它反而会降低你的程序性能。 
    3.cacheAsBitmap不是万能的,当你的程序对原有的内容进行像素位的改动时,会降低它的作用。这些改动包括,旋转,缩放,更改alpha值等改变它原有像素的举动。 
    4.在fp10中一个bitmapdata可以被多个bitmap引用,所以同样原始数据的对象,可以引用同一个父,在不同的对象引用中设置cacheAsBitmap,他们之间可以复用缓存。
极化码(Polar Code)是由土耳其科学家Erdal Arıkan在2009年提出的一种新型纠错编码技术。它通过利用信道的极化现象,将虚拟信道分为误码率接近0和接近1/2的两类。在编码设计中,数据被放置在误码率极低的信道上,从而实现高效的数据传输。极化码的主要优势在于其理论编码容量能够达到香农限,并且构造方法较为简单。 MATLAB是一种功能强大的数学计算和编程工具,广泛应用于科学研究和工程领域。在极化码的研究中,MATLAB可用于构建编码和解码算法,模拟数据在不同信道条件下的传输效果,验证理论性能,并优化相关参数。 SC(Successive Cancellation,逐位取消)译码是极化码的基本解码方法。它从最可靠的比特开始,依次解码每个虚拟信道,且每个比特的解码结果会影响后续比特的解码,因为它们之间存在依赖关系。虽然SC译码的实现较为简单,但其计算复杂度较高,随着码长的增加,解码时间会线性增长。 SCL(Successive Cancellation List,逐位取消列表)译码是SC译码的改进版本。它通过引入列表机制,同时处理多个路径,从而增强了错误校正能力,并在一定程度上降低了错误率。与SC译码相比,SCL译码虽然需要消耗更多的计算资源,但能够提供更好的性能。 一个完整的MATLAB仿真资源通常包含以下内容: 编码模块:用于实现极化码的生成,包括码字构造和极化矩阵操作等。 信道模型:用于模拟各种通信信道,例如AWGN(加性高斯白噪声)信道或衰落信道。 SC/SCL译码模块:包含SC译码和SCL译码的算法实现。 误码率(BER)计算:通过比较发送和接收的码字,计算误码率,以评估编码性能。 性能曲线绘制:绘制误码率与信噪比(SNR)之间的关系曲线,展示不同译码策略的性能差异。 使用说明:指导用户如何运行仿真,理解代码结构,以及如何调整参数以进行自定义实验。 代码注
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值