对应游戏当中的主角操作上,一般为站立,行走,跳跃和射击等。四个动作对应四段程序代码。其工作的正确与否不仅取决于它自身的正确性,而且与它在执行中能否与其他动作代码正确地实施同步与互斥有关。
玩家控制游戏里的主角,操作动作,其实是在发布命令,向游戏系统请求资源,而有些资源是临界资源。对临界资源实施操作的那段程序代码,称为临界区(Critical Section ,CS).
信号量机制里有整型信号量与PV操作,PV操作是实现进程同步与互斥的常用方法。P操作和V操作是低级通信原语,在执行期间不可分割。其中,P操作表示申请一个资源,V操作表示释放一个资源。放在游戏里,我们研究是是四个动作代码。
信号量分为如下两类,1.公用信号量 2.私用信号量
公用信号量
它是实现进程间的互斥,初值为1或为资源的数目。
P操作的定义:S:=S-1,若S>=0,则执行P操作的进程(代码)继续执行;若S<0,则将该进程(动作)置为阻塞状态,并将其插入阻塞队列。
Procedure P(Var s:semaphore) //semaphore代表变量s定义为信号量类型 beign s:=s-1; if s<0 then w(s) ; //w(s)代表插入阻塞队列 end
例如,行走的动作和其他动作是互斥的,像《生化危机4》里,主角Leon(里昂)拿枪射击时,是无法行走的。当主角射击时,表示 申请了这个动作,行走的信号量就减1变为0。
V操作的定义:S:=S+1.若S>0,则执行V操作的进程(代码)继续执行;若S<=0,则从阻塞状态唤醒一个进程,并将其插入就绪队列 ,然后执行V操作的进程(代码)继续。
Procedure V(Var s:semaphore) //semaphore代表变量s定义为信号量类型 beign s:=s+1; if s<=0 then R(s) ; //r(s)代表从阻塞队列中唤醒 end
这样,我们可以利用PV操作实现这两个动作代码的互斥,定义信号量mutex的初值为1,当进入临界区执行P操作,退出临界区执行V操作。这样,利用PV操作实施进程(代码)互斥的代码段如下
P(mutex)
临界区 -------》可以理解为里昂的拿枪射击动作
V(mutex)
综合一下,我们可以概括出里昂的行走和射击这两个动作的互斥代码
if 攻击 then begin p(mutex) ………… ----》攻击的程序代码,这时行走的信号量由1变为0 v(mutex)---释放s, end //行走 begin p(mutex)---请求行走时,如果在射击状态,s<0 所以行走的代码被插入到阻塞队列里,将无法执行行走的动作。 ………… -------》行走的程序代码 v(mutex) end
暂无关于此日志的评论。