为了用WebGL渲染许多精灵,我想我会问一些关于性能的问题。预先计算CPU上的顶点
让我们来看看这个:
for(let i = 0; i < 50000; i++){
let t = new Sprite();
t.scale(Math.random())
t.rotate(Math.random())
t.transform(Math.random(),Math.random())
随着scale
,rotate
和transform
translate(x, y) {
for (let i = 0; i < this.vertexData.length; i += 3) {
this.vertexData[i] += x;
this.vertexData[i + 1] += y;
}
}
rotate(alpha) {
this.translate(-this.position[0], -this.position[1]);
for (let i = 0; i < this.vertexData.length; i += 3) {
let new_x = this.vertexData[i] * Math.cos(alpha) - this.vertexData[i + 1] * Math.sin(alpha);
let new_y = this.vertexData[i + 1] * Math.cos(alpha) + this.vertexData[i] * Math.sin(alpha);
this.vertexData[i] = new_x;
this.vertexData[i + 1] = new_y;
}
this.translate(this.position[0], this.position[1]);
}
scale(factor) {
this.translate(-this.position[0], -this.position[1]);
for (let i = 0; i < this.vertexData.length; i += 3) {
this.vertexData[i] *= factor;
this.vertexData[i + 1] *= factor;
}
this.translate(this.position[0], this.position[1])
}
而且this.vertexData=[-1, -1, 0, 1, -1, 0, -1, 1, 0, -1, 1, 0, 1, -1, 0, 1, 1, 0];
什么是我的可能性,使功能scale
,rotate
及以下功能transform
更快?要么依赖于语言,要么数学。
谢谢您的回答,你闯民宅的问题实际上是我的问题!这个概念对我有很大的帮助,但很难找到合适的oop架构:) – greedsin
但是这给我留下了一个问题。我将如何更新特定的精灵。我需要全局顶点数据中的精灵顶点数据的偏移量吗? – greedsin
上述两个例子都处理这种情况。一个例子使用'ArrayBufferViews',这样每个精灵都可以查看更大的数组。另一个只使用偏移量。正如它在答案中所说,我怀疑偏移版本更快。这两种解决方案都是oop。 – gman