稳扎稳打Silverlight(41) - 3.0Tip/Trick之GPU 加速, Out-Of-Browser, 应用程序库缓存

2016-08-20 10:59:01来源:http://webabcd.blog.51cto.com/1787395/342772作者:webabcd人点击


[索引页][源码下载]
稳扎稳打Silverlight(41) - 3.0Tip/Trick之GPU 加速, Out-Of-Browser, 应用程序库缓存, 合并 ResourceDictionary, 应用程序扩展服务, Silverlight 插件对象作者:webabcd介绍Silverlight 3.0提示和技巧系列

GPU 加速 -对 GPU 加速的支持
Out-Of-Browser -浏览器外运行,即支持脱离浏览器运行
应用程序库缓存 -将 dll(zip) 缓存到客户端浏览器中
合并 ResourceDictionary -整合不同位置的 ResourceDictionary
应用程序扩展服务-通过扩展 Application 来提供附加服务
Silverlight 插件对象的新增功能-在 Silverlight 3.0 中Silverlight 插件对象的新增功能
在线DEMOhttp://webabcd.blog.51cto.com/1787395/342289示例1、如何实现 GPU 加速GPU.xaml

<navigation:Page x:Class="Silverlight30.Tip.GPU" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" d:DesignWidth="640" d:DesignHeight="480" Title="GPU Page"> <Grid x:Name="LayoutRoot"> <Grid.Resources> <Storyboard x:Name="ani" AutoReverse="True" RepeatBehavior="Forever"> <DoubleAnimation Storyboard.TargetName="st" Storyboard.TargetProperty="ScaleX" From="1" To="3" Duration="0:0:3" /> <DoubleAnimation Storyboard.TargetName="st" Storyboard.TargetProperty="ScaleY" From="1" To="3" Duration="0:0:3" /> <DoubleAnimation Storyboard.TargetName="rt" Storyboard.TargetProperty="Angle" From="0" To="360" Duration="0:0:3" /> <DoubleAnimation Storyboard.TargetName="mediaElement" Storyboard.TargetProperty="Opacity" From="1" To="0.3" Duration="0:0:3" /> </Storyboard> </Grid.Resources> <MediaElement x:Name="mediaElement" Source="/Resource/Demo.mp4" Width="320" Height="240" AutoPlay="True" MediaEnded="mediaElement_MediaEnded" RenderTransformOrigin="0.5,0.5"> <MediaElement.RenderTransform> <TransformGroup> <ScaleTransform x:Name="st" ScaleX="1" ScaleY="1" /> <RotateTransform x:Name="rt" Angle="0" /> </TransformGroup> </MediaElement.RenderTransform> <!-- CacheMode - 缓存类型,用于 GPU 加速,当前只支持 BitmapCache(用 CPU 呈现 UIElement 一次,其结果位图会被缓存到 GPU, 然后通过 GPU 处理) 可被 GPU 加速的有: Scale, Rotate, Opacity, 矩形的Clip CacheMode.RenderAtScale - 位图缓存相对于当前呈现的 UIElement 的放大倍数。由于需要缓存为位图,而对于 Silverlight 的矢量图形来讲,则可以设置此属性以尽可能避免失真(当然,此值设置得越高,GPU 的负担也会越重) --> <MediaElement.CacheMode> <BitmapCache RenderAtScale="1" /> </MediaElement.CacheMode> </MediaElement> <Image Source="/Resource/Logo.jpg" Width="160" Height="120" /> </Grid> </navigation:Page>
GPU.xaml.cs

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Windows.Navigation; namespace Silverlight30.Tip { public partial class GPU : Page { public GPU() { InitializeComponent(); this.Loaded += new RoutedEventHandler(GPU_Loaded); } void GPU_Loaded(object sender, RoutedEventArgs e) { ani.Begin(); } private void mediaElement_MediaEnded(object sender, RoutedEventArgs e) { // 重播 mediaElement.Stop(); mediaElement.Play(); } } }

GPUTestPage.html(宿主页)

<div> <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"> <param name="source" value="ClientBin/Silverlight30.xap" /> <param name="onError" value="onSilverlightError" /> <param name="background" value="white" /> <param name="minRuntimeVersion" value="3.0.40624.0" /> <param name="autoUpgrade" value="true" /> <!--enableGPUAcceleration - 是否启用 GPU 加速--> <param name="enableGPUAcceleration" value="true" /> <!--enableCacheVisualization - 是否将缓存区域可视化--> <!-- 如果该属性为 true 则: 本身的颜色代表被缓存的对象 红色代表未被缓存的对象 绿色代表被自动缓存的对象。如果某对象在被缓存对象的上面,那么该对象会被自动缓存 --> <param name="enableCacheVisualization" value="true" /> <!--enableFramerateCounter - 是否显示帧率的相关信息--> <!-- 显示的信息在 Silverlight 程序的左上角以黑底白字做显示: 第一个参数:帧率(FPS) 第二个参数:GPU 的内存的使用情况。单位:KB --> <param name="enableFramerateCounter" value="true" /> <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0"> <img src="http://go.microsoft.com/fwlink/?LinkId=108181" style="border-style: none" /> </a> </object> <iframe></iframe> </div>


2、Out-Of-Browser(对浏览器外运行的支持)OutOfBrowser.xaml

<navigation:Page x:Class="Silverlight30.Tip.OutOfBrowser" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" d:DesignWidth="640" d:DesignHeight="480" Title="OutOfBrowser Page"> <Grid x:Name="LayoutRoot"> <!--安装/卸载按钮--> <Button x:Name="button" Click="button_Click" Width="100" Height="30" /> </Grid> </navigation:Page>

OutOfBrowser.xaml.cs

/* * Application.InstallStateChanged - 浏览器外运行的相关状态发生改变时所触发的事件 * Application.InstallState - 浏览器外运行的相关状态 [System.Windows.InstallState 枚举] * NotInstalled - 在浏览器中运行 * Installing - 安装到桌面中 * Installed - 在浏览器外运行 * InstallFailed - 安装到桌面的过程中发生错误 * Application.IsRunningOutOfBrowser - 当前程序是否是从浏览器外启动的 * Application.Install() - 安装 Silverlight 程序到浏览器外(卸载只能通过右键菜单的方式卸载) * Application.CheckAndDownloadUpdateAsync, Application.CheckAndDownloadUpdateCompleted - 一对异步方法/事件,用于更新浏览器外运行的 Silverlight 程序(从服务器上下载新的版本) * * 注:在 Silverlight 项目上单击右键 -> 属性 -> Out-of-Browser Settings 可以对“浏览器外运行”的相关参数做设置(也可以手动修改 Properties/OutOfBrowserSettings.xml) */ using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Windows.Navigation; namespace Silverlight30.Tip { public partial class OutOfBrowser : Page { public OutOfBrowser() { InitializeComponent(); this.Loaded += new RoutedEventHandler(OutOfBrowser_Loaded); } void OutOfBrowser_Loaded(object sender, RoutedEventArgs e) { InitButton(); App.Current.InstallStateChanged += new EventHandler(Current_InstallStateChanged); } void Current_InstallStateChanged(object sender, EventArgs e) { InitButton(); } private void InitButton() { if (App.Current.IsRunningOutOfBrowser) { button.Content = "卸载"; } else { button.Content = "安装"; } } private void button_Click(object sender, RoutedEventArgs e) { if (!App.Current.IsRunningOutOfBrowser && App.Current.InstallState == InstallState.NotInstalled) { App.Current.Install(); } else { MessageBox.Show("请右键卸载"); } } } }


3、应用程序库缓存的说明ApplicationLibraryCaching.xaml

<navigation:Page x:Class="Silverlight30.Tip.ApplicationLibraryCaching" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" d:DesignWidth="640" d:DesignHeight="480" Title="ApplicationLibraryCaching Page"> <Grid x:Name="LayoutRoot"> <TextBlock> <Run> 应用程序缓存 - 将 dll 缓存到客户端浏览器中 </Run> <LineBreak /> <LineBreak /> <Run> 启用“应用程序缓存” - 在 Silverlight 项目上单击右键 -> 属性 -> 勾选“ Reduce XAP size by using application library caching”复选框 </Run> <LineBreak /> <Run> “应用程序缓存”不能和“脱离浏览器支持”共同使用 </Run> <LineBreak /> <Run> 启用应用程序缓存后,可被缓存的 dll 的属性 Copy Local 会被设置为 true </Run> <LineBreak /> <Run> 启用应用程序缓存后,所有可被缓存的 dll 会单独生成一个 zip 包 </Run> <LineBreak /> <Run> AppManifest.xml 会增加相应的 ExternalParts。例: <Deployment.ExternalParts><ExtensionPart Source="System.Xml.Linq.zip" /></Deployment.ExternalParts> </Run> </TextBlock> </Grid> </navigation:Page>


4、合并 ResourceDictionary 的演示App.xaml(在此处合并不同位置的 ResourceDictionary)

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="Silverlight30.App" > <Application.Resources> <!-- 以 xaml 方式整合外部 ResourceDictionary --> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Style/ButtonStyle1.xaml" /> <ResourceDictionary Source="Style/ButtonStyle2.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> <!-- 以 cs 方式整合外部 ResourceDictionary ResourceDictionary dict = System.Windows.Markup.XamlReader.Load(xaml) as ResourceDictionary;Resources.MergedDictionaries.Add(dict); --> </Application.Resources> </Application>


5、应用程序扩展服务的 DemoApp.xaml(注册服务)

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="Silverlight30.App" xmlns:svc="clr-namespace:Silverlight30.Tip" > <!-- 以 xaml 方式注册扩展服务 --> <Application.ApplicationLifetimeObjects> <svc:MyExtensionService /> </Application.ApplicationLifetimeObjects> <!-- 以 cs 方式注册扩展服务(在 App 的构造函数中) ApplicationLifetimeObjects.Add(new Silverlight30.Tip.MyExtensionService()); --> </Application>

MyExtensionService.cs

/* * 自定义扩展服务需要实现 IApplicationService 接口或 IApplicationLifetimeAware 接口 * IApplicationService 接口需要实现 StartService() 方法(Application.Startup 事件之前调用)和 StopService() 方法(Application.Exit 事件之后调用) * IApplicationLifetimeAware 接口需要实现的方法有 Starting(), Started(), Exiting(), Exited() 其分别在 Application.Startup 事件的之前和之后调用,以及 Application.Exit 事件的之前和之后调用 */ using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; namespace Silverlight30.Tip { public class MyExtensionService : IApplicationService { public static MyExtensionService Current { get; set; } public string ExtensionInfo { get; set; } public void StartService(ApplicationServiceContext context) { Current = this; ExtensionInfo = "abc xyz"; } public void StopService() { } } }

ApplicationExtensionServices.xaml.cs

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Windows.Navigation; namespace Silverlight30.Tip { public partial class ApplicationExtensionServices : Page { public ApplicationExtensionServices() { InitializeComponent(); this.Loaded += new RoutedEventHandler(ApplicationExtensionServices_Loaded); } void ApplicationExtensionServices_Loaded(object sender, RoutedEventArgs e) { // 调用自定义的扩展服务 MessageBox.Show(MyExtensionService.Current.ExtensionInfo); } } }


6、Silverlight 插件对象的新增功能的简要说明Plugin.xaml

<navigation:Page x:Class="Silverlight30.Tip.Plugin" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" d:DesignWidth="640" d:DesignHeight="480" Title="Plugin Page"> <Grid x:Name="LayoutRoot"> <TextBlock> <Run> AllowHtmlPopupWindow - 是否允许使用 HtmlPage.PopupWindow 弹出新窗口 </Run> <LineBreak /> <Run> EnabledAutoZoom - 是否自动调整大小以适应浏览器的缩放 </Run> <LineBreak /> <Run> EnabledNavigation - 是否可以使用 HyperlinkButton 导航到外部链接 </Run> <LineBreak /> <Run> Application.Current.Host.Settings, Application.Current.Host.Content - 可对插件的一些属性和一些事件做设置 </Run> <LineBreak /> <Run> EnableGPUAcceleration, EnableCacheVisualization, EnableFramerateCounter - 参见 GPUTestPage.html 中的说明 </Run> </TextBlock> </Grid> </navigation:Page>


OK[源码下载]

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台