Silverlight内存释放、性能提升及源文件保护(续)

在第八节、第三节、第二节中,我曾向大家详细的分析了Silverlight在内存释放、性能提升及源码保护等 方面的相关处理。随着游戏教程的不断深入,自身各方面经验的不断累积、总结与升华;至今日,我对这3方 面的认识又有了更深层次的理解。作为前3篇的续,本节我将继续对Silverlight开发技巧进行深度挖掘,用行 动来证明对技术的追求永不止步。

一)内存释放

首先,希望大家强烈认识到Silverlight程序是托管的,除特别明显或强烈的需要外(例如OpenFileDialog 、SaveFileDialog等继承自IDisposable接口的类),望大家不要轻易介入GC.Collect(),这是微软设计.NET的 初衷,我们仅能且必须做的就是:信任。

其次,需要所有精通.NET开发语言的朋友再次确认自己是否对数据类型有深刻理解。以C#为例,在编写代 码时尤其要分清值类型与引用类型,包括它们的定义、组成及原理。因为值类型对象在赋值后其内存可以很快 释放掉。以Struct(结构)和Class(类)为例,如果不需要实现继承,使用值类型可接口的Struct将得到比Class 更高的性能。另外,在书写类内部时,尽量不要使用私有类对象;同时要注意如果一个类一直被其他类所引用 着,内存同样无法被释放。在与其他Silverlight开发者交流中经常会听到类似这样的抱怨:Storyboard太耗 内存了,Storyboard性能太低下了,Storyboard太……无语了。俗话说:成也萧何,败也萧何,这些症状均是 Storyboard类被滥用的结果。这里的“滥”包含两层意思:1、不会用;2、用过度。一个好工具要物尽其用, 则必须精通它的原理与细节。Storyboard是否无意中被放进了循环里?是否出现了委托泄漏?Storyboard在 Completed后其他对象是否仍在引用着它?Storyboard是否忘记停止啦?等等。包括DispatcherTimer也一样, Silverlight在为我们制作各种流畅动画效果提供便利工具的同时,我们是否也应该让代码做到更严谨些呢?

小结:Silverlight内存释放最终还得看自己,简单说就是:只要够精通,够专业,没有释放不掉的内存。 作者也在朝这个方向努力着。

二)性能提升

1)在第三节中我曾有提到利用BackgroundWorker在后台线程中执行相对耗时的操作进而减少Silverlight 界面线程的负担。其实,我们同样还可以通过异步的方式提高画面的流畅度,比如:

this.Dispatcher.BeginInvoke(() => {
     //TODO…
   });

Dispatcher是WPF/Silverlight机制的核心,深入理解它有助你编写更高性能的代码。

2)在动画及游戏开发中尽量减少不必要的呈现、重绘(例如在Canvas.SetLeft前先判断Canvas.GetLeft是 否与Value值相同);隐藏掉不在屏幕中的图象载体(obj.Visibility = Visibility.Collapsed),对图象进行 切割,减少窗体中的图片数量,对相同或类似图片尽量做到复用,监控好委托的订阅与取消订阅(订阅N次将执 行N次操作,如果发生在循环里极易造成内存泄露甚至程序崩溃,请初学者认识到这点)等等,虽然均是些细节 ,但效果往往却非常明显。

3)调整好最大FPS,Silverlight中的MaxFrameRate可以通过 Application.Current.Host.Settings.MaxFrameRate 进行动态调整,此技巧在游戏及动画设计中如果能应用 得当,有时会取得意想不到的效果。

4)Silverlight中制作动画常用的方法大致有5种:DispatcherTimer、Storyboard、Thread、 CompositionTarget.Rendering、Storyboard as Trigger。5 methods to create game loop: which is the best?这篇文章中很详细的列举及讨论了该5种方法在性能、稳定性等各方面的比较,结论加个人体会大致上是 DispatcherTimer与Storyboard占据了Top2的地位。下面是该演示的Demo及其作者的总结翻译(原文在Demo的链 接中,仅供大家参考,个人感觉有些评价并不太符合实际),为大家今后制作Silverlight动画提供更好的依据 :

方法 优点 弊端 什么时候使用合适?(建议) 什么时候最好不要
使用(建议)
DispatcherTimer   相对稳定 最小识别率约15毫秒(个人理解为
频率过快将导致跳帧或无效,即极限
为15豪秒)
缓慢移动的物体,
联合Storyboard一同控制动画
在处理一个移动
非常快的物体对象时,
建议使用
Storyboard as Trigger

