2015-06-12 33 views
1

我有我的應用程序一個圖像視圖,我想它加載大位,但是當我設置"android:hardwareAccelerated="true",我得到一個錯誤如何使用Open GL ES在Android中加載巨大的位圖?

(位圖太大,無法上傳到質地(2368x4208,最大 = 4096×4096))

我工作圍繞這通過設置flagfalse。這引起了另一個問題,同時滾動/縮放圖像ImageView,表現非常糟糕。

問題:

  1. 我可以有很多紋理的?
  2. 總紋理大小是否可以超過4096x4096?
+1

http://stackoverflow.com/a/7523221 – Sree

+0

@Sree我可以使用類似這樣的東西嗎? tile1 = 3000x3000 tile2 = 3000x3000 –

+0

我認爲這是不可能的,我不確定。我已經嘗試了2048年,它的工作原理 – Sree

回答

2

您正在觸摸的紋理限制是由GPU驅動程序施加的,並且可能因設備而異。使用硬件加速,ImageView將使用OpenGL ES驅動程序,推測使用glTexImage2D函數將圖像上傳到GPU。從它的文件:如果電平大於log 2⁡最大值,其中max是GL_MAX_TEXTURE_SIZE的返回值時目標是GL_TEXTURE_2D或GL_MAX_CUBE_MAP_TEXTURE_SIZE當目標沒有被GL_TEXTURE_2D可以生成

GL_INVALID_VALUE。

如果你看一下glGet的文檔以GL_MAX_TEXTURE_SIZE

GL_MAX_TEXTURE_SIZE PARAMS返回一個值。該值給出了GL可處理的最大紋理的粗略估計。該值必須至少爲64.請參閱glTexImage2D。

因此,您只能保證您可以在每個支持ES 2.0的設備上上傳64x64紋理。實際上,對於許多當前設備,這個數字是2048x2048,但通過查詢此值,您應該始終知道在嘗試上傳大圖像之前可以調整圖像大小。一般來說,這裏的一小部分意味着一個不太強大的GPU,因此屏幕分辨率較低,需要的紋理較少。您可以根據此值區分您的資產 - 例如。較低分辨率的屏幕具有較低的分辨率紋理。

要回答您的其他問題,GL在創建的紋理數量上沒有限制,例如。與glGenTextures。但是,從技術上講,您在OpenGL ES中調用的任何命令都可能會生成GL_OUT_OF_MEMORY錯誤。不幸的是,沒有標準的方法來查詢驅動程序是否能夠處理給定命令的任何所需的分配。處理這個問題的唯一實用方法是在具有不同GPU功能的許多設備上測試您的應用程序。

+0

謝謝您的詳細解答 –