[英]How to create a loader thread in directx
我有一個使用Directx 9進行渲染的游戲引擎。 我希望能夠在執行主要更新和渲染循環時加載Sprite圖形。 當前,引擎具有一個主更新和渲染循環,因此在此過程中進行的任何加載都會在圖形加載時暫停主循環。
我一直在尋找POSIX線程來做到這一點。 我已經創建了線程函數並包括了互斥鎖,但是代碼在運行時崩潰了。
這是線程函數:
void GameApp::InternalThreadEntry()
{
pthread_mutex_lock (&mutex);
for(int i = 0; i < MAX_NUMBER; i++)
{
test_loader_sprites[i].loadImage(window1,"Test_Image.tga");
}
has_finishd_loading = true;
pthread_mutex_unlock (&mutex);
}
代碼在我的引擎渲染函數中崩潰。 我肯定這是因為線程訪問了window1實例成員的directx設備以進行加載,而主應用程序則訪問了該設備以進行渲染。
你能告訴我即時錯誤在哪里。 我是新來使用線程。
祝一切順利,馬丁
穿線通常是披着羊皮的狼。 它看起來可以解決很多問題,但實際上造成的問題遠遠超過了解決的問題。 幸運的是,您有許多人相信使用附加線程的有效方案。
前一段時間我自己編寫了一個類似的加載器,您的問題似乎確實是您在訪問Window1時正在其他地方使用它。 基本上,您的主線程在Window1運行時是否對Window1做任何事情。 如果是這樣,那將表明這是問題所在。
我發現的解決方案是正確地將數據存儲與渲染器分離。 您可以將數據加載到線程中的存儲中。 完成此操作后,將存儲區中的信息傳遞到線程末尾的主線程(或稍后將其直接移入主線程)。 這樣可以避免依賴線程內的Window1對象。
在開始聽起來正在努力的更大規模的場景之前,最好對線程做一些進一步的閱讀。 使用線程是軟件設計中比較棘手和復雜的領域之一,並且從經驗中您可能無法充分了解它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.