1

내 Game of Life가 단독으로 실행될 때 몇 가지 문제가 발생합니다. 이렇게하려면 setInterval을 설정하고 누군가가 다음을 클릭 할 때마다 트리거되는 함수를 트리거하려고합니다. 그러나 그것은 나에게 많은 문제를 일으킨다.Game of life (React.js + Redux)의 성능 문제

주된 문제점은 setInterval (() => this.handleChange(), 100)을 설정하면 게임의 움직임이 느리고 마침내 codepen에서 충돌이 발생한다는 것입니다.

class Board extends React.Component{ 

handleChange(){ [.........] //just to indicate that here is more code that is not showing and dont think it is important to the question. 

nextMovement() [...........] 

    render(){ 
    var createBoard = this.props.board.map((idx) => { 

     return <Cell 
       onClick={() => this.props.toggleAlive(idx.index)} 
       key = {idx.index} 
       index = {idx.index} 
       col = {idx.col} 
       row = {idx.row} 
       val = {idx.val}     
       /> 
    }); 

    return(

     <div className="board"> 
      {createBoard} 
     <button className="btn btn-danger" onClick={()=>this.handleChange()}>Next</button> 
     {setInterval(() => this.handleChange(), 100)} 
     </div> 
    ); 
    } 
} 


/* - - - Reducers - - - */ 

여기서 전체 코드를 보려면 내 codePen을 찾을 수 있습니다.

http://codepen.io/DiazPedroAbel/pen/bwNQAJ

나는 또한 this question on stackOverFlow보고 있었다, 누가 나와 같은 문제를 갖고있는 것 같아요,하지만 결국 그는 캔버스를 사용하기 시작 그것을 해결하기 위해.

내 게임의 성능 저하가 다음 보드를 만드는 방법 때문인지 궁금합니다. 두 개의 보드가 있습니다. 실제 보드와 새로운 보드는 모두 새로운 동작을 포함하고 있습니다. 그리고 마침내이 보드를 채울 때 액션을 트리거하는 보드를 바꿉니다. 아니면 문제는 내가 setInterval 함수로 뭔가 잘못하고 있다는 것입니다.

미리 감사드립니다. 도움을 주시면 감사하겠습니다.

+0

이유는 'this.handleChange()'가 100ms가 지나면 실행이 끝나지 않아서 시간이 지남에 따라 작업이 겹쳐 질 수 있다고 생각합니다. 나는 setInterval()을 제거하고'handleChange()'의 맨 아래에'setTimeout (this.handleChange(), 100)'을 추가하려고한다. 그래서 현재의 handleChange()가 자동으로 다음의'handleChange 실행을 마쳤습니다. –

+0

나는 또한 React (Redux없이)를 사용하여 'Game of Life'를했습니다. 다른 참조가 필요하면 https://codepen.io/jacobgoh101/pen/LRNzjg –

+1

큰 그림판에서 조금 느린 설정으로 setTimeOut을 설정하는 것이 좋습니다. 아마도 저는 보드를 업데이트하는 다른 방법, 아마도 셀 단위의 셀을 찾아야 할 것입니다. 고마워요. – coderHook

답변

0

을 추가해야합니다
shouldComponentUpdate(next) { 
    let props=this.props; 
    return props.col!==next.col || props.row !== next.row || props.val!==next. val; 
} 

~ Cell 클래스입니다. 이렇게하면 변경된 셀만 다시 렌더링됩니다.

돌아 오는이 물건을 최적화에서 일반적으로 아주 좋은입니다하지만이 작업은 설치 두 가지 문제가 있습니다 :

  • 귀하의 Cell 클래스는 connect 에드되지는. 이것은 Redux가 렌더링을 제어하는 ​​것을 도와 줄 수 없다는 것을 의미합니다. 원한다면 row/col을 소품으로 전달하지만 valmapStateToProps에 Redux에서 가져와야합니다.
  • 교체하여 보드를 업데이트합니다. 이는 변경되지 않은 새 보드의 셀이 이전 보드와 동일한 객체를 참조하는 한 작동 할 수 있습니다. Redux가 셀이 변경되었는지 확인하는 방법입니다. 따라서 이전 보드를 복사 할 때는 얕은 사본인지 확인한 다음 셀을 업데이트 할 때 이전 셀 객체를 완전히 새로운 객체로 교체하십시오. 주의 : Redux 상태에있는 객체는 수정할 수 없습니다. 그러나 복사본이기 때문에 어레이 자체를 수정할 수 있습니다. 이는 원래 셀을 수정하지 않고 셀을 대체 할 수 있음을 의미합니다. Redux의 셀에 숫자 만 포함되어 있다면 Number과 함께 의 값이이되므로 걱정할 필요가 없습니다. 즉, 동일한 값으로 Redux를 쓰면 동일한 결과가 나타납니다.Redux는 두 개의 다른 오브젝트가 너무 오래 걸리기 때문에 정확히 동일한 특성을 갖는지 확인할 수 없습니다.

위의 shouldComponentUpdate을 사용하면 이러한 작업을 수행 할 필요가 없지만 Redux Way이기 때문에 수행해야합니다. 이 변경 사항이 없다면 Redux를 잘 사용하지 않을 것입니다. 사실 거의 모든 Redux-React의 이점을 잃게됩니다.

어느 쪽이든 보드의 제한된 물약이 실제로으로 변경되는 경우 어떤 방법을 사용하든 보드를 빠르게 만들 수 있습니다 (). 보드 전체가 깜빡이면 Canvas 또는 React-Canvas과 같은 다른 기술을 사용하는 것 외에는 할 수있는 일이 없습니다. DOM이 느립니다.

+0

고맙게도 @DDS는 절대적으로 빠릅니다. 내 코드에 광고를 설정하여 셀 기능별로 셀에서 작업합니다. – coderHook

0

주소를 시도 할 수있는 2 점이 있습니다. 1) setInterval은 단계가 귀하의 간격보다 오래 실행될 수 있다면 약간 위험합니다. 당신은 브라우저를 먹을거야. 따라서 setTimeout을 사용하여 단계가 완료된 후 다음 단계를 트리거합니다.

2) 참고로 DOM 연산은 계산 실행과 비교하여 느립니다. DOM 작업을 최소화하고 기존 구성 요소를 업데이트 한 다음 요소를 다시 작성하십시오 (이전 보드를 불필요하게 삭제하면 응용 프로그램 작동 방식에 대해 잘 모르겠습니다)

관련 문제