1

分享

【Scratch 教學】等待 0 秒? 3 - Scratch 執行緒深入研究

前篇提到了『等待 0 秒』是因為執行緒遇到了「讓點」,Scratch 必須暫停執行緒去並轉換到下一個執行緒去執行,並不會毫不等待,依照實驗結果『等待 0 秒』消耗了 0.033 秒的時間。
本篇內容主要翻譯自 Scratch 專家 Cliff Davies 的 "Scratch and its inner workings"   
Scratch Scratch教學 傑夫老師

Photo by Noah Dominic Silvio on Unsplash

但為什麼是 0.033 秒?數學好的可以發現是 1/30,社群中也有人早就提到了是因為 30fps (frame per second),這些是什麼關係,傑夫老師就來說明。
Scratch 限制了專案畫面更新率在 30 fps,意思是每秒最多更新畫面 30 次,也就是每 0.033 秒更新畫面一次。相較於之前實驗的,一秒可以跑上 50 萬圈,0.033 秒可以做很多運算了。
每當 Scratch 要從列表中的第一個執行緒開始執行所有執行緒前,會檢查每個執行緒是否會有需要更新畫面,例如:角色有移動、旋轉、顏色有變化或是有『等待』。並用一個「旗標 "flag"」紀錄,如果沒有要更新畫面,此旗標的值就為「否 "false"」;但若有任何一個執行緒會更新畫面,那此旗標的值就被設為了「是 "true"」。
接著 Scratch 開始一一執行列表中的執行緒,每遇到讓點就換下一個執行緒,直到最後一個執行緒遇到讓點時,如果旗標的值為「是 "true"」, 那就要做一次畫面更新。這點很重要,只要有一個執行緒需要更新畫面,會造成所有的執行緒都停下來,等待畫面做完更新。而剛剛說了,畫面更新率被限制在每秒 30 次,所以,所有的角色移動、變色等等都統一每 0.033 秒發生一次。
注意,剛剛說的是"所有的執行緒"都會停下來,所以這種狀況,會造成 count 這個積木串,不再是 50 萬次。
Scratch Scratch教學 傑夫老師

只要有一個執行緒需要跟新畫面,所有的執行緒都要等待畫面更新

而『等待』積木也把旗標設為了「是 "true"」,為了等待畫面更新,導致等待了 0.033 秒,而不是預期的 0 秒。
Scratch Scratch教學 傑夫老師

『等待』積木也把旗標設為了「是 "true"」,導致等待了 0.033 秒

簡而言之,除非你的 Scratch 專案完全沒有畫面更新,否則一般的狀況下,重複迴圈一秒 30 圈,等待小於 0.033 秒毫無意義。
#Scratch  #Scratch教學  #傑夫老師 
分類:學習

傑夫(Jeff)老師喜歡研究積木型(block)程式,如:Scratch, App Inventor, micor:bit,除了有一般中小學生的課程,也不定期的會開設Scratch師資培訓班,並且是「Scratch的100個技巧」的共同作者。

評論
上一篇
  • 【Scratch 教學】等待 0 秒? 2 - Scratch 執行緒深入研究
  • 下一篇
  • 【Scratch 教學】重複收廣播 1 - Scratch 中常犯的錯
  • 更多文章
    載入中... 沒有更多了