資訊內(nèi)容
淺談Scratch的舞臺(tái)刷新機(jī)制 Part 3——隱藏對(duì)象與加速模式
“?順序結(jié)構(gòu)的代碼,在執(zhí)行過(guò)程中,都不會(huì)刷新舞臺(tái),只有在執(zhí)行完最后一塊積木后,才會(huì)進(jìn)行刷新;而循環(huán)結(jié)構(gòu)的代碼,每一輪循環(huán)都會(huì)刷新一次舞臺(tái),如循環(huán)結(jié)構(gòu)中角色的旋轉(zhuǎn)效果,每執(zhí)行完一次右轉(zhuǎn)的代碼,當(dāng)輪循環(huán)結(jié)束,舞臺(tái)刷新一次,如此我們就會(huì)看到角色旋轉(zhuǎn)的過(guò)程了。循環(huán)結(jié)構(gòu)不能單獨(dú)存在,循環(huán)結(jié)構(gòu)中必然包含順序結(jié)構(gòu),所以本質(zhì)還是順序結(jié)構(gòu)執(zhí)行完后對(duì)舞臺(tái)進(jìn)行刷新。”
在《淺談Scratch的舞臺(tái)刷新機(jī)制 Part 1——自制積木的不刷新屏幕功能》一文中,介紹了“運(yùn)行時(shí)不刷新屏幕”功能的原理及其應(yīng)用;在《淺談Scratch的舞臺(tái)刷新機(jī)制 Part 2——在常規(guī)積木中的應(yīng)用》介紹了順序結(jié)構(gòu)的代碼和循環(huán)結(jié)構(gòu)代碼對(duì)于舞臺(tái)刷新的處理,以及Scratch中阻塞狀態(tài)的本質(zhì)。本文將會(huì)介紹Scratch中隱藏對(duì)象的舞臺(tái)刷新方式與加速模式。
01
情景復(fù)現(xiàn)
通過(guò)之前兩篇文章,對(duì)于在不同情況下舞臺(tái)的刷新機(jī)制都已經(jīng)有了一定的了解。但是還有一種情況我們尚未討論。舞臺(tái)刷新的目的是為了讓用戶觀察到程序運(yùn)行的效果及其過(guò)程,試想一下,如果一個(gè)角色本身就是看不見(jiàn)的,那舞臺(tái)還需要去大費(fèi)周章地刷新嗎?先來(lái)看一個(gè)實(shí)例
代碼:
可見(jiàn)的角色在緩慢移動(dòng)的過(guò)程中先隱藏再顯示
小貓“閃現(xiàn)”
角色在顯示狀態(tài)下,執(zhí)行循環(huán)結(jié)構(gòu)中的移動(dòng)代碼時(shí),不斷刷新屏幕,因此可以看到角色移動(dòng)的過(guò)程,且移動(dòng)速度較緩慢。角色切換至隱藏狀態(tài)后,同樣的代碼瞬間就執(zhí)行完畢,造成瞬移、閃現(xiàn)的效果。結(jié)合《淺談Scratch的舞臺(tái)刷新機(jī)制 Part 2——在常規(guī)積木中的應(yīng)用》中關(guān)于舞臺(tái)重繪需要消耗時(shí)間的說(shuō)法,可以推測(cè),角色之所以閃現(xiàn)、代碼之所以執(zhí)行效率如此之高,是因?yàn)槊馊チ宋枧_(tái)刷新的步驟,也就是說(shuō),隱藏的角色是不會(huì)刷新舞臺(tái)的。
02
應(yīng)用
這個(gè)特性的發(fā)現(xiàn)具體有什么用呢?可以加快局部對(duì)象的程序執(zhí)行效率,使用起來(lái)比“運(yùn)行時(shí)不刷新屏幕”功能更方便一些,且不局限于角色。以2.0中的冒泡排序?yàn)槔?
代碼:
主程序,插入20個(gè)隨機(jī)數(shù),等待空格按下開(kāi)始排序,并計(jì)時(shí)
冒泡排序
運(yùn)行過(guò)程:
排序過(guò)程
運(yùn)行結(jié)果:
對(duì)20個(gè)數(shù)字進(jìn)行排序用時(shí)6.396秒
由于列表顯示器位于舞臺(tái)中,在2.0中也需要通過(guò)舞臺(tái)的刷新來(lái)展示其變化,所以
在函數(shù)Buble Sort中,在開(kāi)頭加上【隱藏列表】,在末尾加上【顯示列表】
對(duì)20個(gè)數(shù)字進(jìn)行排序時(shí),隱藏列表,用時(shí)0秒
自信地將樣本容量擴(kuò)大,嘗試對(duì)100個(gè)數(shù)進(jìn)行排序。
100個(gè)數(shù)字的冒泡排序依然在非常短的時(shí)間內(nèi)完成,而在列表不隱藏時(shí)對(duì)100個(gè)數(shù)進(jìn)行排序,耗時(shí)將達(dá)到40秒左右。看來(lái)舞臺(tái)刷新消耗的計(jì)算機(jī)資源還真不小。
本案例使用2.0進(jìn)行測(cè)試的原因是,3.0中即使列表處于顯示狀態(tài),也不會(huì)刷新舞臺(tái),無(wú)論顯示還是隱藏,對(duì)1000個(gè)數(shù)進(jìn)行冒泡排序的耗時(shí)都在3~5秒這個(gè)量級(jí)。所以在2.0的項(xiàng)目中,可以通過(guò)將列表隱藏來(lái)加快和列表相關(guān)代碼的執(zhí)行效率。
03
加速模式
加速模式可以通過(guò)工具欄開(kāi)啟/關(guān)閉,也可以通過(guò)SHIFT+鼠標(biāo)左鍵單擊綠旗按鈕來(lái)開(kāi)啟。
代碼:
通過(guò)變量count計(jì)算循環(huán)次數(shù),數(shù)值變化越快表明程序運(yùn)行速度越快
加速模式效果
開(kāi)啟加速模式后count數(shù)值飛快增長(zhǎng)
加速模式開(kāi)啟后可以大幅加快程序運(yùn)行效率,結(jié)合之前不刷新屏幕相關(guān)效果,我對(duì)于加速模式的推論是:如果是完全的不刷新屏幕,我們是無(wú)法看到角色移動(dòng)的,而在加速模式下也能看到角色移動(dòng),只不過(guò)是以瞬間移動(dòng)的形式,所以加速模式的本質(zhì)是減少屏幕刷新次數(shù),從原先的每1輪循環(huán)都刷新1次屏幕,加速至比如每100輪循環(huán)才刷新1次屏幕。這部分內(nèi)容僅僅是推論,有待商榷。
04
加速模式的應(yīng)用
加速模式可以應(yīng)用在一些計(jì)算量特別大的案例中,以《蒙特卡羅方法》為例。
蒙特卡羅方法(Monte Carlo method),也稱(chēng)統(tǒng)計(jì)模擬方法,是二十世紀(jì)四十年代中期由于科學(xué)技術(shù)的發(fā)展和電子計(jì)算機(jī)的發(fā)明,而被提出的一種以概率統(tǒng)計(jì)理論為指導(dǎo)的一類(lèi)非常重要的數(shù)值計(jì)算方法。是指使用隨機(jī)數(shù)(或更常見(jiàn)的偽隨機(jī)數(shù))來(lái)解決很多計(jì)算問(wèn)題的方法。與它對(duì)應(yīng)的是確定性算法。蒙特·卡羅方法在金融工程學(xué),宏觀經(jīng)濟(jì)學(xué),計(jì)算物理學(xué)(如粒子輸運(yùn)計(jì)算、量子熱力學(xué)計(jì)算、空氣動(dòng)力學(xué)計(jì)算)等領(lǐng)域應(yīng)用廣泛。
在本案例中用來(lái)計(jì)算圓周率。通過(guò)往一定范圍內(nèi)進(jìn)行大量地隨機(jī)投點(diǎn)(這個(gè)范圍是圓的外接正方形),統(tǒng)計(jì)落在圓的范圍內(nèi)的點(diǎn)數(shù),來(lái)計(jì)算出圓周率的近似值。由于投放數(shù)量十分龐大,所以需要使用加速模式。
在加速模式下利用蒙特卡羅方法進(jìn)行10萬(wàn)次投點(diǎn)實(shí)驗(yàn),落在圓內(nèi)的數(shù)量為77480,圓周率近似值為3.0992
盡管這種統(tǒng)計(jì)模擬方法計(jì)算圓周率精度較低,但是其蘊(yùn)含的思想還是值得品鑒的。
至此,Scratch中關(guān)于的舞臺(tái)刷新機(jī)制的剖析告一段落。希望本文也能“刷新”各位Scratchers的認(rèn)知,起到一定的幫助。如果對(duì)于舞臺(tái)刷新機(jī)制你也有相同或者不同的見(jiàn)解,歡迎在Scratch格物堂留言。
聲明:本文章由網(wǎng)友投稿作為教育分享用途,如有侵權(quán)原作者可通過(guò)郵件及時(shí)和我們聯(lián)系刪除
