0

我正在用一个简单的 3D 引擎构建一个 Android 应用程序。它在早些时候工作,但非常混乱。我已经对其进行了重构,但我对 3D 引擎几乎没有做任何事情。现在我遇到了一个非常奇怪的问题,在 draw() 方法中调用 translatef(它本身是从实现 GLSurfaceView.Renderer 的类中的 onDrawFrame 中调用的)不使用 x/z 浮点变量的当前值,它们的范围是类。我无法解释。零代码可以将它们重置为初始值,但这就是正在发生的事情。唯一一次接触这些变量是当类被实例化时(完成一次,再也没有接触过),当它们由于用户输入而改变时(在每个可能的点用调试器验证是准确的),以及当 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 volatile 的提示,因为这可能与线程问题有关(尽管我没有在这里明确声明任何线程),但这并没有帮助。

由于这两个值都保存在类之外,我可以通过在 onDrawFrame 方法中从控制器中拉出它们来完成这项工作,但这需要在每次绘制时拉出变量并在它们上执行额外的操作,这是昂贵的. 一定有更好的方法...

4

1 回答 1

0

由于xzprivate变量,因此应该很容易追踪。

您只能通过您的move方法设置它们。要找出这一点,请删除或注释掉您的move方法(暂时)并保存。Eclipse 将突出显示所有现在因此而损坏的代码。

一旦您确定所有更改都已通过该方法x,请在此处设置断点。(您也可以设置条件断点)。zmove

如果你停在断点处,你可以看到哪个方法调用了move。

这应该可以让您跟踪问题。

于 2013-02-23T01:03:00.913 回答