Silverlight游戏设计:(五)面向对象的思想塑造游戏对象

2024-05-07

Silverlight游戏设计:(五)面向对象的思想塑造游戏对象(精选4篇)

篇1:Silverlight游戏设计:(五)面向对象的思想塑造游戏对象

传说,面向对象的开发模式最初是因为程序员偷懒而不小心诞生的,发展至今,人们从最初的热忠于 讨论某某语言是否足够面向对象到现在开始更广泛的关注面向对象的思想而不是具体内容。面向对象的思 想其实并不深奥,它存在的目的只有一个:让程序开发更贴近我们的现实世界。

还记得猫、猫叫;狗、狗吃东西吗?无数的程序员都喜欢将此类似的情形设计当作面向对象最好的例 子。是的,非常生动且形象;但实际运用中你是否能真正做到举一反三?

回述到游戏设计中,大家是否时常会感觉游戏世界与我们的真实世界如此贴近?游戏中的精灵好比我 们人类,更广泛的,你可以将精灵看做游戏世界中任意的生命体。在现实世界里,“人”是我这样的家伙 的统称,“人”可以站立,可以移动,可以战斗,可以受伤,可以死亡;在游戏世界里,“精灵(Sprite) ”是所有生命体的统称,“精灵”同样可以站立(Stand),可以移动(MoveTo),可以战斗(Attack),可以 受伤(Injured),可以死亡(Death)。当然,梦幻般的它们或许还能施法(Casting)甚至飞行(Fly)。能够移 动,因此必须有速度(Speed)和方向(Direction);可以死亡,因此必须有它活着的证明(Life)……于是, 一个非常非常贴近我们现实生活的游戏“精灵类”出现了:

每个“人”都生活在各自的“城市”里,“城市”有路,有桥,有山,有水……多种多样的地况形成 了整个城市的立面结构;“精灵”存在于各自所处的“场景(Scene)”中,每个“场景”都拥有一张生动 的背景地图(Map)展示着美丽的风景,精灵们就是在这样铺设着坐标系(Coordinates)的“场景”里自由自 在的生活。只要高兴,它们随时都可以到不同的“场景”走亲访友或者探险旅游。因此,“场景”管理着 它内部的所有对象如“精灵”、“魔法”等,作为承载游戏各元素的重要枢纽,它有着非凡的意义:

玩家是游戏世界中的 “上帝”,他经营着游戏中所能掌控的一切;精灵去血了,升级了得报告“上帝” ;雷达发现敌情了得通知“上帝”;场景切换了,要让“上帝”看见;GameOver了 , “上帝”要知道。假如说“人”生活在城市里,而所有的人、城市又构成了整 个地球,更广义的说就是整个世界,所以,“世界”就是我们“人”所生活的舞台 。同样的,在游戏世界里的所有一切对象如“精灵”,“场景”,以及向“ 上帝”打报告的各种“面板”,它们之间要连通,要交互也同样需要这样一个平台。没 错,它就是“游戏窗口(Window)”,类似于MainPage.xaml。游戏世界中所有对象如果需要和 其他外部的对象进行交互,只需为自己添加委托事件,在“游戏窗口”中需要的地方触发这个 事件即可实现。举个最最简单的例子,“精灵”在不断的移动,移动是“精灵”与 生俱来的能力,因此它自己就可以轻松搞定:sprite.MoveTo(…),

但是,此时“上帝 ”想要通过“雷达地图面板”了解该“精灵”所处的准确位置,我们不能再 通过sprite.TellRadar(….)了,因为“雷达地图面板”是“游戏世界”的 财产而非某个“精灵”的内部资源。于是乎“精灵”想到了一个好办法,它决定每 走一步都在地上做个自己所特有的记号,从而告诉“游戏世界”:我现在在这儿了。转换成编 程语言就是定义“精灵”坐标变化事件及相应的委托:

public delegate void CoordinateEventHandler(Sprite sprite, DependencyPropertyChangedEventArgs e);

public event CoordinateEventHandler CoordinateChanged;

当“精灵”移动且坐标改变时触发(即做记号):

