【问题标题】:Android Graphics Memory LimitsAndroid 图形内存限制
【发布时间】:2011-05-28 14:13:54
【问题描述】:

我正在使用 opengl 和 cocos2d 端口 (http://code.google.com/p/cocos2d-android-1) 创建一个 android 游戏。我的目标是广泛的设备,并希望确保它运行良好。我只在一个 nexus 上进行测试,并希望从在较慢设备上具有经验的人那里获得一些意见。

目前游戏使用两个 1024x1024 纹理以及两个 256x256 纹理。这在大多数设备的限制范围内吗?在这些情况下,任何人都对图形内存限制有任何经验或经验吗?如果 gfx 内存超出,它会分页到普通内存吗?

【问题讨论】:

  • 1024x1024 纹理在分辨率小于此的设备上的用途是什么?我正在开发 Xbox 360/PS3 游戏,我们很少使用这种大小的纹理。
  • 1024x1024 的原因是为了存储作为纹理子区域的各种精灵的“图集”。否则效率更高,也更难负担。
  • 您的纹理缓存不会对此感到满意(尽管我承认我不知道纹理缓存在最常见的 Android GPU 内部是如何工作的)。无论如何,这就是你游戏的全部范围吗? 2*1024x1024 和 2*256x256?这应该适合大多数手机。
  • 每个精灵都将来自不同的数据(不管它是否在相同的纹理中)。如果纹理缓存只缓存一个纹理而不是 10 个纹理,那么纹理缓存会如何不快乐呢?将它们全部放在单个纹理中的主要原因是,在加载单个纹理的单个 glDrawQuads 调用中,您可以绘制多个精灵。是的,这就是我的游戏的纹理数据的范围,很高兴知道它应该适合,谢谢!
  • 纹理缓存不缓存单个纹理。它缓存页面。如果您有一个小纹理,它将能够将整个纹理放入缓存中。如果它很大,那么就没有那么多了。但是还有其他需要考虑的事情——渲染状态开关也很昂贵,所以你不想为每个绘制调用重新绑定你的纹理。这始终是一种平衡行为。看看你的游戏表现如何,如果有问题,你可以尝试不同的东西,比如纹理大小。

标签: android opengl-es cocos2d-android


【解决方案1】:

Java 应用程序是 16Mo (mdpi) 或 24Mo (hdpi)。但是 Native 不是,OpenGL Java API 只是一个 JNI 包装器。所以你可以在 GPU 上加载超过 24Mo 的纹理。我的经验是起初将 Atlas 限制在 512*512(因为 G1 在大纹理上速度很慢),但今天我使用更大的 atlas 纹理。

我们当前的游戏使用 20-50 Mo 的内存并使用 2048*2048 纹理。

【讨论】:

  • 是否存在旧设备,您的 50mo 应用有时会崩溃?
【解决方案2】:

我知道旧帖子,但现在您在 VM 中使用 android java 在内存中位图上的可用加载空间至少有 128mb。

在应用程序空间之外加载纹理 (c)。所以加载限制与手机内存相同。 (您会注意到在返回主屏幕时图标绘制的内存密集型游戏)

【讨论】:

    【解决方案3】:

    Afaik 纹理的内存限制与您的应用程序的内存限制相同,我相信在大多数情况下为 16 兆,尽管它可能是所有可用的手机内存都可以访问。

    在我遇到问题之前,我已经在我的应用程序中加载了更多的东西,至少一个 2048x2048 纹理和几个 512x512 纹理,所有 8888 都在内存中。

    我从来没有在纹理绑定上遇到过 oom 错误,只是在加载位图时,所以我希望能有所帮助。

    【讨论】:

    • 只是为了重申 EboMike 的观点。我认为 512^2 限制仍然适用,因为仍有一些旧手机仍在使用(例如 HTC Hero),它们不能很好地处理更大的纹理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 2013-01-10
    • 2017-10-07
    • 2017-02-18
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多