热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WP7App性能优化(4):加快应用程序启动速度(上)

有很多途径可以提升WindowsPhone7应用程序载入和启动时的性能。本节将讨论这些话题。使用启动画面应用程序通常需要预加载一些资源以保证应用程序可以启动后这些资源立即可用,即使这

有很多途径可以提升Windows Phone 7应用程序载入和启动时的性能。本节将讨论这些话题。

 

使用启动画面

应用程序通常需要预加载一些资源以保证应用程序可以启动后这些资源立即可用,即使这会导致在加载完成前应用程序暂不显示。启动画面就是在其他内容还在加载时呈现的一个内容区域。

所有的Windows Phone 项目模板都包含一个启动画面图片。其默认文件名为SplashScreenImage.jpg ,当程序正在启动时会自动显示。如果你的程序需要花费1秒以上的时间才能呈现第一个页面,那么建议你为程序设置一个启动画面。

你可以使用Windows Phone 项目模板提供的默认启动画面,也可以创建自己的启动画面以展示商标或产品信息,如应用Logo、免责声明等。如果你想在启动画面上展示一些重要信息,并且延长其显示时间,可以重写页面的OnNavigatedTo()方法并调用M:System.Threading.Thread.Sleep(System.Int32)方法,指定你想要启动画面显示的时间。

要创建一个自定义启动画面,先创建一个480*800的JPG图片,命名为SplashScreenImage.jpg,并替换应用程序项目中默认的同名图片(注意要设置其BuildAction为Content)。这样,当程序启动时,将会显示自定义图片。

另一个选择是用应用程序首页面的截屏作为启动画面,以制造一种程序启动很快的感觉。如果想使用应用程序的首页面截屏作为启动画面,请尝试以下操作以捕获一个截屏图片:

  • 隐藏程序运行时会变化的所有数据
  • 确认模拟器缩放率设置为100%
  • 截取模拟器屏幕范围的图片
  • 确认图片大小为480*800并保存为SplashScreenImage.jpg

最小化应用程序集的大小

另一个提高应用程序启动性能的方法是最小化应用程序集的大小。当向Windows Phone应用商店提交应用时,应用中的程序集会被生成签名,以后程序每次启动时都会检查这个签名。检查程序集签名所用的时间会随着应用程序大小的增加而增加。因为签名检查的结果会被缓存,所以签名检查不会影响之后的程序加载速度,程序的第一次加载速度会受到影响。以下一些技巧可以减小程序集的大小。

  • 如果可能,尽量不要将程序中图片、多媒体、XML文件之类的的资源的BuildAction设置为Resurce,因为这样会使资源编译到应用程序集中,从而增加程序集大小。一般设置BuildAction为Content。(《BuildAction之Content与Resource》)
  • 通过斜线开头的路径设置图片的URI,如使用“/folder/myImage.jpg”替代“folder/myImage.jpg”。
  • 使用JPG图片替代PNG图片,除非需要使用透明。
  • 如果程序中使用了本地化,不要将本地化资源包含在主程序集中。为每种语言创建一个独立的附加程序集。点此查看更多How to: Build a Localized Application for Windows Phone。

注意:如果要创建一个可复用的控件或组件,应当通过设置其中的资源文件为Resource,将其包含在程序集中。此时,应当尽量少用图片之类的资源。

 

将应用程序分解为多个小程序集 

可以考虑将程序分解为多个按需加载的小程序集以进一步缩短启动时间。要实现这个目的,可以在解决方案中新建一个Windows Phone类库项目专门承载按需加载的页面。之后在主程序项目中引用该类库项目。通过HyperLink控件或Navigate方法可以导航到这些页面。以下代码示范了如何导航到PageInExternalAssembly程序集中的ExternalPage.xaml页面。

下载示例代码

C#代码
private void button1_Click(object sender, RoutedEventArgs e)
{
     // Use the name of the separate assembly when generating the Uri for the page
     NavigationService.Navigate(new Uri("/PageInExternalAssembly;component/ExternalPage.xaml", 
           UriKind.Relative));
}

 

减少构造函数和Loaded事件中的代码

所有构造函数和Loaded事件中的代码都会在应用程序显示第一帧之前运行。页面和控件的构造函数解析XAML、实例化XAML中定义的对象是很耗时间的。因此应当限制在这些方法中再执行其他的耗时的操作。如果需要执行载入文件或其他的复杂处理,应当将其延迟到稍后的事件中,或在一个后台线程中延迟执行。一种方案是在LayoutUpdated的事件处理程序中执行这些耗时的操作。LayoutUpdated事件会在应用程序的第一帧显示之后才执行。以下示例演示了如何操作。

C#代码
private bool _OnNavigatedToCalled= false;

public Page()
{
    InitializeComponent();
    LayoutUpdated += new EventHandler(Page_LayoutUpdated);
}

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    _OnNavigatedToCalled= true;
}

private void Page_LayoutUpdated(object sender, EventArgs e)
{
    if (_OnNavigatedToCalled== true)
    {
        _OnNavigatedToCalled= false;
        Dispatcher.BeginInvoke(() => 
            {
                // Do your stuff here, in the “future” }
            }
        );
    }            
}

 

转到:WP7 App性能优化(0):索引页


推荐阅读
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 微软评估和规划(MAP)的工具包介绍及应用实验手册
    本文介绍了微软评估和规划(MAP)的工具包,该工具包是一个无代理工具,旨在简化和精简通过网络范围内的自动发现和评估IT基础设施在多个方案规划进程。工具包支持库存和使用用于SQL Server和Windows Server迁移评估,以及评估服务器的信息最广泛使用微软的技术。此外,工具包还提供了服务器虚拟化方案,以帮助识别未被充分利用的资源和硬件需要成功巩固服务器使用微软的Hyper - V技术规格。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
author-avatar
mobiledu2502905163
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有