private static void ChangeCoordinateProperty(DependencyObject d, DependencyPropertyChangedEventArgs e) {

……

if (sprite.CoordinateChanged != null) {

sprite.CoordinateChanged(sprite, e);

}

……

}

最后,通过在“游戏窗口”中注册这个事件,一旦“精灵”坐标改变即通过“雷达地图面板”告诉“ 上帝”:

sprite.CoordinateChanged += (s, e) =>{

radar.TellGod(……);

};

由此得到,“游戏窗口”就是游戏中万物之间的交流平台,对象与对象之间的交互都在其内部完成:

到此,大家是否已能理清“精灵”,“场景”,“游戏窗口”这3个“游戏世界”中最基础且必不可少 的重要元素之间的关系了?亲爱的朋友们,请放飞思想,用现实世界的现象和原理去反向叙述机器所操控 的“游戏世界”,你定会发现其实一切都是那么的轻松而惬意。是的,这就是面向对象思想给我们带来的 福利:让程序开发更简单!

仿佛又废话了一节,保守估计又要开始有朋友给这个仍不知悔改并坚持以大无畏的精神忽悠读者的深 蓝丢鸡蛋了。其实,我写的每篇文章都有它存在的原因或价值,承上启下是外因,更重要的是我发现就算 再简单再好理解的代码都能让很多朋友望而生畏,其实并非不懂编程,我理解的是大家更多缺少的是属于 自己的思维,那种勇于创新不害怕失败的自我潜能深挖掘的精神,这才是我最终想要传达的思想,同样也 是这新一部系列教程所要阐述的Silverlight游戏设计理念。

在这样的思路的指引下,历时大半个月利用业余时间制作完成了这个Silverlight场景编辑器,可谓呕 心沥血之作。但是,至从它出现后,更多的朋友反而会这样觉得:“深蓝的作品真是一部不如一部,哎, 失败,失败中的失败。”真的是这样吗?俗话说内行人看门道,外行人看味道。懂行的一看就知道是个好 宝贝,豪不惭愧的说,它可以制作你目前所玩过的一切2D游戏的图形框架,而它的核心算法仅有两个,而 且还是我第一部教程第十节中早已提到的那两组公式;更重要的是,它的结构非常简单且代码量少,绝对 的通俗易懂。

下一节,我将开源这个场景编辑器。紧接下去后面的章节,我会向世界展示这个Silverlight-2D游戏 场景编辑器的伟大!还是不相信哪??嘿嘿,关注哦~

在线演示地址:silverfuture.cn

篇2:Silverlight游戏设计:(五)面向对象的思想塑造游戏对象

“兴趣是最好的老师”,这句话在程序设计类课程中得到了很好的印证。程序设计类课程的内容较为枯燥,学生很难深入其中。而兴趣能够创造一个宽松愉悦的学习环境,这将成为学生积极主动学习的催化剂。学生更喜欢钻研有趣味性的事物,这能让他们很快的投入,并让他们的脑瓜更加灵活。因此,如何让学生在学习的时候产生兴趣,就成为我们老师思考和研究的重点。

一般在面向对象程序设计授课中,首先要讲解大量而繁琐的语法,而在此过程中,学生很难立刻看到自己的学习成果,因此开始就丧失了学习兴趣。面向对象程序设计属于计算机设计语言类的课程,本身具有较强的操作性、直观性和应用型,因此为了让学生能够尽快看到学习成果,而不是一直陷入语法的研究中,多数会采用案例教学法,以案例为中心来组织教学,将知识和技能融入其中,让学生在做中学,学中做,会取得更好的学习效果。这样在教学中采用的案例的设计就尤为关键。不仅要考虑案例的规模,所融入的知识点,同时也要考虑趣味性、实用性和可操作性。游戏案例教学法在案例教学法的基础上,把小游戏的程序引入课堂,作为程序教学的催化剂,帮助组织教学。让学生更快的对所学内容产生兴趣的同时,通过游戏程序的独特性,让学生在案例的阅读、思考、分析、讨论中,建立起一套适合自己的完整而又严密的逻辑思维方法和思考问题的方式,以提高学生分析问题、解决问题的能力,从而增强教学效果。

