我正试图在我的游戏场景的构造函数中同时加载所有游戏数据。但它失败了,因为纹理加载仅在opengl上下文中起作用,就像从draw frame或surfacechanged调用load方法一样。但我认为在绘制框架首次调用或类似的东西时加载纹理是很难看的。那么有可能以某种方式将我的加载部分与opengl函数分开吗?
答案 0 :(得分:3)
我有完全相同的问题。 我的解决方案是使用proxy textures。这意味着当您使用内存或文件中的某些数据创建纹理时,您正在创建包含该内存数据或文件路径副本的虚拟纹理(您可以将数据预加载到内存中以加快加载速度)。
之后,下次我的渲染器调用bind()(类似于glBindTexture)时,我会检查是否有要加载的数据,如果它存在,我只需创建新纹理并加载数据。
这种方法最适合我,因为在我的情况下,纹理可以从任何线程和任何时间创建。
但是如果你想预加载所有纹理,你可以在onSurfaceCreated
或onSurfaceChanged
同样适用于缓冲区。
另一种方法是使用本机活动(检查NDK示例)。在这种情况下,您可以手动处理上下文,但它需要API级别9。
答案 1 :(得分:1)
但是我认为在绘制框架首次调用或类似的东西时加载纹理是很难的。
实际上,延迟纹理加载是最优雅的方法。它是允许在不中断加载屏幕的情况下环游世界的游戏的关键因素之一。只是不要试图立即加载整个世界,而是加载东西,一旦它们即将变得可见。使用Pixel Buffer Objects异步执行操作。