我有一个纹理密集的 OpenGL 游戏,我想根据设备的 RAM 大小对其进行调整。最高分辨率的纹理我在 iPhone 4 或 iPad2 上运行良好,但早期的设备在加载纹理的过程中崩溃。我有这些纹理的低分辨率版本,但我需要知道何时使用它们。
我目前的策略是检测特定的旧设备(3GS 有一个低分辨率屏幕;iPad 没有摄像头),然后只为 iPad2 及更高版本和 iPhone 4 及更高版本加载高分辨率纹理——我想我需要为 iPod touch 做点什么。但我更愿意使用特征检测而不是硬编码设备模型,因为模型检测对于未来对 API 和硬件的更改是脆弱的。
我正在考虑的另一种可能性是首先加载高分辨率纹理,然后在我收到低内存警告的那一刻放下并用低分辨率替换它们。但是,我不确定我是否有机会做出回应;我注意到该应用程序通常在调试控制台上出现任何通知之前就死机了。
如何检测我正在运行的设备是否没有足够的 RAM 来加载我的纹理的高分辨率版本?
退后一步,我可以使用其他一些特定于 OpenGL 纹理内存的自适应技术吗?
笔记:
我已经在 SO 上搜索了与可用 RAM 检测相关的答案,但它们基本上都建议分析内存使用情况并消除浪费(最大限度地减少临时人员的生命周期,以及所有这些废话)。我已经尽我所能做到了,而且我无法将高分辨率纹理压缩到旧设备中。
PVRTC 不是一种选择。纹理包含片段着色器使用的数据,并且必须以无损格式存储。