2 游戏案例的设计思路

2.1 趣味性游戏解决教学重点

结合教学的相关知识点,设计一些游戏案例。这类游戏案例要求规模一定要小,简单实用的同时又要紧扣教学内容。

案例1:猜数游戏。

功能要求:计算机产生随机数(1-100之间),猜中即胜,猜不中,提示是大了还是小了,继续猜,直至猜到,给出所用次数和评语。

流程要求:7 次以内猜对的给予三星奖励,15 次以内猜对的给予二星奖励,20次以内猜对的一星奖励,超过20次没有猜对的则不允许继续猜数。

这个游戏源自一档耳熟能详的综艺节目“幸运52”,因此很能引起学生的共鸣。游戏规则简单易懂,学生很容易接受。游戏实现过程中涉及的主要知识技能点包括:输入输出语句、随机数的产生、分支结构的使用、循环结构的使用。案例规模不大,代码不足三十行,却涵盖了Java语言基础语法以及三大结构语句,可以说是一个很有代表性的教学小案例。

课堂上老师带领学生分析游戏要求,设计代码流程,选择结构语句,一步一步引导学生完成案例的同时,学生掌握了相关知识,了解了程序设计的流程。

案例2:聊天机器人

要求:用面向对象的思维方式创建一款聊天机器人。机器人有自己的名字name;有目前的饥饱程度,也就是生命值full⁃Level;可以打招呼(say Hello说出自己的名字);可以喂食(Eat(int food Count));可以聊天说话(Speak(string str));可以对异常情况进行处理(喂食数量过多撑死或饿死等);有两个机器人可供选择,开始通过数字1,2来选择机器人进行聊天。

分析:

创建机器人类,该类包含姓名和生命值两个属性以及打招呼、喂食和聊天三个方法

生成两个机器人类的对象,根据用户选择,调用不同的对象的方法。

这款游戏源自目前流行的人工智能技术。很多聊天软件都有类似的功能。包括苹果的siri也是类似的智能助手。案例在实际生活中的应用让学生对其很感兴趣。课上所完成的聊天机器人较为简单,并不具备更深的智能性,但却结合了Java中最为重要的面向对象的相关知识,包括:类的创建、属性和方法的定义、类的封装、对象的生成、属性的设置和方法的调用等。

这个游戏案例用于面向对象基础单元的教学中,能够很好地激发学生的学习兴趣,并且帮助学生了解和认识面向对象的概念,通过游戏设计,将知识点串联,从而理解各个重点问题。

2.2 真实游戏平台解决教学难点

一些学生经常玩的真实的游戏平台,也可以引入教学中,帮助解决教学难点。让学生知道程序是开放的、实用的,不是封闭的、形式的。通过课上所学内容,完全可以开发出有趣、实用的程序。

在Java教学中,面向对象的封装性、继承性和多态性是教学的难点,也是学生最不容易理解和掌握的内容。而IBM公司发布的Robocode坦克机器人对战引擎则很好的容纳和体现了这些难点问题的应用。将其作为教学案例,能帮助学生很好地理解概念,掌握技巧,突破教学难点。

案例:坦克机器人大战

每个孩子,尤其是男孩子心中都有一份特殊的坦克情结。一提到坦克机器人大战,学生就会产生兴趣,跟小时候玩过的坦克游戏进行比较。给学生讲解说明,这款坦克机器人对战平台,不同于普通的坦克游戏。坦克并不是用鼠标键盘去控制,而是通过编程,赋予坦克智能,让他自己在战场上对战。激发学生的编程的欲望。使用熟悉的程序设计语言,实现自己喜欢玩的游戏,对学生来说还是很有吸引力的。在引入案例的时候,一方面要通过演示案例活跃课堂气氛,吸引学生注意力;另一方面应该强调案例的挑战性,激发学生的学习热情。

