我的显示器分辨率为7680x4320像素。我想展示多达400万个不同颜色的正方形,并且我想通过滑块来改变正方形的数量。目前我有两个版本。其中一个是使用canvas-fillRect,看起来像这样:
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
for (var i = 0; i < num_squares; i ++) {
ctx.fillStyle = someColor;
ctx.fillRect(pos_x, pos_y, pos_x + square_width, pos_y + square_height);
// set pos_x and pos_y for next square
}
我使用webGL和three.js创建了一个与之前相同的循环,但为每个正方形创建了一个盒子几何体和网格:
var geometry = new THREE.BoxGeometry( width_height, width_height, 0);
for (var i = 0; i < num_squares; i ++) {
var material = new THREE.MeshLambertMaterial( { color: Math.random() * 0xffffff } );
material.emissive = new THREE.Color( Math.random(), Math.random(), Math.random() );
var object = new THREE.Mesh( geometry, material );
}
这两个版本在几千平方米以内都运行得很好。第一个版本最多可以处理一百万个平方,但超过一百万后速度就非常慢了。我想实现动态更新颜色和平方数量。
有没有人有关于如何更有效地使用three.js/WebGL/Canvas的提示?
编辑1:第二个版本:这是我在开始时和滑块变化时所做的:
// Remove all objects from scene
var obj, i;
for ( i = scene.children.length - 1; i >= 0 ; i -- ) {
obj = scene.children[ i ];
if ( obj !== camera) {
scene.remove(obj);
}
}
// Fill scene with new objects
num_squares = gui_dat.squareNum;
var window_pixel = window.innerWidth * window.innerHeight;
var pixel_per_square = window_pixel / num_squares;
var width_height = Math.floor(Math.sqrt(pixel_per_square));
var geometry = new THREE.BoxGeometry( width_height, width_height, 0);
var pos_x = width_height/2;
var pos_y = width_height/2;
for (var i = 0; i < num_squares; i ++) {
//var object = new THREE.Mesh( geometry, );
var material = new THREE.Material()( { color: Math.random() * 0xffffff } );
material.emissive = new THREE.Color( Math.random(), Math.random(), Math.random() );
var object = new THREE.Mesh( geometry, material );
object.position.x = pos_x;
object.position.y = pos_y;
pos_x += width_height;
if (pos_x > window.innerWidth) {
pos_x = width_height/2;
pos_y += width_height;
}
scene.add( object );
}
BoxGeometry
而不是PlaneGeometry
或者甚至是PlaneBufferGeometry
,有什么原因吗? - gaitat