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 來...