这款游戏引擎是一个游戏半成品,他提供了坦克的父类,学生可以通过学习父类,了解类结构以及封装的特点。在创建自己的坦克机器人的时候,通过类的继承,只用简单的几行代码就实现了坦克。当学生看着自己设计的坦克在战场上发射子弹的时候,无比兴奋的同时也切实地体会到了类的继承带来的好处。对坦克父类方法的重写,实现了多态。在学生完成自己坦克机器人设计和实现的过程中,学生就了解了面向对象的重要概念,熟悉了面向对象的实现方法,体会到了面向对象的编程思想。使得编写代码不再是为了交作业,而是在实现一个有趣的作品。

通过这个游戏案例的引入,使得课堂气氛变得非常活跃,学生主动学习的热情非常高。很多学生都是迫不及待的实现自己的坦克,再与其他同学的坦克对战,来检验自己的成果。

2.3 经典的综合性游戏,串联知识点,锻炼综合实践能力

经典而有趣的游戏更容易引发学生的兴趣。而这些游戏往往不是只包含几个知识和技能点,需要对知识的综合运用。

案例:贪吃蛇

贪吃蛇游戏是一款大家都耳熟能详的小游戏,简单而经典。而要实现贪吃蛇则需要一个完整的设计过程。包括应设计几个类,类之间的关系,类的属性和方法的实现,以及界面的设计,游戏关卡的设计等等。因此这是一个综合性的游戏案例。

游戏案例的兴趣是前提,分析和引导是入门,实现是关键。教师要鼓励学生去完成所给的案例。要学生开始就顺利的写出代码是很有难度的,各种各样的问题让他们无从着手。游戏程序的设计包括几个模块,模块实现的先后顺序如何,关键问题在哪里,哪些方法最适宜解决问题等等。因此教师的引导和启发就变得非常关键。例如给学生一些界面设计的参考案例,提倡个性化的设计;跟学生一起找出实现案例的关键点,一起技术攻关;与学生一起设计流程,甚至可以提供一些解决方案供参考。一步一步引导和带领学生共同完成,从而培养和锻炼学生的综合实践能力。

2.4 举一反三案例,鼓励学生独立完成,强化知识掌握

除了课堂上带领学生共同完成的案例,还可以找一些与课堂案例大同小异的游戏案例,鼓励学生独立完成。

案例:是男人就下100层

这个游戏看上去跟前面谈到的贪吃蛇游戏没有任何关系,但是两者在设计思路及实现过程上都非常类似。台阶类似于蛇身的方块,整个楼梯是由一个一个台阶组成,类似于蛇身是由一个一个方块组成。蛇吃到食物身体会增加一个方块,而小人下台阶的同时,台阶也在不断上移,也就是说在不断地增加台阶。看到这些相似点之后,学生就会猛然发现,这两款看似完全不相关的游戏,原来实现起来却如此相似。给出学生以下提示后,不妨就此收住,让学生自己进一步思考,独立完成这个举一反三的游戏案例。引入这些类似的案例,能让学生开拓眼界,善于在不同的程序中找相同,也就能够举一反三的完成更多的案例设计,有利于学生思维的提升,挖掘学生潜能。

3 结论

在面向对象程序设计课程授课中运用游戏作为教学案例,能充分调动学生学习的积极性和主动性,活跃课堂气氛,课堂教学效果也有相应的提升。但对老师却提出了更高的要求。想要让游戏案例教学真正发挥更好的效用,老师应该做到以下几点:

1)认真甄选游戏案例。案例规模、难度都要适中,要精简、有趣、实用。游戏难度过大或者操作性差,反而会起到反作用。

2)要将知识技能点有机地结合到游戏中,让学生真正在玩中学,在学中玩。就游戏讲游戏,知识点过于分散,反而会让知识体系不够系统。

3)课前做好充分准备,如何引导启发学生,可以将游戏案例做成一些半成品,让学生在此基础上完成,将游戏案例结合到课程设计中,充分发挥作用。

4)案例制作完成之后要有恰当的总结。在总结中,要揭示出游戏案例中包含的理论知识,让学生不只是完成了一个游戏的制作,还知道用了哪些知识制作的这个游戏,如何用这些知识完成其他案例的设计制作。

篇3:Silverlight游戏设计:(五)面向对象的思想塑造游戏对象

关键词:中断;Linux;面向对象思想

中图分类号:TP316文献标识码:A文章编号:1009-3044(2007)12-21356-02

