当我的生命游戏独立运行时,我遇到了一些问题。为此,我尝试设置一个setInterval并触发每次有人点击Next时触发的功能。但它给我带来了很多问题。
主要问题是,当我设置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 :(得分:0)
您可以尝试解决以下两点: 1)setInterval使用起来有点危险,如果你的步骤可能比你的间隔长一些。你将浏览器。因此,在完成步骤后,使用setTimeout触发下一步。
2)作为旁注,与运行计算相比,DOM操作很慢。尝试最小化DOM操作并更新现有组件,然后重新创建元素(但是,我不确定您的应用程序在这方面如何工作,如果它完全丢弃前一个板)
答案 1 :(得分:0)
要解决您的问题,您应该添加
shouldComponentUpdate(next) {
let props=this.props;
return props.col!==next.col || props.row !== next.row || props.val!==next. val;
}
到你的Cell
课程。这将确保只有更改的单元格才会被重新渲染。
Redux通常非常擅长优化这些东西,但是你的设置存在两个问题:
Cell
课程并非connect
。这意味着Redux无法帮助控制其渲染。如果你想要,然后将row
/ col
作为道具传递,但让它从val
中的Redux获得mapStateToProps
。Number
的值是的标识。这意味着如果你写相同的值,Redux会看到它是相同的。 Redux无法检查两个不同的对象是否具有完全相同的属性,因为它需要太长时间。 使用上面的shouldComponentUpdate
使得没有必要做这些事情,但你应该这样做,因为它是Redux Way。如果没有这些更改,您就不能很好地使用Redux。事实上,你几乎失去了所有Redux-React的好处。
无论哪种方式都会使你的电路板快速,但只要电路板的有限部分实际发生变化。如果整个电路板闪烁,那么除了使用其他技术(例如Canvas
或React-Canvas
)之外,您无能为力。 DOM很慢。