成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

我看“變速齒輪”的工作原理

2010-08-28 10:45:56來源:西部e網作者:

  最近,我在“大眾軟件”上看到一則關于軟件“變速齒輪”的報道。我很少上網,所以對這方面了解比較少,不知道它在網上已經流行好長時間了。當時的感覺就是太驚奇了,很佩服王榮先生是怎么做到如此神奇的事,尤其是他如何保證各種游戲的兼容,他如何知道不同游戲對時間的處理。我立刻上網DOWN了個0.22b版,在試用的過程中,我發現“變速齒輪”不但可以加速游戲,實際上,它可以加速任何windows程序(從某種程度上),我逐漸認識到它的工作原理,不一定對,僅是猜測而已。先聲明一點,我是使用UNIX的,并不是很了解windows編程,所以只能給出概念上大體的認識,而無法說出具體的實現辦法。

  首先,先看看計算機是如何有時間概念的。在主板上有一個時鐘晶振,依靠電池供電,本質上就是一塊電子表。計算機軟件中所有的時間概念,歸根結底都來自著個“硬件時間”,換句話說,如果這個時間不對,則任何運行在該主板上的程序對時間的處理都不可能正確。(包擴各種操作系統)

  那么,操作系統是如何知道這個時間的呢?這是因為這個時鐘每過一定時間都會產生一個硬件中斷(INT)操作系統可以截取這個中斷并做相應的處理,從而獲得時間的概念。好象是20ms產生一次中斷,一秒鐘50次。具體的中斷號我忘了,就稱為 INT A 吧。對Dos而言,它在啟動時就準備好了對INT A的中斷處理程序(Dos核心的一部分),當我們使用DOs的時候,在提示符狀態下,即使不做任何操作,Dos內部在一秒鐘時間內,也會接受50次INT A,執行50次中斷處理程序。只是這一過程在幕后完成,我們無法感受到。Dos的中斷處理程序所做的,就是讓Dos能夠了解當前的時間。(如保留當前日期,時間在內部變量中等操作)。但很重要的一點,在INT A中斷處理程序的末尾,又調用INT B。
INT B是Dos為用戶保留的軟中斷,在缺省情況下,Dos的INT B中斷處理程序立即返回,不做任何事。而
用戶可以編寫自己的INT B中斷處理程序定時處理自己的操作,然后把它替換Dos原來的空INT B中斷程序。比如我有一個程序需要在12:00運行,一種方法是寫如下代碼:
for(;;){
if(時間是12:00) break;
sleep(5); /*休息5秒鐘,這句在Dos中沒有,意為讓程序不做任何事,只是等待一段時間*/
}
{具體的處理程序}

  然后在提示符狀態下運行。因為Dos沒有多用戶的概念,在程序12:00退出以前,無法在使用這臺機器。另一種方法是,把要運行的程序寫成TSR(長駐內存程序),運行后執行代碼長駐在內存中,程序本身返回提示符,供用戶使用。那么該執行碼如何保證在12:00被執行呢,就要靠INT B,在長駐該程序時,也要編寫新的INT B中斷處理程序,內容大概是:
{屏蔽INT B中斷} /*這一步是因為Dos的大部分中斷是不可重入的,
即在中斷還未處理完時,再次*/
/*被中斷,這一般會讓Dos死掉*/
{執行舊的INT B中斷處理程序} /*這一步的目的是防止自己的TSR影響其他TSR程序*/
if(時間是12:00){
把處理轉向TSR程序的入口;
} else {
{恢復被屏蔽的中斷}
退出;
}
綜合上面講到的,Dos下的時間處理大概是:

機器時間------->INT A(操作系統用)-------->INT B(用戶用)-------->TSR程序