Research of Interrupt Design Based On Object-Oriented Thinking In Linux Kernel

FANG Hong,LV Tai-zhi

(Department of Information Engineering,JiangSu Marine Institute,Nanjing 211170,China)

Abstract:This paper introduced the problem of interrupt design and the basic solution under Linux.By applying object-oriented thinking and design model,Top Half and Bottom Half of interrupt mechanism were analyzed on structure and action, Finally,the paper pointed out that the highly performable and flexible framework of interrupt handling was realized in Linux kernel.

Key words:interrupt;Linux;object-oriented thinking

1 引言

中断是计算机系统中不可缺少的工作机制,对系统性能有重要影响。但其与硬件密切相关,作为支持多种硬件平台的Linux操作系统,在中断机制设计方面必须权衡性能和可移植、可扩展性等方面的矛盾。运用面向对象的技术构建高质量的软件体系结构,用高效的c语言来编程实现,将二者的优点有机结合起来,已成为Linux内核设计中的发展趋势。在Linux内核中,出于性能的考虑,将中断的处理分成上半部分[1](Top Half)和下半部分(Bottom Half),因此內核的中断处理机制也被分成两部分,本文基于Linux内核2.6.20,运用面向对象的方法及相关设计模式,对这两部分进行了深入分析。

2 Top Half分析

Top Half已被设计成一个独立的中断处理层。设备驱动通过使用该层提供的接口,使中断处理部分完全独立于硬件,从而大大提高了代码的可移植性;中断硬件驱动则可以实现和使用该层定义的中断硬件接口和中断处理回调接口,对中断处理层提供支持,同时也可以利用该层提供的标准中断处理流程,简化设计和实现。

2.1结构分析

通过分析中断相关内核源代码[2],抽象出Top Half的类图(图1)。类的提取主要来源于相关头文件中的struct结构,也有一些是直接从代码中抽象而来,并没有相应的struct。为了取得一定的对应关系,类的命名尽量采用了与之对应的struct结构的命名。对于包含函数指针的struct,可以有两种观点:第一种将其视为定义了抽象方法的抽象类,第二种将其视为包含了预定义接口的类。本文采用第二种观点,因为它更能体现面向对象设计的基本原则(编程中使用接口,而不是接口实现;优先使用组合而不是继承)。manager主要定义实现上层接口,设备驱动可以进行请求、禁能、释放中断等操作,无需知道中断硬件的细节,从而使设备驱动中断处理相关的代码无需改变就可以方便地移植到不同平台。manager内含一个包含irq_des的线性数组,以此实现全局管理。irq_des与中断号一一对应,是将底层硬件隔离及实现中断处理流程的关键。它包含的irq_chip通过定义一组接口方法,将不同的中断硬件行为统一进行了封装。一方面底层中断硬件驱动只要根据自身功能部分或全部实现这组方法,就可以向上提供满足需要的中断处理功能,方便了底层的设计;另一方面负责中断处理流程的handle_irq,通过使用chip的方法与硬件交互,从而将中断流程处理与硬件细节处理分离。由于不同类型的中断,其中断处理流程不尽相同,不同于以前的在一个函数中处理各种类型中断的方法,內核目前将其细分成6种类型(edge level simple percpu bad fasteoi),并分别提供了标准的实现,这样可以针对特定类型,优化代码,提高处理性能。虽然有多种类型的处理方法可供使用,但内核仍抽象出单一的中断处理接口handle_irq供底层调用,在这里,使用了策略(Strategy Pattern)设计模式[3],6种类型的中断处理方法(具体策略)是handle_irq(策略接口)的不同实现,而irq_des则提供了策略赖以存在的上下文(Context)。策略模式使中断处理更具灵活性、可扩展性。例如可以方便地增加新的中断处理类型以及根据需要重新实现特定类型的中断处理方法,却对使用者没有影响。chip和handle_irq相结合一方面屏蔽了底层中断硬件的变化对上层的影响,另一方面给中断硬件驱动的设计实现带来了便利;而性能却因为优化了不同中断类型的处理代码而得到提高。

图1 Top Half类图