CompositionTarget
.Rendering提高帧速率。
Storyboard 平滑的动画 没有复杂的运动效果,例如行星、
游戏等的无规则Path运动
(这结论也太…… ^^||)
简单的移动模式方面 如果想通过更多的
后台代码去控制动画,
建议还是使用
CompositionTarget
.Rendering。
(这建议真 的很晕……)
Thread 基于线程,均衡的每帧
运行。在多核中效果更好
在很短的间隔内不稳定(2帧间) 需要大量计算,耗CPU的处理 如果你的电脑只有
1个CPU,或者需要
更快的动画效果,
还是请选择其他的方法
CompositionTarget
.Rendering
非常稳定,保证会运行到位 无法进行细节控制,因为频率
是固定的,基于画面刷新触发,
公式:1000/<frames-per- secspecified-
in-html>
[msec]
复杂的逻辑,如游戏中的一些
循环等逻辑(原话看得不是很懂……)
一些琐碎的处理,
例如游戏中的云朵
从左飘到右,
则建议
使用Storyboard代替。
Storyboard as Trigger 类似DispatcherTimer,在300FPS下运行流畅 和DispatcherTimer一样 类似DispatcherTimer 和DispatcherTimer
一样

三)源文件保护

在第二节中我分析了几种保护Silverlight源码的方法,代码混淆是最终解决方案。但随着Silverlight应 用越来越广泛且丰富,以增强用户体验为目标,我们通常会将图片等素材从xap压缩包中分离出来,作为动态 资源进行按需下载。然而这将直接导致所有素材裸露于Temporary Internet Files中,源码保住了,但是又泄 露了素材资源,结果is so bad。

解决方案:以下载图片为例,在Silverlight游戏设计教程第九节结尾我曾详细的讲解了BitmapImage的诸 多细节,将BitmapImage的CreateOptions属性设定为BitmapCreateOptions.None,图片将分成两份,一份存于 内存中,一份存于Temporary Internet Files;然后再利用第二节方法一提到的禁止关键文件或文件夹页面缓 存,我们将让用户永远也无法触摸到Silverlight中的任何图片素材,而所有资源素材一经下载后将永驻内存 直至页面关闭。不过副作用还是有的,没了浏览器缓存,每次进入游戏都需要重新下XAP及相关资源;图片呈 现方面也稍微有些延迟。当然了,每次2、3百K的XAP+按需获取资源所增加的服务器流量负荷相对于完全泄露 项目资源来说一毛九牛。

以上为近阶段个人在Silverlight开发方面的心得,希望能对大家有所帮助,如有不对之处还望指正。

时间: 2024-08-02 23:57:42

Silverlight内存释放、性能提升及源文件保护(续)的相关文章

刘宏程:紫光华山全新Gen9引入永久性内存 存储性能提升34倍

近日,HPE更新了自己的第9代ProLiant服务器产品组合,引入了英特尔最新的Broadwell处理器以及新的永久内存技术,可让服务器的内存作为一个高性能的存储层. 现在的HPE服务器品牌已经隶属于紫光华山旗下,此次产品更新也是蜕变后HPE的首次服务器发布.HPE升级的产品多达20款,同时也是所有服务器升级厂商中涉及型号最多的,应用产品覆盖最广的品牌. 20款服务器升级至E5 V4 紫光华山科技有限公司(原中国惠普有限公司企业集团)工业标准服务器事业部产品市场总监刘宏程表示,此次升级除处理器之

传统内核协议栈为什么不使用零拷贝,也就是内存映射来提升性能?

问题描述 传统内核协议栈为什么不使用零拷贝,也就是内存映射来提升性能? 如题,传统内核协议栈为什么不使用零拷贝,也就是内存映射来提升性能? 内核TCP/IP协议在中断处理阶段将网卡中数据拷贝到内核缓冲区,协议处理完后再将其拷贝到用户态,第一次拷贝很快,第二次拷贝很慢,大约占了整个处理流程的一半时间以上: 现在的零拷贝技术不再进行内核到用户的拷贝,而是直接进行一次内存映射,以此来提升网络性能. 那么,我想问的是:内核协议栈是否可以使用零拷贝技术?若不能,主要原因是什么? 在此,我的一个想法是:是不

