Batch render with transforms.  The shader manually constructs a transform matrix from sin/cos/scale/offset and translation.
The JS in the array construction loop is a major bottle-neck.