为了有效利用紧缺的中断资源,内核支持中断共享,这主要通过irqaction来实现。irqaction的设计使用了职责链(Chain of Responsibility)模式[3],该模式的设计意图在于使多个对象都有机会处理请求,通过将这些对象连成一条链,并沿着这条链传递该请求来实现,它降低了请求的发送者和接收者之间的耦合。由于中断共享时,有多个中断处理函数,但只有具体的中断处理程序知道是否要处理中断,且要求支持中断处理函数的动态增减,所以非常适合运用职责链模式。action包含一个handler,它定义了处理中断请求的接口,具体的中断处理则由使用中断的设备驱动程序以中断处理函数的方式来实现。在handle_irq的具体实现中,均会调用handle_IRQ_event方法,该方法遍历irqaction链,并依次调用handler接口方法,最终实现中断的处理。职责链模式虽然有诸多优点,但也有缺点:主要是处理效率偏低,因为处理一个请求可能要遍历到最后才能完成,这就要求共享同一中断的设备不能太多,同时要求中断处理程序尽快判断出中断是否需要处理,若不需要应及时返回。

2.2行为分析

中断的实际处理过程是一个软硬件相结合的、异步和并发的复杂过程,虽然内核中断处理层屏蔽了中断处理的细节,但使用中断的设备驱动编写者仍需要理解中断处理的主要过程,特别是中断处理函数被调用的上下文环境,作为一个较高层次的抽象,下面描述了一个中断被处理的基本过程。首先设备驱动使用request_irq申请登记中断处理函数,相应设备触发了一个中断,经过底层软硬件的一系列处理,最终会调用irq_desc的handle_irq方法,该方法又会调用handle_IRQ_event,它遍历irqaction链,调用中断处理函数,中断处理函数在进行必要的处理后,一般会在标识出要延迟处理的工作后返回,最后在判断出没有硬软中断嵌套及有软中断需要处理的情况下,调do_softirq进行下半部分的处理。

3 Bottom Half分析

在内核中,Bottom Half的实现机制主要有软中断(softirq)和任务片(tasklet)[4],tasklet是基于softirq的,二者的主要区别是同一软中断处理函数可以同时运行在多个CPU上,而同一任务片同时只能运行在一个CPU上,不同的任务片可以同时运行在不同的CPU上。因此需要软中断实现者自己处理因多CPU 存取共享数据产生的同步问题,在获得高性能的同时,增大了编程难度。而任务片则在性能和编程难度间找到了一个合理的平衡点,被大多数设备驱动所采用。

3.1结构分析

通过分析与tasklet和softirq相关的源代码,可以抽象出两者的类图(图2),smanager负责提供初始化、请求、触发、处理软中断的方法,其中do_softirq负责实际处理软中断,该方法在软中断层有标准实现,但在某些平台上(如i386平台)则由体系相关部分实现以支持软中断栈,但系统运行时只能使用一种实现,为此内核使用条件编译,在编译时确定使用哪一种实现,这实现了一种编译时的“多态”。smanager内含一个包含32个softirq_action的线性数组,以此实现对软中断的全局管理,数组下标隐含了软中断的优先级,下标越小,优先级越高。softirq_action实际上是软中断相量,设计的相当简单,它包含一个action接口由具体的软中断来实现。内核已实现并装入了几种软中断,这些软中断一经装入就不会被卸下,所以内核目前没有提供释放软中断的方法。一般推荐由内核开发者来实现软中断,而不是设备驱动的编写者。

tmanager通过tasklet_action实现action接口方法成为一种软中断,tmanager负责对外提供创建、调度、禁能tasklet的方法,它内含几个与CPU个数相等的数组,每个数组包含一个tasklet相量链(与CPU一一對应),在这里,再次采用了职责链设计模式,因为与中断共享类似,多个tasklet实际上共用了一个软中断触发标志位,且要求支持tasklet的动态增减,但tasklet的动态性更强,仅执行一次就被从链表中删除。在内核中实现了两类不同优先级的tasklet,其结构和行为基本一致,本文以普通优先级的tasklet为主进行论述。

3.2行为分析