再谈Finalizer对象--大型App中内存与性能的隐性杀手

    在上一篇<提升Android下内存的使用意识和排查能力>的文章中,多次提到了Finalizer对象.也可以看到该对象的清理至少是需要两次GC才能完成,而在Android5.0,尤其是6.0以后的系统中,对于该对象的回收变得更加的慢.我们在开发的时候往往关注内存的分配.泄漏,却容易忽视Finalizer对象,其实在大型App中,该对象是引起内存和性能问题的一个不可忽视的元凶.在类似于双十一会场的界面中,在使用一段时间后,设备会变得越来越慢,内存使用量也不断攀升,甚至容易引发OOM,这个有

Windows7配置以及性能提升方法

据微软官方公布的进程,windows7最晚于10月22日上市,目前出现的Windows7RTM已经提供给OEM厂商.windows7对比vista而言最大的优势就是他的易用性.不过如果你正在使用Windows7,笔者能给你一些建议让你的windows7性能得到显著提升. Windows7性能提升建议一:硬件配置 要玩转Windows7,首先要保证你的电脑配置符合windows7的最基本要求.如果你的Windows7是VISTA升级而来,那么你就可以放心使用Windows7,官方规定的Window

怎么提高电脑内存的性能

  如何优化内存的管理,提高内存的使用效率,尽可能地提高运行速度,是我们所关心的问题.下面介绍在Windows操作系统中,提高内存的使用效率和优化内存管理的几种方法. 1.改变页面文件的位置 其目的主要是为了保持虚拟内存的连续性.因为硬盘读取数据是靠磁头在磁性物质上读取,页面文件放在磁盘上的不同区域,磁头就要跳来跳去,自然不利于提高效率. 而且系统盘文件众多,虚拟内存肯定不连续,因此要将其放到其他盘上.改变页面文件位置的方法是:用鼠标右键点击"我的电脑",选择"属性→高级→性

MySQL 性能优化:性能提升 50%,延迟降低 60%

当我进入 Pinterest 时,我的头三个星期是在本部度过的,在那里最新工程把解决生产问题的成果应用到了整个软件栈中.在本部,我们通过构建 Pinterest 来学习 Pinterest 是怎样被构建的,并且,仅仅在几天里就提交代码.做出有意义的贡献也不是不常见.在 Pinterest ,新进来的工程师可以灵活地选择参加哪个组,而且作为在本部工作经历的一部分,编写不同部分的代码可以有助于做出这个选择.本部的人通常会做不同的项目,而我的项目则是深入研究 MySQL 的性能优化. Pinteres

C语言内存释放与调用子函数时间变长

问题描述 C语言内存释放与调用子函数时间变长 各位大神,你们好: 小弟最近用C语言编程遇到这样一个问题(代码比较多,就不粘了,见谅): 在子函数A中用malloc申请内存,在调用函数A的B函数中释放申请的内存.重复运行100次函数B,发现:在函数B中若不释放A的申请的内存,每次A运行的时间基本一样,而内存占用量持续上升:若在函数B中释放A申请的内存,占用内存问题解决了,然后每次调用A的时间又持续上升. 完全没有搞明白这是个什么情况,你们怎么看? 解决方案 堆上的内存申请和释放一定要一一对应,用完

慎用内存释放软件,剖析1Gram手机的内存原理

        经常看见有人推荐一键释放内存的内存管理软件,或者说自己的ROM精简后可用内存有500+甚至600+--我个人是很不理解了--      首先,从内存的原理说起.这个说起来比较长篇,举个简单的例子来说明:你去图书馆看书,书都在书架上,你会有一张桌子.对于电脑/手机来说,书架就是硬盘或者内置的ROM/SD卡,桌子就是内存,你就是CPU,书就是数据(程序本身也是数据,只是一种比较特殊的数据而已).你看书的时候是从书架上把书取出来,放在桌子上看:CPU需要数据的时候,是从硬盘/SD卡把数

性能提升永远在路上 全闪存如何求突破?

   闪存阵列彻底改变了企业的存储环境.在迁移至全闪存阵列后,以往困扰存储已久的性能问题几乎完全得以解决.不过,最终用户期望的提升以及应用程序的复杂性很快带来了更大的挑战,换句话说,改进性能的需求永远不会停止.所幸的是,存储供应商并未坐享其成.停滞不前,业内正在产生的一些创新技术正促使全闪存系统领跑于用户的需求. 存储媒介无法决定闪存阵列是否有更大的提速空间,事实上,这更多地取决于周围的基础架构.大多数情况下,随着闪存颗粒密度的提升,系统实际只会变得笨拙而迟缓,尤其是针对写入的I/O操作.总之,