2013-01-20 2 views
1

개체를 클릭 한 경우에만 삭제되며 목록에서 제거해야합니다. 여기 코드입니다 :왜 내 FPS가 떨어지나요?

if(event.type == TouchEvent.TOUCH_DOWN){ 
      for(Bottle bottle : new ArrayList<Bottle>(bottles)){ 
       if(bottle.position.dist(touchPoint) < 40){ 
        bottles.remove(bottle); 
        if(bottle.type == Bottle.BOTTLE){ 
         score+=10; 
         Assets.playSound(Assets.beeropenSound); 
        } 
        else if (bottle.type == Bottle.BOTTLE30){ 
         score+=30; 
         Assets.playSound(Assets.beeropenSound); 
        } 
        else if (bottle.type == Bottle.GLASS_OF_BEER){ 
         score+=5; 
         Assets.playSound(Assets.pourbeerSound); 
        } 
        else if (bottle.type == Bottle.WATER_BOTTLE){ 
         score-=50; 
        } 

        // burping 
        if (score % 200 == 0 && score > 1){ 
         Assets.playSound(Assets.burpSounds[burp]); 
        } 
        break; 
       } 
      } 

, 여기에 FPS 로그입니다 :이 물건을 제거하려고

01-20 19:18:19.629: D/FPS(27501): 59 
01-20 19:18:20.639: D/FPS(27501): 59 
01-20 19:18:21.639: D/FPS(27501): 49 
01-20 19:18:22.649: D/FPS(27501): 59 
01-20 19:18:23.669: D/FPS(27501): 60 
01-20 19:18:24.669: D/FPS(27501): 59 
01-20 19:18:25.689: D/FPS(27501): 60 
01-20 19:18:26.699: D/FPS(27501): 43 
01-20 19:18:27.719: D/FPS(27501): 60 
01-20 19:18:28.739: D/FPS(27501): 60 
01-20 19:18:29.759: D/FPS(27501): 60 

하지만 그것은되지 않습니다 :

  • 제거 음향 효과
  • 제거 스트리밍 배경 음악 (3MB mp3 파일)
  • ArrayList의 사본을 제거하면 true 병 목록을 삭제하고 다른 목록에 제거해야 할 것을 추가하고 병 목록에서 해당 목록을 제거
  • Assets.burpSounds [burp] : 트랩은 임의의 java mudle을 사용하여 임의로 생성 된 로컬 변수입니다. 나는 그것을 제거했다. (burp는 생성자에있다.) 작동하지 않았다 ...

가비지 수집기가 하나 남아있다. 내 fps가 왜 떨어지나요? 어떻게 확인할 수 있습니까? 이 적과 싸우는 방법?

그리고 전에 말했듯이 이 코드 블록이 실행될 때 만 삭제됩니다.

답변

1

나는 그것이 GC라고 생각한다. 실제로 병목을 제거하는 대신 "제거 된"것을 알려주는 병 목록에 플래그를 추가하여 gc를 피한다.

편집 : 왜 모든 터치에서 새로운 arraylist를 만들고 있습니까?

+0

그러나 목록에 업데이트가 2 번 이상 추가되어야하므로! = null을 추가해야합니다. 나는 지금 다른 접근 방식을 시도하고있다 : 시간 기반 업데이트 ... – carobnodrvo

+0

병에서 객체를 제거해야하고 그것을 반복하는 동안 객체를 제거 할 수 없으므로 ... – carobnodrvo

+1

물론 가능하다. 점수 코드 –

관련 문제