To reduce memory usage and increase performance I recommend you consider a sparse matrix approach. Instead of having an entire array of mostly empty cells, you can just keep a list of cells that are live. As a cell changes state, you update the display for that cell and the list for the surrounding cells.
Edit: I will describe it in more detail as I have time.
To do this, create a cell object that has attributes for x, y coordinates for each live cell you want to represent:
function cell(x, y) {
this.x = x;
this.y = y;
}
Also create a grid object that is just an array of cells, and has the following methods:
grid.isLive(x,y) \\ return true if cell(x, y) is found in grid array.
grid.liveNeighbors(x,y) \\ returns number of live neighbors around any grid coordinate
To create the new grid state, test each (x,y)
coordinate of the entire grid space with grid.liveNeighbors(x,y)
and add live cells to the next grid object.
This can be further optimized by using the existing grid to eliminate large dead areas from the test. For example, you could find out the min and max x and y values and only test that region.
Or could add a boolean live
and int liveNeighbors
attribute to the cell object to keep track of the liveNeighbors
value in nearby dead
cells, then switch them live when the value is within the life threshold. This will allow you to only iterate through the grid list, not the entire grid space, providing much better performance in many cases.
Edit: I created a short, simple Python example version here, converting to JavaScript will make it a little longer.
To reduce memory usage and increase performance I recommend you consider a sparse matrix approach. Instead of having an entire array of mostly empty cells, you can just keep a list of cells that are live. As a cell changes state, you update the display for that cell and the list for the surrounding cells.
Edit: I will describe it in more detail as I have time.
To do this, create a cell object that has attributes for x, y coordinates for each live cell you want to represent:
function cell(x, y) {
this.x = x;
this.y = y;
}
Also create a grid object that is just an array of cells, and has the following methods:
grid.isLive(x,y) \\ return true if cell(x, y) is found in grid array.
grid.liveNeighbors(x,y) \\ returns number of live neighbors around any grid coordinate
To create the new grid state, test each (x,y)
coordinate of the entire grid space with grid.liveNeighbors(x,y)
and add live cells to the next grid object.
This can be further optimized by using the existing grid to eliminate large dead areas from the test. For example, you could find out the min and max x and y values and only test that region.
Or could add a boolean live
and int liveNeighbors
attribute to the cell object to keep track of the liveNeighbors
value in nearby dead
cells, then switch them live when the value is within the life threshold. This will allow you to only iterate through the grid list, not the entire grid space, providing much better performance in many cases.
Edit: I created a short, simple Python example version here, converting to JavaScript will make it a little longer.
To reduce memory usage and increase performance I recommend you consider a sparse matrix approach. Instead of having an entire array of mostly empty cells, you can just keep a list of cells that are live. As a cell changes state, you update the display for that cell and the list for the surrounding cells.
Edit: I will describe it in more detail as I have time.
To do this, create a cell object that has attributes for x, y coordinates for each live cell you want to represent:
function cell(x, y) {
this.x = x;
this.y = y;
}
Also create a grid object that is just an array of cells, and has the following methods:
grid.isLive(x,y) \\ return true if cell(x, y) is found in grid array.
grid.liveNeighbors(x,y) \\ returns number of live neighbors around any grid coordinate
To create the new grid state, test each (x,y)
coordinate of the entire grid space with grid.liveNeighbors(x,y)
and add live cells to the next grid object.
This can be further optimized by using the existing grid to eliminate large dead areas from the test. For example, you could find out the min and max x and y values and only test that region.
Or could add a boolean live
and int liveNeighbors
attribute to the cell object to keep track of the liveNeighbors
value in nearby dead
cells, then switch them live when the value is within the life threshold. This will allow you to only iterate through the grid list, not the entire grid space, providing much better performance in many cases.
Edit: I created a short, simple Python example version here, converting to JavaScript will make it a little longer.
To reduce memory usage and increase performance I recommend you consider a sparse matrix approach. Instead of having an entire array of mostly empty cells, you can just keep a list of cells that are live. As a cell changes state, you update the display for that cell and the list for the surrounding cells.
Edit: I will describe it in more detail as I have time.
To do this, create a cell object that has attributes for x, y coordinates for each live cell you want to represent:
function cell(x, y) {
this.x = x;
this.y = y;
}
Also create a grid object that is just an array of cells, and has the following methods:
grid.isLive(x,y) \\ return true if cell(x, y) is found in grid array.
grid.liveNeighbors(x,y) \\ returns number of live neighbors around any grid coordinate
To create the new grid state, test each (x,y)
coordinate of the entire grid space with grid.liveNeighbors(x,y)
and add live cells to the next grid object.
This can be further optimized by using the existing grid to eliminate large dead areas from the test. For example, you could find out the min and max x and y values and only test that region.
Or could add a boolean live
and int liveNeighbors
attribute to the cell object to keep track of the liveNeighbors
value in nearby dead
cells, then switch them live when the value is within the life threshold. This will allow you to only iterate through the grid list, not the entire grid space, providing much better performance in many cases.
Edit: I created a short, simple Python example version here here, converting to JavaScript will make it a little longer.
To reduce memory usage and increase performance I recommend you consider a sparse matrix approach. Instead of having an entire array of mostly empty cells, you can just keep a list of cells that are live. As a cell changes state, you update the display for that cell and the list for the surrounding cells.
Edit: I will describe it in more detail as I have time.
To do this, create a cell object that has attributes for x, y coordinates for each live cell you want to represent:
function cell(x, y) {
this.x = x;
this.y = y;
}
Also create a grid object that is just an array of cells, and has the following methods:
grid.isLive(x,y) \\ return true if cell(x, y) is found in grid array.
grid.liveNeighbors(x,y) \\ returns number of live neighbors around any grid coordinate
To create the new grid state, test each (x,y)
coordinate of the entire grid space with grid.liveNeighbors(x,y)
and add live cells to the next grid object.
This can be further optimized by using the existing grid to eliminate large dead areas from the test. For example, you could find out the min and max x and y values and only test that region.
Or could add a boolean live
and int liveNeighbors
attribute to the cell object to keep track of the liveNeighbors
value in nearby dead
cells, then switch them live when the value is within the life threshold. This will allow you to only iterate through the grid list, not the entire grid space, providing much better performance in many cases.
Edit: I created a short, simple Python example version here, converting to JavaScript will make it a little longer.
To reduce memory usage and increase performance I recommend you consider a sparse matrix approach. Instead of having an entire array of mostly empty cells, you can just keep a list of cells that are live. As a cell changes state, you update the display for that cell and the list for the surrounding cells.
Edit: I will describe it in more detail as I have time.
To do this, create a cell object that has attributes for x, y coordinates for each live cell you want to represent:
function cell(x, y) {
this.x = x;
this.y = y;
}
Also create a grid object that is just an array of cells, and has the following methods:
grid.isLive(x,y) \\ return true if cell(x, y) is found in grid array.
grid.liveNeighbors(x,y) \\ returns number of live neighbors around any grid coordinate
To create the new grid state, test each (x,y)
coordinate of the entire grid space with grid.liveNeighbors(x,y)
and add live cells to the next grid object.
This can be further optimized by using the existing grid to eliminate large dead areas from the test. For example, you could find out the min and max x and y values and only test that region.
Or could add a boolean live
and int liveNeighbors
attribute to the cell object to keep track of the liveNeighbors
value in nearby dead
cells, then switch them live when the value is within the life threshold. This will allow you to only iterate through the grid list, not the entire grid space, providing much better performance in many cases.
Edit: I created a short, simple Python example version here, converting to JavaScript will make it a little longer.
To reduce memory usage and increase performance I recommend you consider a sparse matrix approach. Instead of having an entire array of mostly empty cells, you can just keep a list of cells that are live. As a cell changes state, you update the display for that cell and the list for the surrounding cells.
Edit: I will describe it in more detail as I have time.
To do this, create a cell object that has attributes for x, y coordinates for each live cell you want to represent:
function cell(x, y) {
this.x = x;
this.y = y;
}
Also create a grid object that is just an array of cells, and has the following methods:
grid.isLive(x,y) \\ return true if cell(x, y) is found in grid array.
grid.liveNeighbors(x,y) \\ returns number of live neighbors around any grid coordinate
To create the new grid state, test each (x,y)
coordinate of the entire grid space with grid.liveNeighbors(x,y)
and add live cells to the next grid object.
This can be further optimized by using the existing grid to eliminate large dead areas from the test. For example, you could find out the min and max x and y values and only test that region.
Or could add a boolean live
and int liveNeighbors
attribute to the cell object to keep track of the liveNeighbors
value in nearby dead
cells, then switch them live when the value is within the life threshold. This will allow you to only iterate through the grid list, not the entire grid space, providing much better performance in many cases.
Edit: I created a short, simple Python example version here , converting to JavaScript will make it a little longer.
To reduce memory usage and increase performance I recommend you consider a sparse matrix approach. Instead of having an entire array of mostly empty cells, you can just keep a list of cells that are live. As a cell changes state, you update the display for that cell and the list for the surrounding cells.
Edit: I will describe it in more detail as I have time.
To do this, create a cell object that has attributes for x, y coordinates for each live cell you want to represent:
function cell(x, y) {
this.x = x;
this.y = y;
}
Also create a grid object that is just an array of cells, and has the following methods:
grid.isLive(x,y) \\ return true if cell(x, y) is found in grid array.
grid.liveNeighbors(x,y) \\ returns number of live neighbors around any grid coordinate
To create the new grid state, test each (x,y)
coordinate of the entire grid space with grid.liveNeighbors(x,y)
and add live cells to the next grid object.
This can be further optimized by using the existing grid to eliminate large dead areas from the test. For example, you could find out the min and max x and y values and only test that region.
Or could add a boolean live
and int liveNeighbors
attribute to the cell object to keep track of the liveNeighbors
value in nearby dead
cells, then switch them live when the value is within the life threshold. This will allow you to only iterate through the grid list, not the entire grid space, providing much better performance in many cases.
To reduce memory usage and increase performance I recommend you consider a sparse matrix approach. Instead of having an entire array of mostly empty cells, you can just keep a list of cells that are live. As a cell changes state, you update the display for that cell and the list for the surrounding cells.
Edit: I will describe it in more detail as I have time.
To do this, create a cell object that has attributes for x, y coordinates for each live cell you want to represent:
function cell(x, y) {
this.x = x;
this.y = y;
}
Also create a grid object that is just an array of cells, and has the following methods:
grid.isLive(x,y) \\ return true if cell(x, y) is found in grid array.
grid.liveNeighbors(x,y) \\ returns number of live neighbors around any grid coordinate
To create the new grid state, test each (x,y)
coordinate of the entire grid space with grid.liveNeighbors(x,y)
and add live cells to the next grid object.
This can be further optimized by using the existing grid to eliminate large dead areas from the test. For example, you could find out the min and max x and y values and only test that region.
Or could add a boolean live
and int liveNeighbors
attribute to the cell object to keep track of the liveNeighbors
value in nearby dead
cells, then switch them live when the value is within the life threshold. This will allow you to only iterate through the grid list, not the entire grid space, providing much better performance in many cases.
Edit: I created a short, simple Python example version here , converting to JavaScript will make it a little longer.