SDL入門教程(十三) 2 初識多執行緒

2021-04-18 22:08:06 字數 1258 閱讀 4149

intmain(

intargc ,

char

*argv)

if( gameevent.type 

==sdl_keydown )

}screen.flip();}}

sdl_killthread(thread1);

sdl_killthread(thread2);

return0;

} void

sdl_delay(uint32 ms);

解決race conditions的方法就是給cpu足夠的時間「休息」,而這正好也是我們自己定義dt所需要的。sdl_delay()在這個時候就顯得意義重大了。當今電腦的運算速度非常非常快,以至於哪怕我們僅僅給電腦0.01秒的時間「休息」(每次迴圈中),電腦都會顯得很輕鬆了。

intamn(

void

*data)

return0;

} 說到這裡,我們不得不提及之前一直所忽略的乙個問題:我們之前凡是涉及迴圈等待事件輪詢的程式總是占用100%的cpu,這並不是因為我們真正用到了100%的cpu效能,而是我們讓cpu陷入了「空等」(busy waiting)的尷尬境地。輪詢事件得到響應相對於迴圈等待來說,是發生得非常緩慢的事情,我們在迴圈中,哪怕是讓電腦休息0.01秒,事情都會發生本質性的改變:

while

( gameover 

==false)if

( gameevent.type 

==sdl_keydown )

}screen.flip();

}sdl_delay(

10);}

當我們重新執行新程式的時候,我們可以看到程式對cpu的占用從100%驟降到了0%!這當然並不意味著程式就用不上cpu了,而是說,這些運算對於我們的cpu來說,實在是小菜一碟了,或者從資料上說,處理這些運算的時間與0.01秒來比較,都幾乎可以忽略不計!

2.3:gui執行緒與worker執行緒

我們的另外一項試驗是將事件輪詢放到動畫執行緒中,程式就不多寫了,大家可以自己試下。我直接說結論:動畫執行緒中無法響應事件輪詢。

一般提倡的模式,是將gui事件都寫在主線程中,而將純粹的運算才寫到由主線程建立的執行緒中,後者也就是所謂的worker執行緒。從另外乙個概念看,只有主線程控制著「當前視窗」,其它執行緒也許在後台,也許雖然也是在前台但是並非是我們可見的,所以,輪詢事件找不到介面。

對於丟擲的執行緒與主線程之間的通訊,我們可以通過他們共享的資料來進行控制,所以,儘管事件輪詢不能直接影響worker執行緒,但是我們仍然是可以通過主線程進行間接影響的。

SDL入門教程(十三) 1 多執行緒,從動畫說起

1.1 簡單動畫 遊戲離不開動畫。我們考慮最簡單的情況 將乙個角色從乙個位置移動到另外乙個位置。這個行為表述給電腦就是,將乙個su ce不斷的blit 從起始位置的座標,移動到結束位置的座標。移動速度取決於每次blit 的座標差和blit 的時間間隔 v ds dt 我們來設計乙個函式實現這個簡單的...

Java多執行緒入門教程

死亡狀態 dead 執行緒執行完了或者因異常退出了run 方法,該執行緒結束生命週期。修飾普通方法 獲得this物件鎖 synchronized public void synchronized public static void public void 當多個執行緒同時訪問同乙個物件加x鎖的方法...

SDL入門教程(十) 5 SDL完美顯示中文

注意 請使用支援中文的ttf字型檔。5.1 構建可以正確顯示中文的sdl ttf函式 世界終於又充滿了光明!任何事情都是有答案的,不知道僅僅是因為我們還沒有找到。解決了以上一系列問題,我們終於可以不依賴mfc,完全使用自由開源的資源,讓sdl顯示中文了!我們通過ttf renderunicode 來...