簡體   English   中英

如何在DirectX中創建加載程序線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM