我正在使用简单的3D引擎构建Android应用。它工作得更早,但非常混乱。我已经重构了它,但我对3D引擎没什么作用。现在我遇到一个非常奇怪的问题,在draw()方法中调用translatef(它本身是从实现GLSurfaceView.Renderer的类中的onDrawFrame中调用的)不使用x / z float的当前值变量,其范围限定在类中。我无法解释。零代码会将它们重置为初始值,但这就是正在发生的事情。触摸这些变量的唯一时间是当类被实例化(完成一次,从未再次触摸),当它们由于用户输入而变化时(在每个可能的位置使用调试器验证为准确),并且当调用translatef时,他们只是阅读。
问题是,它们始终是在通过translatef方法读取时传递给构造函数的初始值,但在使用或更改它们时,它们在类中的任何其他位置都是准确的。例如,如果我们将z设置为z + 1,则无论translatef读取的值如何,它都保持该值。是什么赋予了?我不知道为什么draw()和/或translatef()方法以某种方式坚持原始值而不是读取修改后的值。我使用GL ES 1.0和Android 2.2作为我的测试平台。
在这里抛弃所有内容太多了,但这应该足以解决问题:
private float movex, movez;
public GLEngine(){
//The values are set in the constructor and are accurate at this point.
movex = Controller.getX();
movey = Controller.getZ();
}
public void move(float x, float z){
//Again, debugging in here shows that the values are being set properly.
movex = x;
movez = z;
}
public void onDrawFrame(GL10 gl){
//Debugging anywhere within this method shows only the values for movex and
//movez that were set in the constructor.
...
gl.translatef(movex, .5f, movez);
...
我得到了一个提示,使movex和movez易变,因为这可能与线程问题有关(虽然我没有在这里明确声明任何线程),但这没有帮助。
由于这两个值都保存在类外,我可以通过在onDrawFrame方法中从控制器中提取它来完成这项工作,但是这需要拉取变量并在每次绘制时对它们执行其他操作,这是昂贵的。必须有一个更好的方法...
答案 0 :(得分:0)
由于x
和z
是private
个变量,因此应该很容易找到它。
您只能通过move
方法设置它们。要找到这个,请删除或注释掉move
方法(暂时)并进行保存。 Eclipse将突出显示现在因此而被破坏的任何代码。
一旦确定x
和z
的所有更改都通过move
方法,请在那里设置断点。 (您也可以设置条件断点)。
如果停在断点处,可以看到哪个方法称为移动。
这可以让您跟踪问题。