软中断的运行可分为触发和执行两步。触发机制类似于内核中的信号机制,raise_softirq方法设置触发标志位(每个CPU均有一个整型标志字,每位依次与软中断号相对应,置1表示该软中断需要处理);软中断的实际执行由do_softirq方法完成,该方法可以在多CPU上同时执行,首先判断当前CPU是否已运行软中断,若是则退出,以避免重入可能导致的死锁;然后依次遍历软中断数组,对于标志位置1的软中断则调用其action方法,进行实际的软中断处理。

图2 softirq和tasklet类图

tasklet的运行也分为提交和执行两步,提交由tasklet_schedule完成,它会把tasklet插入到与当前CPU所对应的tasklet链中,在插入前会判断tasklet是否已被调度到其它CPU上(通过成员state判断),若是则返回,以此保证某个tasklet在多个tasklet链表中的唯一性,然后调raise_softirq触发软中断;执行由tasklet_action(被do_softirq调用)完成,它遍历与当前CPU对应的tasklet链表,调用func接口方法实现处理,并将处理过的tasklet从队列中删除。在tasklet处于运行状态时,该tasklet可以再次被调度到tasklet链表中,但不能被运行,直到前一tasklet运行完毕。提交和执行机制共同保证了同一tasklet在多CPU上的串行执行以及不同tasklet在多CPU上的并行执行。

4 结论

通过充分运用面向对象的基本设计原则(封装变化;编程中使用接口,而不是接口实现;优先使用组合而不是继承)以及设计模式,Top Half 和Bottom Half被设计实现成了一个中断处理的框架结构,融高效与灵活为一体,本身也可以被抽象提炼出一种设计模式。其设计思想和方法值得学习和借鉴。

参考文献:

[1]陈莉君.Linux操作系统内核分析[M].北京:人民邮电出版社,2000.102-125.

[2]Linux2.6.20内核源码[EB/OL].http://www.kernel.org.

[3]Erich Gamma.等.著.李英军.等.译.设计模式:可复用面向对象软件的基础[M].北京:机械工业出版社,2000.9:147-218.

[4]毛德操,胡希明.Linux 内核源代码情景分析[M].杭州:浙江大学出版社,2001.222-333.

篇4:Silverlight游戏设计:(五)面向对象的思想塑造游戏对象

自从1994年爱立信公司开发蓝牙技术以来,蓝牙技术由于其方便性,低功耗等特性有了快速的发展,并已应用到许多领域,相应的各种各样的蓝牙产品也出现在市场上,例如蓝牙耳机、蓝牙电脑、蓝牙手机、蓝牙打印机等等,人们可以方便的使用蓝牙产品进行通信而不需要通信费用,并且很大程度上替代了有线通信,同时随着蓝牙技术的快速发展,其本身的问题也越来越突出,其中最重要的就是安全问题,极大的制约了蓝牙技术的发展,本论文就是针对此问题提出了蓝牙安全模块的设计思想,并开发出独立的蓝牙模块使其可以集成到不同的产品中。

2 安全原因分析

蓝牙的安全问题主要包括两个方面:第一是协议本身的问题,例如PIN的易攻击性,由于蓝牙算法简单和无线传播本身的不安全性,使得当用户输入的PIN码位数小于8位时很容易被第三方计算出PIN码,进而密钥被盗。协议允许对不同的设备使用同一密钥即Unit Key,这就使得密钥泄露成为可能。这类攻击主要包括Unit Key Attack,Relay Attacke,On-Line Pin Attack等。第二是上层蓝牙实现时安全控制不够,很多上层业务实现并没有实现安全控制,有些实现安全控制的安全度不高,这类攻击包括Bluesnarfing,Bluebugging,Peripheral hijiacking等随着科技的发展,蓝牙攻击的种类会越来越多也越来越容易,就如同PC机中的防火墙和杀毒软件一样,蓝牙也需要专门负责安全的功能模块才能应对各种各样的攻击。

3 蓝牙安全模块分析和设计

安全管理器就是要设计的蓝牙安全模块,它需要提供一些接口与蓝牙协议中的L2CPA层、用户接口、设备数据库、服务数据库和HCI接口进行通信。

