2012-11-21 4 views
0

간단한 3D 엔진으로 Android 앱을 제작하고 있습니다. 그것은 일찍 일했지만 엄청나게 엉망이었습니다. 나는 그것을 지옥에서 리팩토링했지만 3D 엔진에서는 거의하지 않았다. 이제 draw() 메서드 (translatef가 GLSurfaceView.Renderer를 구현하는 클래스 내에서 onDrawFrame 내에서 호출 됨) 내에서 translatef를 호출하면 x/z 부동 소수점 변수의 현재 값이 사용되지 않는 매우 이상한 문제가 발생합니다. 수업에 적용되는 나는 그것을 설명 할 수 없다. 그것들을 초기 값으로 리셋하는 코드가 없지만 그 일은 일어나고 있습니다. 이 변수를 만지는 유일한 시간은 클래스가 인스턴스화 된 경우 (한 번만 한 번, 다시 한 번 만진 적이없는 경우), 사용자 입력 (가능한 모든 지점에서 디버거로 정확한 것으로 확인 됨)으로 인해 변경 될 때 및 translatef가 호출 될 때입니다. 그들은 단지 읽혀진다.Android OpenGL 괴짜, 변수 재설정

사실은 항상 translatef 메서드에서 읽을 때 생성자에 전달 된 초기 값이지만 사용되거나 변경 될 때 클래스의 다른 지점에서는 정확합니다. 예를 들어 z를 z + 1로 설정하면 translatef가 읽은 값과 상관없이 해당 값으로 유지됩니다. 뭐라 구요? draw() 및/또는 translatef() 메서드가 어떻게 든 원래 값을 고수하고 수정 된 값을 읽지 않는 이유는 무엇입니까? 내 테스트 플랫폼으로 GL ES 1.0과 Android 2.2를 사용하고 있습니다.

은 여기 모든 덤프 너무 많이있다,하지만이를 통해 문제를 취득하기에 충분해야한다 : 이것은 가능성이 문제를 스레딩 관련되면서 내가 movex 및 movez 휘발성 만들 수있는 팁을 가지고

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); 
    ... 

(비록 내가 명시 적으로 여기에 어떤 쓰레드도 선언하지는 않았지만) 도움이되지 않았다.

두 값이 모두 클래스 외부에 있기 때문에 onDrawFrame 메서드의 컨트롤러에서이 값을 가져 와서이 작업을 수행 할 수 있었지만 변수를 가져오고 모든 그리기에서 추가 작업을 수행해야합니다 , 이는 값이 비싸다. 더 좋은 방법이 있어야합니다 ...

+0

실제 코드를 보여주기 바란다. 너무 애매하다. – Tim

답변

0

x 및은 private이므로 변수를 쉽게 추적 할 수 있습니다.

move 방법으로 만 설정하면됩니다. 이를 찾으려면 (일시적으로) move 방법을 삭제하거나 주석 처리하고 저장하십시오. 이클립스는 결과적으로 깨진 코드를 강조 표시합니다.

xz의 모든 변경 사항이 move 방법을 통과한다고 확신되면 거기에 중단 점을 설정하십시오. 조건부 중단 점도 설정할 수 있습니다.

중단 점에서 중지하면 이동이라는 메서드를 볼 수 있습니다.

이렇게하면 문제를 추적 할 수 있습니다.