2015-12-20 15 views
6

Tôi đang cố gắng xây dựng trò chơi trên thiết bị di động trong React Native, 0,17, dành cho trải nghiệm và đang gặp sự cố liên quan đến thu gom rác thải. Ngay bây giờ tôi có mười vòng tròn đang được trả lại đồng thời mà trả lại xung quanh màn hình. Tuy nhiên, mức tiêu thụ bộ nhớ cho ứng dụng đang tăng theo thời gian và tôi không biết cách giải quyết vấn đề này. Có vẻ như đây là vấn đề React Native trong các phiên bản trước và tôi chú ý rơi vào bộ nhớ theo thời gian như trong biểu đồ ở đây nhưng trong một ứng dụng lớn hơn nhiều, tôi lo ngại rằng điều này có thể là vấn đề. Có ai khác có vấn đề tương tự hoặc có giải pháp không?React Native Memory Rò rỉ Hoạt ảnh Rò rỉ Vấn đề

Mã có liên quan ở đây và mọi trợ giúp đều được đánh giá cao. Cảm ơn bạn!

var test = React.createClass ({

getInitialState: function() { 
    var circs = []; 
    for (var i = 0; i < startCount; i++) { 
     circs.push({ 
      id: i, 
      x: 0, 
      y: 0, 
      vx: 2 + Math.random() * 2, 
      vy: 2 + Math.random() * 2, 
      dx: 0, 
      dy: 0, 
      cOb: new Animated.ValueXY({x: 0, y: 0}), 
     }); 
    } 

    return { 
     circles: circs, 
     stop: 1 
    }; 
}, 
stopCircle: function() { 
    this.state.stop = -1 * this.state.stop; 
    this.setState(this.state); 
}, 
componentDidMount: function() { 
    this.animateCircles(); 
}, 
animateCircles: function() { 
    this.triggerAnimation(this.animateCircles); 
}, 
triggerAnimation: function(ani) { 
    for (var i = 0; i < this.state.circles.length; i++) { 
      var cCircle = this.state.circles[i]; 
      if (cCircle.x * cCircle.x + cCircle.y * cCircle.y > DIST_TO_EDGE * DIST_TO_EDGE) { 
       var prevX = cCircle.x - cCircle.vx; 
       var prevY = cCircle.y - cCircle.vy; 
       var exitX = (1.5 * prevX + .5 * cCircle.x)/2; 
       var exitY = (1.5 * prevY + .5 * cCircle.y)/2; 
       cCircle.x = prevX; 
       cCircle.y = prevY; 

       var exitRad = Math.sqrt(exitX * exitX + exitY * exitY); 
       exitX = exitX * DIST_TO_EDGE/exitRad; 
       exitY = exitY * DIST_TO_EDGE/exitRad; 

       var twiceProjFactor = 2 * (exitX * cCircle.vx + exitY * cCircle.vy)/(DIST_TO_EDGE * DIST_TO_EDGE); 
       cCircle.vx = cCircle.vx - twiceProjFactor * exitX; 
       cCircle.vy = cCircle.vy - twiceProjFactor * exitY; 
       break; 
      } 
    } 
    if (this.state.stop == 1) { 
     for (var k = 0; k < this.state.circles.length; k++) { 
      this.state.circles[k].x += this.state.circles[k].vx; 
      this.state.circles[k].y += this.state.circles[k].vy; 
     } 
    } 
    this.setState(this.state); 
    var animateC = []; 
    for (var i = 0; i < this.state.circles.length; i++) { 
     var currCirc = this.state.circles[i]; 
     animateC.push(
      Animated.timing(currCirc.cOb, { 
       ...TIMING_CONFIG, 
       toValue: {x: currCirc.x, y: currCirc.y} 
     })); 
    } 
    Animated.parallel(
     animateC 
    ).start(ani); 
}, 
getStyle: function(which) { 
    return [ 
     styles.circle, 
     {transform: this.state.circles[which].cOb.getTranslateTransform()} 
    ]; 
}, 
render: function() { 
    return (
     <View style={styles.container}> 
      <View style={styles.edge}> 
      </View> 
      { 
       this.state.circles.map(function(c, i) { 
        return (
         <TouchableWithoutFeedback key={i} onPress={this.stopCircle}> 
          <Animated.View style={this.getStyle(i)} /> 
         </TouchableWithoutFeedback> 
        ); 
       }, this) 
      } 
     </View> 
    ); 
}, 

Việc áp dụng đầy đủ có thể được tìm thấy tại https://github.com/heliumsoule/React-Native-Pool nếu bạn muốn chạy các ứng dụng cho chính mình.

Cảm ơn bạn một lần nữa.

+0

this.setState (this.state); Cái đó làm cái gì? Tôi chưa bao giờ gặp điều đó trước đây. – Hasen

Trả lời

0

Bạn Tôi đã có rất nhiều biến tạm thời, cả số đơn giản lẫn đối tượng. Tôi không hoàn toàn chắc chắn nếu điều này kết thúc thường xuyên bị truy cập hoặc nếu hoạt ảnh có nhiều khung hình. Nếu đó là mỗi khung hình, tôi đoán bạn chỉ đang thực hiện tấn phân bổ. e dựng lên theo thời gian, và gây ra ít tạm dừng khi bộ thu gom rác được kích hoạt.

Để giảm số lượng phân bổ, bạn có thể chuyển đổi các biến tạm thời thành các biến mẫu, có thể được sử dụng lại.

Tôi không đủ với các API hoạt hình quen thuộc để biết nếu có bất kỳ tối ưu hóa có ..

+0

James, tôi đã thử đề xuất của bạn và tạo các biến mẫu thay vì tái phân bổ các biến nhưng việc sử dụng bộ nhớ vẫn tăng (mặc dù dần dần). – user1844067

+0

Rất vui được giúp một chút. Hãy nhớ rằng miễn là bạn đang làm phân bổ, bạn sẽ mong đợi bộ nhớ từ từ leo lên trước khi được giải phóng. Đó chỉ là cách các máy ảo JS hiện đại hoạt động. Có thể đã đến lúc làm quen với việc gỡ lỗi bộ nhớ. Khi ứng dụng của bạn đang chạy, hãy chụp một vài ảnh chụp nhanh. Bạn có thể so sánh chúng để xem những gì đang phát triển việc sử dụng. – James

0

Bạn có hai máy ảo rằng cả hai thực hiện thu gom rác thải trên các điều khoản riêng của họ. JVM và JavaScript.

Bài viết này có thể giúp bạn ra ngoài:

http://moduscreate.com/dynamic-memory-and-v8-with-javascript/

Ngoài ra, tôi đề nghị bạn nhận xét ra càng nhiều mã như bạn có thể và thấy hiệu ứng về bộ nhớ. Sau đó, bình luận từng chút một và xem mã nào làm cho mức tiêu thụ bộ nhớ của bạn phát triển nhanh nhất.

+0

Michael, cảm ơn bài viết của bạn. Tôi không biết liệu có hai máy ảo hay không vì JavaScript đang được hiển thị ở đây trong khung công tác React Native. Tôi biết rằng tiêu thụ bộ nhớ chính là với phương thức triggerAnimation được gọi là mỗi TIMING_CONFIG, mà chỉ định thời gian giữa các cuộc gọi. Tuy nhiên, tôi không biết làm thế nào để tiếp tục tối ưu hóa mã sau khi đề xuất của James. – user1844067

+0

Tôi không phải là chuyên gia về Android, nhưng khung công tác React Native là Java và công cụ JS được sử dụng để thực thi mã React Native là V8. Ứng dụng của bạn đang gọi Java từ JavaScript và ngược lại. Điều gì sẽ xảy ra nếu bạn để chương trình chạy trong một thời gian rất dài?Cả Java và V8 có thể trì hoãn một số bộ sưu tập rác của họ cho đến khi thiết bị ở mức thấp trên bộ nhớ hoặc quá trình đang sử dụng giới hạn của nó. –