3.1 安全模块的功能分析

安全模块的功能如下:

1.当需要建立一次L2CAP连接的时候,默认情况下会启动一次安全检测,然而,当在用户认为相对安全的环境下,例如在家中,办公室等,用户可以不需要启动安全检测,这就需要一个布尔标识参数flag_sec,为了保证安全,此值只能用户对其进行修改,而每次建立连接时都会对其检查,当为真是进行安全检测,否则不进行检测;2.蓝牙规范中包括可信(trusted)设备和业务,对于可信设备不需要进行安全鉴权,对不同的业务安全级别的要求不同,所以安全模块需要同设备数据库和业务数据库进行交互来确定是否要进行安全检查,同时用户也可以设定一些设备和业务的安全级别;3.对于建立在同一L2CAP上的不同的连接即不同应用可以在安全管理器中调用不同的鉴权过程,即只需要在安全管理器增加其功能,此论文主要讨论在L2CAP层的安全应用;4.为了以后的可扩展性以及透明性,此功能模块主要以接口的同其他层交互。

3.2 连接建立过程

1.要求建立L2CAP连接;2.L2CAP把请求转给安全管理器并同时传递参数;3.当安全管理器启动的时候开始验证安全性,当安全管理器关闭的时候直接返回真,否则的话进行下一步;4.首先从服务数据库和设备数据库读取安全级别,如果可信任设备和服务直接返回真,否则进行下一步;5.要求用户输入PIN码,也可能包括其他需要的参数,这主要是有所采用的安全算法决定;6.从HCI层请求远端设备的验证值;7.把从HCI层得到的验证值和本地的计算值进行比较,相等的情况下就认为远端设备通过鉴权,并相L2CAP层返回TRUE;8 L2CAP层根据结果来决定是否进一步建立连接,当从安全管理器返回TRUE则建立连接否则不建立连接。

4 安全模块算法

由于原蓝牙算法的易攻击性,本安全模块使用PIN与身份标识相结合设计算法,其中PIN码是两者所共有的,CID是本设备的身份标识,包括BD_ADDR,friendly name。f(),g(),w()是函数,为了保证PIN的安全性,本模块f()使用一对多的函数,例如sin()函数,由于无线传播时只传输f(PIN),所以第三方只能监听到f值并得到PIN的部分信息很难计算出Kinit的值。对于g()则需要采用一对一算法,w()函数用于计算Kinit,由于Kinit用于以后的鉴权和加密,它的安全与否对蓝牙整体安全性能有很大的影响。当双方进行鉴权的时候通过对方CID来取得相应的Kinit连接。

5 结语

本文介绍了蓝牙安全模块的总体设计框架和安全算法的核心方法,提出了身份识别和PIN相结合的安全机制,并主要是从PIN保护的角度来设计算法。由于一般的应用都需建立在L2CAP层之上,所以本论文只对L2CAP层的安全进行实现,没有考虑更上层的安全问题,有待进一步的研究。

摘要:主要介绍了蓝牙安全模块的软件设计思想,为了使模块具有很好的移植性,采用java进行模块开发,同时针对蓝牙协议算法的易破解性,提出了新的安全算法,此算法对PIN码进行一对多计算,同时对蓝牙设备通过用户设定进行了身份标识,在以后的鉴权中只进行身份信息的交换,这使得即使蓝牙认证过程被第三方监听,第三方仍然无法获得PIN码和密钥。

关键词:蓝牙安全,面向对象,安全算法,蓝牙安全模块

参考文献

[1]Bluetooth SIG Security Expert Group,bluetooth security white paper,2002.

[2]金纯,许光辰,孙睿.《蓝牙协议及其实现》北京:电子工业出版社,2001.

[3]张禄林,雷春娟,郎晓红.《蓝牙技术》北京:人民邮电出版社,2001.

[4]Bluetooth Paring and Authentication Vulnerabilities,Dennis K.Nilsson.

[5]Bluetooth SIG,Specification of the Bluetooth System V2.1+EDR,http://www.bluetooth.com/,26July2007.

上一篇:苗圃建设政策资料下一篇:茶道文化沙龙活动