में बैच कॉल करने का सबसे तेज़ तरीका मैं अपने 2 डी गेम इंजन के लिए अपने कैनवास-आधारित प्रतिपादन को फिर से लिखने की कोशिश कर रहा हूं। मैंने अच्छी प्रगति की है और वेबलॉग संदर्भ ठीक करने के लिए बनावट प्रस्तुत कर सकते हैं, स्केलिंग, रोटेशन और ब्लेंडिंग के साथ पूरा करें। लेकिन मेरा प्रदर्शन बेकार है। मेरे टेस्ट लैपटॉप पर, मैं एक बार में स्क्रीन पर 1,000 इकाइयों के साथ वेनिला 2 डी कैनवास में 30 एफपीएस प्राप्त कर सकता हूं; वेबजीएल में, मुझे स्क्रीन पर 500 इकाइयों के साथ 30 एफपीएस मिलते हैं। मैं स्थिति को विपरीत होने की उम्मीद करता हूं!वेबजीएल
मुझे एक झुकाव संदेह है कि अपराधी यह सब Float32Array
बफर कचरा है जो मैं चारों ओर फेंक रहा हूं। यहां मेरे साधारण परीक्षण shaders (इन सम्मिश्रण याद कर रहे हैं, & रोटेशन स्केलिंग) है
// boilerplate code and obj coordinates
// grab gl context
var canvas = sys.canvas;
var gl = sys.webgl;
var program = sys.glProgram;
// width and height
var scale = sys.scale;
var tileWidthScaled = Math.floor(tileWidth * scale);
var tileHeightScaled = Math.floor(tileHeight * scale);
var normalizedWidth = tileWidthScaled/this.width;
var normalizedHeight = tileHeightScaled/this.height;
var worldX = targetX * scale;
var worldY = targetY * scale;
this.bindGLBuffer(gl, this.vertexBuffer, sys.glWorldLocation);
this.bufferGLRectangle(gl, worldX, worldY, tileWidthScaled, tileHeightScaled);
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, this.texture);
var frameX = (Math.floor(tile * tileWidth) % this.width) * scale;
var frameY = (Math.floor(tile * tileWidth/this.width) * tileHeight) * scale;
// fragment (texture) shader
this.bindGLBuffer(gl, this.textureBuffer, sys.glTextureLocation);
this.bufferGLRectangle(gl, frameX, frameY, normalizedWidth, normalizedHeight);
gl.drawArrays(gl.TRIANGLES, 0, 6);
bufferGLRectangle: function (gl, x, y, width, height) {
var left = x;
var right = left + width;
var top = y;
var bottom = top + height;
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
left, top,
right, top,
left, bottom,
left, bottom,
right, top,
right, bottom
]), gl.STATIC_DRAW);
},
bindGLBuffer: function (gl, buffer, location) {
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.vertexAttribPointer(location, 2, gl.FLOAT, false, 0, 0);
},
और::
// fragment (texture) shader
precision mediump float;
uniform sampler2D image;
varying vec2 texturePosition;
void main() {
gl_FragColor = texture2D(image, texturePosition);
}
// vertex shader
attribute vec2 worldPosition;
attribute vec2 vertexPosition;
uniform vec2 canvasResolution;
varying vec2 texturePosition;
void main() {
vec2 zeroToOne = worldPosition/canvasResolution;
vec2 zeroToTwo = zeroToOne * 2.0;
vec2 clipSpace = zeroToTwo - 1.0;
gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);
texturePosition = vertexPosition;
}
कैसे बेहतर प्रदर्शन प्राप्त करने के बारे में कोई भी विचार यहाँ मेरी प्रस्तुत करना कोड है? क्या मेरे drawArrays बैच करने का कोई तरीका है? क्या बफर कचरे पर कटौती करने का कोई तरीका है?
धन्यवाद!
अधिक आंतों को आकर्षित करने के लिए मेरा सुझाव है कि आप अपने प्रश्न का शीर्षक दें "वेबजीएल पर ड्रैए आरेज़ को बैच करने का सबसे तेज़ तरीका" –
@Mikko हो गया। धन्यवाद! –
@AbrahamWalters: क्या आप प्रत्येक फ्रेम के लिए प्रत्येक इकाई के लिए सटीक रेंडर कोड चला रहे हैं? (उर्फ 500 * 30 = प्रति सेकंड 1500 बार) यदि ऐसा है, तो मुझे लगता है कि टैब/ब्राउज़र एक घंटे के भीतर मेमोरी से बाहर हो जाएगा (यदि दस मिनट नहीं है) यदि आप इसे बस बैठते हैं। –