安卓图形内存限制

5
我正在使用OpenGL和cocos2d移植版(http://code.google.com/p/cocos2d-android-1)创建一个Android游戏。我希望针对广泛的设备进行测试,并确保其性能良好。目前,我只在Nexus One上进行测试,希望从有经验的较慢设备用户那里获得一些反馈。
目前,游戏使用两个1024x1024的纹理以及两个256x256的纹理。这是否在大多数设备的限制范围内?任何人有关于这种情况下图形内存限制的经验或经验法则吗?如果图形内存超出限制,它会分页到正常内存吗?

1024x1024的原因是为了存储杂项精灵的“图集”,这些精灵是纹理的子矩形。否则,这将更加低效和难以承受。 - ghempton
你的纹理缓存对此可能不太满意(尽管我承认我不知道在大多数常见的Android GPU上纹理缓存的内部工作方式)。无论如何,这就是你的整个游戏吗?21024x1024和2256x256?这应该适用于大多数手机。 - EboMike
2
一个纹理缓存不会缓存单个纹理。它会缓存页面。如果你有一个小的纹理,它可以将整个纹理放入缓存中。如果它很大,那么就不能这样做了。但还有其他要考虑的事情——渲染状态切换也很昂贵,所以你不想为每个绘制调用重新绑定纹理。这总是一个平衡行为。看看你的游戏表现如何,如果情况不佳,你可以尝试不同的东西,比如纹理大小。 - EboMike
@EboMike 刚刚发现了重新绑定纹理的注意事项。在我的新型2.2手机上,我可以相当频繁地重新绑定纹理(游戏保持在50帧每秒),但在我的旧型2.1手机上,仅重新绑定一次就会使fps从20降至5。哎呀! - Nick Bolton
@EboMike 另外,关于分页。我似乎也误用了纹理缓存;我注意到当我加载任何>512^2的东西时,我的旧2.1手机性能急剧下降(但在我的新2.2手机上保持不变)。起初,我认为与Gordon相同;“更大的纹理=更好的内存使用”——不是真的!它反过来工作。继续我的最后一条评论;似乎重新绑定大型纹理很糟糕,但重新绑定小型纹理并不那么糟糕。 - Nick Bolton
显示剩余2条评论
3个回答

11

Java应用程序的大小为16Mo(mdpi)或24Mo(hdpi)。但本地应用程序不是这样的,OpenGL Java API只是JNI包装器。因此,您可以在GPU上加载超过24Mo的纹理。我的经验是首先将图集限制在512*512(因为对于大纹理G1很慢),但今天我使用更大的图集纹理。

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


你的应用程序在旧设备上是否会崩溃?特别是那些只有50MB存储空间的遗留设备。 - manmal

1

虽然这是一个旧帖子,但现在在使用Android Java时,至少需要128MB的虚拟机内存空间,以便在内存中加载位图。

对于纹理来说,它们是在应用程序空间之外加载的(c)。因此,加载限制与手机内存相同。(在内存密集型游戏中,当返回主屏幕时,你会注意到图标绘制的情况)


0

据我所知,纹理的内存限制与您的应用程序的内存限制相同,在大多数情况下为16兆字节,尽管可能是所有可用电话内存可访问。

我曾经在我的应用程序中载入了比这个多得多的内容,至少有一个2048x2048的纹理和几个512x512的纹理,全部都是8888内存。

我从未在纹理绑定时遇到过oom错误,只有在加载位图时才会出现,希望这可以帮助到您。


再次强调EboMike的观点。我认为512^2的限制仍然适用,因为仍有一些旧手机(例如HTC Hero)仍在使用,无法很好地处理更大的纹理。 - Nick Bolton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接