爲了用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