在Android模擬器上的一些小陷阱

來源:互聯網
上載者:User
轉載請註明出處為KlayGE遊戲引擎,本文的永久連結為http://www.klayge.org/?p=2229

從Android SDK R17開始,模擬器就支援OpenGL ES 2。如果能讓KlayGE在模擬器上跑起來,開發與測試就能方便許多。於是我裝了最新的R21和Android 2.1的ARM v7a的鏡像,經過幾個小時的努力,終於成功執行了一些原來能在Android x86 2.3上跑的簡單例子。途中發現了一些小陷阱,這裡總結一下。

螢幕寬高

原先我的做法是通過ANativeWindow_lock獲得buffer,再拿buffer的width和height。在ICS上,這麼做會導致後面eglCreateWindowSurface失敗。原因似乎是ANativeWindow_lock之後這個視窗就被連到2D API,那麼在eglCreateWindowSurface的時候就會說那個視窗已經被別的API串連了。即便是ANativeWindow_unlockAndPost也沒用。解決方案是改成用ANativeWindow_getWidth和ANativeWindow_getHeight。原先這兩個函數總返回0,現在似乎好了,其實用起來更方便。

glDeleteShader

原先我的習慣都是在glAttachShader之後就立刻調用glDeleteShader,因為GLES的文檔中有一句話:

If a shader object to be deleted is attached to a program object, it will be flagged for deletion, but it will not be deleted until it is no longer attached to any program object…

但模擬器的實現似乎沒遵守這點。如果delete了,後面的glGetAttribLocation都會返回-1,所有attrib都不存在了。所以也得去掉glDeleteShader。

缺少wchar_t的完整支援

這是一直存在的問題。 Bonic 2.3對wchar_t的系列函數也沒做到完整支援。最噁心的是mbstowcs和wcstombs,內部只是memcpy了一下,根本沒有轉碼。。。原先一直用Crystax的NDK,沒這個問題,轉回官方的NDK以後直接悲劇了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.