【发布时间】:2013-09-17 00:50:39
【问题描述】:
编辑,这是我使用 cmets 解决的方法 所以在尝试了不同的序列化方式并查看了我的代码之后,我终于发现渲染器中绘制的每个对象都包含 FloatBuffers。感谢 Ted Hopp,我创建了一个胶囊课程。然后我尝试使用 .array() 返回 FloatBuffers 的浮点表示,这是您无法做到的。我的猜测是因为这些是在线程上运行的。因此,使用 Learn OpenGL ES 的建议来使用 get,我改为使用了
public float[] getVertexBuffer()
{
float[] local = new float[vertexBuffer.capacity()];
vertexBuffer.get(local);
return local;
}
哪个有效并返回 float[]。
然后我将它们全部存储在我创建的每个 mGrid 对象的胶囊对象中
Encapsulate capsule = new Encapsulate(values);
for(int i = 0; i < values[0]; i++)
{
for(int j = 0; j < values[1]; j++)
{
capsule.storeVertex(i,j,mRenderer.mGrid[i*values[1] + j].getVertexBuffer());
capsule.storeColors(i,j,mRenderer.mGrid[i*values[1] + j].getmColors());
capsule.storePillar(i,j,mRenderer.mGrid[i*values[1] + j].getPillarPositions());
}
}
然后我可以最终保存它,因为它是可序列化的。谢谢大家
问题描述 所以我试图保存一个 GLSurfaceView 对象,其类表示为
class GLWorld extends GLSurfaceView implements Serializable
现在我确定我正确地保存了。
public void saveSimulation()
{
String fileName = "Test Save";
try {
FileOutputStream fos = openFileOutput(fileName, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(mGLView);
Log.d("Save","Successfully Written");
oos.close();
fos.close();
} catch (FileNotFoundException e) {
Log.d("Save","File not found exception");
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
Log.d("Save","IO exception");
// TODO Auto-generated catch block
e.printStackTrace();
}
finish();
}
但我遇到了一个错误,我不知道如何解决。我花了几个小时环顾四周,但没有找到类似的东西。
09-16 17:36:50.639: W/System.err(2996): java.io.NotSerializableException: java.nio.FloatToByteBufferAdapter
还有更多的系统错误行,我相信这源于这个错误。
我的 GLWorld 在其中创建了一个渲染器对象,该对象具有不同的对象,其中包含存储顶点和颜色数据的浮动缓冲区。我不知道该怎么做才能克服这个错误,或者为什么那些浮动缓冲区会抛出错误。除了实际尝试保存这个 GLWorld 对象之外,一切都运行得很顺利,这让我发疯了。
【问题讨论】:
-
很高兴看到它现在可以工作了。 :) 对于未来的读者: 1) FloatBuffer.array() 是可选的,因此它仅在 FloatBuffer 由 Java 数组直接支持时才有效。在这种情况下,它是使用 allocateDirect() 创建的,因此后备内存存储位于本机堆中,这就是我们需要调用 .get() 的原因。 2)在线程之间访问数据时必须小心。 GLSurfaceView.queueEvent() 可用于将调用分派给 GL 线程,以便只有 GL 线程与缓冲区发生冲突。
标签: java android serialization opengl-es-2.0