2012-10-28 35 views
3

我正在構建一個openGL ES 2遊戲,在Android上使用Java。3 Android線程,如何構造

我目前有兩個線程。 Android用戶界面和openGL。根據我的理解,爲了獲得最佳性能,我需要爲遊戲邏輯創建另一個線程,因此openGL線程可以儘可能快地渲染。

這會讓我變成3. Android UI,openGL和Game Logic。 (我們姑且稱之爲UI,OGL和GL)

糾正我,如果我錯了:

UI開始,讓OGL和GL。 OGL和GL運行,查詢用於輸入的UI。 GL發送繪圖調用到OGL中的隊列。

這裏有兩種情況。 如果GL比OGL花費更多的時間循環,OGL的下一個循環需要等待GL開始它的下一個循環之前完成,以避免只渲染上一幀的一半調用。 如果OGL需要比GL更長的時間,GL需要等到OGL完成再次開始/發送更多的繪製調用。

要做到這一點:

當GL完成與它的循環,它會檢查OGL,看看它做畫繪製調用的當前隊列。如果是這樣,它將啓動GL和OGL的下一個循環。如果不是,它會等待。

當OGL完成時,它檢查GL。如果GL完成,它將再次啓動兩個循環。如果不是,則等待GL,完成後將檢查OGL,然後再次啓動。

很抱歉,如果這是一個有點混淆的措辭..

要illistrate我的想法:

diagram http://img840.imageshack.us/img840/2816/stackoverflowthredpictu.jpg

爲了澄清我的問題: - 將會鋪設的事情了這樣的工作? - 如果不是,哪個更好?

- 什麼具體科目我應該看看做到這一點?我不知道如何在它們之間創建線程或發送信息。

這是我第一次在這裏問一個問題,希望我做對了。 :) 謝謝!

+1

我對OpenGL並不熟悉,但對於Android上的一般多線程,最好避免使用'AsyncTask',並使用標準Java'Runnable'與Android'Handler'。 –

回答

0

將這樣鋪設的東西工作嗎? - 如果不是,那會更好嗎?

是的,但是這種策略可能會造成比必要的更多的複雜性。當兩個線程必須等待另一個線程時,很容易死鎖。

我想你可以使用RENDERMODE_WHEN_DIRTY

setRenderMode(RENDERMODE_WHEN_DIRTY); 

在這種模式下,渲染器將渲染只有當(1)創建面或(2)你叫requestRender()框架。所以,你的遊戲邏輯線程會調用queueEvent()(或類似的)將繪圖調用推送給渲染器,然後在遊戲邏輯循環結束時調用requestRender()

如果仍然發現遊戲邏輯線程需要等待渲染到結束,您可以創建在遊戲邏輯線程將阻塞,直到渲染信號(通過調用Semaphorerelease())一Semaphore,它的完成渲染幀。

聲明:我不是一個遊戲開發者,但希望這給你一些探索的途徑。