2011-09-29 38 views
5

當我轉動我的設備和我的應用程序臨危APP_CMD_CONFIG_CHANGED,我嘗試用下面的更新我的OpenGL視:eglQuerySurface給出錯誤的大小

EGLint width; 
EGLint height; 
eglQuerySurface(display,surface,EGL_WIDTH,&width); 
eglQuerySurface(display,surface,EGL_HEIGHT,&height); 

glViewport(0,0,width,height); 

MY_LOG_MACRO2("New window size: %d x %d",width,height); 

這工作的時間約爲20%。其他80%的時間寬度和高度是以前的值。換句話說,當我將設備轉到橫向模式時,大部分時間都會記錄縱向大小。當我回到肖像時,橫向尺寸被記錄下來。

我從ANativeWindow得到的尺寸也沒有太大的好運。

我應該怎麼做才能在旋轉後獲得正確的窗口大小?

更新:

通過APP_CMD_CONFIG_CHANGED後等待幾幀,大小總是正確的。在不考慮APP_CMD_CONFIG_CHANGED的情況下查詢每一幀的大小,並檢查它是否發生了變化似乎也可以工作,但感覺不對。

+0

你在哪裏調用該代碼? Opengl上下文是線程特定的。如果這段代碼是在隨機線程中運行的,那麼只有在使用設置了上下文的線程時纔可以工作 – crazyjul

+0

@crazyjul我的應用程序只有一個線程。當ALooper_pollAll得到一個'APP_CMD_CONFIG_CHANGED'事件,然後我運行'pollSource-> process(appState,pollSource)''時,這個函數被調用。我的事件循環與示例代碼幾乎相同。 – IronMensan

+0

來自Android論壇的帖子有相同的問題http://groups.google.com/group/android-ndk/browse_thread/thread/8fcfd0177eb78c26/9bfe07b81c36fdea?pli = 1 – crazyjul

回答

0

它可能不起作用,因爲例如在創建上下文時可能會設置表面大小,並且您查詢「previous」大小(創建上下文時)。 編輯:我已經在SGS2(2.3.5)上測試過了,我立即得到正確的結果,所以它可能是一個設備的'供應商'問題(或Android版本問題)。

編輯2:看起來我在測試時犯了一些錯誤,我也得到了怪異的結果@IronMensan。有時它可以正常工作,但大多不是。對不起,我錯了。 因此,我會留在EGL上下文的休閒,就像我在最初的回答(下面)。

當我得到APP_CMD_CONFIG_CHANGED時,我只是簡單地銷燬並重新創建EGL上下文(着色器,紋理等),類似於當我得到APP_CMD_TERM_WINDOW - > APP_CMD_INIT_WINDOW時。

+0

再看看我剛剛添加的問題和更新 - 表面被調整大小,通常不會立即。平均需要大約五幀。 – IronMensan

+0

@IronMensan:我剛剛測試過它,它在我得到APP_CMD_CONFIG_CHANGED後正常工作,然後eglQuerySurface(EGL_WIDTH/EGL_HEIGHT)立即給我正確的結果。在SGSII(2.3.5-KI3)上測試。所以這可能是一個供應商實施問題。什麼是您的設備和Android版本? – kibab

+0

HTC Evo 4G Android 2.3.3。看起來兼容性測試將比我預期的更加痛苦。 – IronMensan

1

爲了檢測屏幕方向的變化,我決定不抓住APP_CMD_CONFIG_CHANGED,但每幀調用eglQuerySurface()。如果屏幕尺寸值與保存的值不匹配,則屏幕方向已更改。

兩次調用eglQuerySurface()用於獲取寬度和高度需要大約10微秒(當被稱爲10000次時爲100毫秒),所以它不會降低性能,並且100%保證屏幕旋轉將被處理。

我認爲這個解決方案比在APP_CMD_CONFIG_CHANGED之後等待幾個幀更好。順便說一下,將設備旋轉180度(顛倒)會導致事件發生,但實際上並未更改屏幕方向,也不應執行任何調整大小的操作。