首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > CAD教程 >

Silverlight为何首次加载比较慢

2013-07-04 
Silverlight为什么首次加载比较慢Silverlight为什么首次加载比较慢呢?问题一:有没有什么比较快的方法,别让

Silverlight为什么首次加载比较慢
Silverlight为什么首次加载比较慢呢?

问题一:有没有什么比较快的方法,别让用户等着啊?

问题二:Silverlight的“XAML”页面是怎样加载的???不是有多少“XAML”页面,都一次性初试化吧?

问题三:服务器的性能影响有多大?
[解决办法]
1、silverlight首次加载时会将整下xap包装载到本地,如果xap包很大,会占用一定的时间去下载它。可以将silverlight应用程序分成多个xap包,程序运行时只加载必要的xap包如登录木块,其他的xap包实行按需动态加载。prism框架可满足此需求。
2、xaml页面除资源外,控件的xaml是在构建对象时初始化。当然xaml的复杂度也会影响到界面的解析速度。
3、silverlight是ria,对服务器的性能影响不大。

[解决办法]
这样其实节省不了资源,因为程序加载时会将整个xap包的内容加载到本地,但此时还并不初始化各个xaml页面,会初始化app中应用的资源的xaml,各个xaml页面的初始化是你在构建对象是完成的,如this.RootVisual = new BathRoom();这是会初始化BathRoom.xaml这个页面。
关于动态加载可以使用webClient来下载相应的xap包,然后使用反射等技术解析。比较简单的方式是使用Prism提供的机制,这些功能它早已封装好,加载模块只需要ModuleManager.LoadModule(moduleName)即可。
关于prism可以参考相关文档和资料。
http://compositewpf.codeplex.com/
[解决办法]
从网上下载一个1k的文件和10G文件,很明显1k的要快哦。

silverlight程序启动过程:
1、从服务器加载xap到本地-----速度,同等网络环境下取决于xap包大小
2、解析xap包
3、启动app
4、执行
public App()
        {
            this.Startup += this.Application_Startup;
            this.Exit += this.Application_Exit;
            this.UnhandledException += this.Application_UnhandledException;

            InitializeComponent();//初始化页面资源,即加载并解析App.xaml文件
        }
5、程序启动
 private void Application_Startup(object sender, StartupEventArgs e)
        {
            this.RootVisual = new MainPage();//执行构造函数,解析MainPage.xaml,构造MainPage对象,显示MainPage页面
         }
6、启动完毕
[解决办法]
要想显示首界面,总之是要下载Xap的。

不过如果你不重新发布,实际上Xap只是下载一次。浏览器再次下载相同文件时,web服务器并不真的下载文件,而是返回304状态,浏览器就会拿出客户端缓存的Xap文件出来使用。

如果项目设置了“使用客户端缓存缩小Xap文件尺寸”选项,各种强签名的dll就可以作为独立的Zip部署,而不用全都打包到Xap中。当你发布一个新的版本时,不要简单粗鲁地把ClientBind目录下的文件全都覆盖到web网站,而应该使用一个比较专业的网站上传软件——比较出md5不同的文件才上传。原来可能3M大的应用程序,实际上当你重新发布时,真正更新了的文件也就只有300K,剩下的(基本上都是Zip文件)让仍然是就的,于是304机制让然其作用,浏览器就会使用本地缓存而不是从网站下载。

很遗憾,MEF(Prism早已经被MEF淘汰了,MEF是silvelight内置正规的机制)并不支持这个分拆Xap包的机制。如果你分拆开,再使用MEF加载应用,就会遇到找不到DLL的异常。我其实不太理解微软为什么到现在也不能解决这个问题。
[解决办法]
用户通常也只是在软件重新发布之后第一次访问时慢一点。以后重新打开页面时,瞬间就加载完毕了(因为是使用了浏览器本地缓存)。

另外实际上很多界面是可以作为独立的xaml文件放到互联网上的。silverlight可以使用 XamlReade.Load 的方式动态加载一个UserControl。你的应用程序中只需要打包最基本的控件,而不需要把所有的用户界面都打包到应用中。当然由于这个加载不能有可执行代码,那么界面交互行为就应该是以说明性的MVVM方式定义,而不是写代码。例如样式、behavior、action、故事板和state等等都可以不需要编写一行源代码而说明复杂的交互程序操作过程。如果这样按照设计师的思路去设计silverlight程序(而不是按照程序员的思路),那么其实成百上千的不同的UserControl(例如一个小游戏中每一个任务、动物、建筑物、各种控制面板,甚至云彩等,都是独立的Usercontrol)都可以作为独立xaml文件单独下载,而不需要打包到Xap或者Zip中。

当然这样的好处并不是为了节省尺寸,而是为了增加动态。
[解决办法]


还会有其他很多方法。

但是请注意,首要的就是要知道Xap文件可以分拆出去成为许多独立的Zip文件,最后就只是从几M编程几十K或者一两百K大小。如果不知道这个初始方式,我想、去奢谈别的什么优化加载的方法,可能都是枉然。
[解决办法]

引用:
Prism早已经被MEF淘汰了

很遗憾,我不认为Prism早已经被MEF淘汰了,Prim上有两种默认的实现一种是基于Unity一种是基于MEF。
基于MEF的实现,具备MEF的全部功能,而且更融合了框架本身的功能,像模块动态加载ModuleManager、事件发布订阅机制EventAggregator、视图区域管理机制RegionManager等等,想把应用程序拆成多个xap包实现动态加载就很容易实现。这是只使用MEF很难实现的。
缺点是Prism并不是直接包含到siverlight的程序集中,需要到codeplex网站下载相应的dll库或源码,也可以说是一个第三方库。
[解决办法]
请问这个问题有没有解决呢?我也碰到这个问题,不知如何解决??
[解决办法]
不错。。。学习了

热点排行