當然,由于Dos對運行級別幾乎沒有控制,用戶也可以繞過INT A,INT B直接訪問硬件。這時我們即使改變操作系統的時間,用戶程序也能得到正確的時間。
在windows中,情況也很類似。但程序不會直接訪問硬件,而是通過叫VxD的虛擬設備驅動程序來工作。由VxD來和硬件打交道,而應用程序只和VxD交流信息。對時鐘中斷的處理也是一樣,windows有專門的時鐘虛擬設備驅動來捕獲來自晶振的硬件中斷,并為windows提供時間和定時的功能。這與Dos下的INT A功能基本是一致的,但更強大,功能更廣。
我們在來看應用程序需要怎樣的時間處理機制。一個典型的游戲,如射擊游戲,如果沒有時間控制,敵人的飛機如果要連開10槍,程序應該是:
for(i=0;i<10;i++){
開槍;
}
但是有一個問題,機器的速度可能太快,以至于只需要0.1秒十槍就完成了,另外在不同的機器上,這段程會有不同的運行時間。為了解決這個問題,我們改進這段程序:
for(i=0;i<10;i++){
開槍;
sleep(1); /*休息1秒,不做任何事*/
}
這樣我們至少保證一秒只開一槍。但還有一個問題,就是可能屏幕上有多個敵人,不可能在一個敵人開10槍的過程中其他敵人不動(而且自己也不動)。所以我認為,一般的游戲程序都是用定時器來實現主要功能的。即先為每一種動作編寫相應的處理程序,如開槍,移動等,在為每個對象申請一個定時器,一旦定時器的時間到,就激活該對象相應動作的程序代碼。如屏幕上的十個敵人對應十個定時器,定時器互不干涉,哪個時間到轉向哪個處理程序,控制他是否該移動或射擊。至于定時器的創建,由應用程序向系統申請。

|--->用戶定時器1------->用戶程序1
|--->用戶定時器2------->用戶程序2
機器時間------>windows的時鐘VxD---|--->用戶定時器3------->用戶程序3
|--->系統接口------->系統應用

  這種機制可以保證星際爭霸中的小狗在P100上和在PIII上奔跑的速度一樣快,前提是這兩臺機器的硬件時間是一樣準的,但是,如果有一臺機器的時鐘快或慢了,那問題就有變化了。(注意,這里的快或慢,并不是指兩臺機器的時間不一樣,而是指在相同的現實時間下,他們產生硬件中斷的次數不一樣)

  那么,說了這么多,我認為“變速齒輪”的工作原理,就是修改用戶申請的windows定時器中的等待時間。我不太了解windows編程,不好說這種修改是如何實現的。他沒有修改VxD因為windows系統的時間并沒有因為啟動“變速齒輪”而跑快或跑慢,某些應用,如雙擊桌面圖標時的間隔時間上的設定(即兩次擊鼠標的間隔時間多長以內才算是“雙擊”)也沒有變。通俗的描述是:在啟動“變速齒輪”后,當應用程序(特別是游戲)向windows申請定時器時,“變速齒輪”修改了申請的等待時間參數,因次改變了程序正常的定時,才使程序有了不正長的
速度(這個結論只是猜的)。只所以這樣猜,是因為對已經啟動的程序,他并不能改變速度,而只能先啟動“變速齒輪”,再運行程序。另外,某些系統接口,也是無法修改的。

  所以,一旦啟動“變速齒輪”,所有應用程序(申請了定時器,并要依靠定時器來做一些操作的程序)都會受到他的影響。在Word中,等待輸入的光標會因為調成了加速而更快的閃動,各種提示信息的出現時間會變快(或變慢)很多,最夸張的是,當把速度調成最慢時,在同一位置,間隔十秒鐘擊一次鼠標會被系統認為是雙擊(發生在應用程序內,而不是桌面上)

  我很佩服王榮先生的想象力和編程能力。“變速齒輪”的出現,證明在虛擬的世界里:沒有做不到的,只有想不到的。

  變速齒輪下載http://www.wsalc.com/soft/soft.asp?id=5744

關鍵詞:變速齒輪

贊助商鏈接:

主站蜘蛛池模板: 延吉市| 泰来县| 南郑县| 鲁甸县| 峡江县| 清远市| 洛南县| 武威市| 崇义县| 南平市| 湟源县| 郎溪县| 北宁市| 互助| 宾阳县| 方正县| 蒲城县| 南平市| 新田县| 梧州市| 阳春市| 游戏| 枣强县| 和龙市| 原平市| 游戏| 高州市| 巴中市| 龙井市| 新津县| 宜州市| 左云县| 连山| 泰州市| 甘泉县| 岑巩县| 临泽县| 庆城县| 柯坪县| 平乡县| 扎鲁特旗|