在本章,我们将开始创建能在屏幕上移动的2D卡通造型,并学习在2D空间中控制它们的行为:我们将:1、预先准备一个利用了Silverlight3性能提升优势的图形增强功能的应用程序项目2、学会在多种多样的艺术素材上进行硬件加速变换3、2D空间中的图形动画4、了解位置、分辨率和尺寸
在Silverlight中我们如何利用目前的硬件来加速生成屏幕上的实时图形呢?WPF应用程序利用了现代GPU(图形处理器,也被称为图形加速卡)提供的强大功能,不幸的是,Silverlight3没有完全充分地利用GPU。但是它为某些操作提供了使用GPU的可能。在特定情况下,我们能使用Silverlight3提供的硬件加速能力来提高游戏的性能。
现在,我们将在屏幕上显示出更多的ghost,但是这次要做一些变换处理并使用硬件加速:1、打开前一章的“SilverlightMonster”项目2、打开“SilverlightMonsterTestPage.aspx”文件中的ASPX代码。3、找到下面的代码:
我们为ghost的CacheMode属性指定了BitmapCache值,这个属性决定了在可能有GPU时是否对呈现内容进行缓存。它的默认值为null,意思是呈现内容不会被缓存。设置该值为BitmapCache将通知Silverlight把该元素作为一个位图(bitmap)进行缓存。因此GPU将可在该内容之上进行如下三种操作:变换(Transform):如缩放、旋转、倾斜等等混合(Blend):指进行透明度设置裁剪(Clip):如裁剪一个矩形等然而,把元素作为位图进行缓存的话,我们将失去矢量图形的一些优点。该元素将在GPU内存中转换为一个光栅图形,这是该矢量图形的一个快照。在这里需要进行权衡(指是否进行缓存)。
1、继续SilverlightMonster项目2、在解决方案资源管理器中展开MainPage.xaml,然后打开MainPage.xaml.cs文件。3、在MainPage部分类中添加下面的私有变量:privateList
6、.编译并运行本解决方案。默认的Web浏览器将呈现八个跟随鼠标指针进行移动、缩放、旋转和更改它们的透明度的ghost。Web浏览器将使用一些GPU硬件加速能力,但是这些ghost将变得稍微有些模糊,就像下面的快照一样:
假如你(对GPU加速)有任何疑虑的时候,则可能改变一个参数并检测Silverlight是否正为某些UI元素进行位图缓存。1、继续SilverlightMonster项目2、在解决方案资源管理器中打开SilverlightMonsterTestPage.aspx的ASPX代码3、移到下面的代码下面:
在Silverlight3中的GUP加速是基于原始图形(矢量或者光栅图像)的快照进行的。为此,当我们需要使用GPU加速来缩放矢量图形时,它将会生成像素图像。这和DirectX和OpenGL中的加速不一样,它不是完全意义上的GPU加速。因此,它的使用取决于我们制作的游戏的类型和运行Silverlight应用程序的电脑自身的处理能力。我们必须对性能的改进进行权衡,对视觉效果进行测试后才能决断。
Silverlight3提供了优越的动画功能。但是,游戏需要有比单独的动画更进一步的精确性和协调能力。我们需要对拥有各式各样的行为不同的卡通造型进行控制。做到这一点的最好的办法是把面向对象的封装良好的卡通人物与Silverlight的显示输出能力结合在一起。一个良好的面向对象的设计能创造出一个简单却又强大的游戏框架。这不是简简单单几步就能完成的任务。因此我们将从一些简单的动画开始进行封装,并在游戏中抽象概括它们的行为,然后创建类。
首先我们将把基于光栅的外星人图片转换成用户控件,然后我们将控制它们的移动行为:1、创建一个新的基于C#的Silverlight应用程序项目。项目的名称为“SilverlightInvaders2D”。2、新建一个名称为images的文件夹。3、把“\Invaders\GAME_PNGS_RESIZED”文件夹中的所有PNG图片拷贝到该images文件夹中。4、根据下面表格的内容为每一个图片新建对应的用户控件:
5、打开每个用户控件的XAML代码,移除下面的代码:Width="400"Height="300"6、把Grid的定义替换为Canvas,然后添加相应的Image元素,如下面的代码所示:
5、最后,添加下面的点击按钮时的事件处理程序代码:
6、编译并运行本解决方案,运行效果图如下:
我们在本章了解了许多关于GPU硬件加速、2D矢量、分辨率、精灵和动画方面的知识。具体来说,我们进行了一下配置以便利用Silverlight3D的GPU加速能力;我们使用了数码艺术素材来创建了一些精灵并以动画的方式进行显示;我们理解了在Silverlight3中硬件加速的优点和缺点。现在我们将把多个精灵和漂亮的背景组合在一起,这将是下一章的话题。