2013-10-15 113 views
2

我正在用AndEngine開發遊戲。因爲我這樣做是爲了Android和我想覆蓋儘可能多的設備儘可能無紋理質量權衡我有2個紋理包類型:高清和低:
GL最大紋理尺寸政策

  • 高清紋理= 2048×2048
  • LOW紋理= 1024×1024
  • 高清攝像頭= 800x1280
  • LOW相機= 400x640

我已經取得了建立一個高清紋理包或低紋理包的所有的邏輯,我現在需要的在應用程序啓動時選擇使用女巫是一種很好的策略。

使用AndEngine的:

型號

GLState state = new GLState(); 
int max = state.getInteger(GLES20.GL_MAX_...); 

我碰到一些價值觀來三星注8,索尼XPERIAü
GL_MAX_TEXTURE_SIZE:4096
GL_MAX_TEXTURE_IMAGE_UNITS:8個
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:8

型號:三星Galaxy贈送,三星S3贈送,HTC個S
GL_MAX_TEXTURE_SIZE:4096
GL_MAX_TEXTURE_IMAGE_UNITS:16個
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:20

型號:三星S4,Nexus4,XPERIA Z1
GL_MAX_TEXTURE_SIZE:4096
GL_MAX_TEXTURE_IMAGE_UNITS:16
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:32

在這個openGL Docs我可以找到每個常量的含義,但我在這裏有點迷路,我不知道如何使用這些數據爲我的紋理和相機選擇正確的設置。

我需要你的幫助和提示,我在正確的道路上嗎?接下來我應該如何處理這些信息?
謝謝你的時間。

回答

1

我遇到另一個測試情況下可能會派上用場,檢查可用內存來:

 ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo(); 
     ActivityManager activityManager = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); 
     activityManager.getMemoryInfo(mi); 
     long availableMegs = mi.availMem/1048576L; 

到目前爲止,我的測試情況是:

if (IS_TABLET7 || IS_TABLET10) { 
    useHIGH &= smallestWidthSize >= TABLET_MAX_SMALLEST_WIDTH; 
} else { 
    useHIGH &= smallestWidthSize >= SMARTPHONE_MAX_SMALLEST_WIDTH; 
} 

Log.i(C.TAG, "=========SCREEN DIMENSIONS========="); 
Log.i(C.TAG, "Screen Size Info: smallestWidthSize = " + smallestWidthSize); 
Log.i(C.TAG, "Screen Size Info: smallestWidthSize >= MAX_SMALLEST_WIDTH (" + (IS_TABLET ? TABLET_MAX_SMALLEST_WIDTH : SMARTPHONE_MAX_SMALLEST_WIDTH) + ")? " + useHIGH); 
Log.i(C.TAG, "Screen Size Info: should use Texture Type > " + (useHIGH ? "HIGH" : "LOW")); 


useHIGH &= availableMegs > MIN_RAM_LIMIT; 
Log.i(C.TAG, "=========AVAILABLE RAM========="); 
Log.i(C.TAG, "Memory Info: available RAM = " + availableMegs + "Mb"); 
Log.i(C.TAG, "Memory Info: available RAM > MIN_RAM_LIMIT(" + MIN_RAM_LIMIT + "Mb)? " + useHIGH); 
Log.i(C.TAG, "Memory Info: should use Texture Type > " + (useHIGH ? "HIGH" : "LOW")); 

如前所述上面,我會始終保持這篇文章更新,直到達到一個很好的解決方案。

2

GL_MAX_TEXTURE_SIZE是硬件支持的最大方形紋理尺寸。

  • 任何紋理的X和Y尺寸都不能超過此尺寸。

GL_MAX_TEXTURE_IMAGE_UNITS指紋理可以綁定,並在可編程管線使用的最大數目(在GLSL程序例如獨特採樣均勻名稱)(GL_MAX_TEXTURE_UNITS是在GLES 1.0固定功能類似物)。

  • 在GLES 2.0中,它的最小值爲2。

GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS指的是您可以在GLSL程序中的所有着色器中使用的紋理數量。

  • 4採樣在片段着色器+ 4個採樣在頂點着色器= 8個組合的紋理圖像單位


:OpenGL ES 2.0的不需要紋理查找支持在頂點着色器,我懷疑Samsung Note 8, Sony XPERIA U有一個不支持這個的實現,根據COMBINED和一般TMU計數之間的奇偶性來判斷。

  • 查詢GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS的值可以結束任何猜測。


爲了回答您的實際問題,雖然...這些值,你可以用它來確定使用哪個紋理包的只有一個是 GL_MAX_TEXTURE_SIZE。沒有可以查詢的OpenGL參數來確定底層硬件的內存容量/紋理填充率,這是您在選擇紋理包時真正想知道的內容。您需要通過其他方式收集這些信息,也許是一個小型基準測試或已知硬件的數據庫,或者如果您幸運的話,該平臺會有一個單獨的API,可以讓您查詢。

+0

你好安東。首先讓我感謝你的時間和信息。我有一些緊迫的最後期限,所以現在我不得不將這個「選擇紋理類型策略」擱置。我會仔細研究你所說的,並儘快繼續我的研究。我會一直保持這篇文章的更新。 – GuilhE