【发布时间】:2015-07-19 12:40:19
【问题描述】:
我的显示器的分辨率为 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 );
}
对于几千个正方形,它们都工作得很好。第一个版本最多可以做 100 万个方格,但是超过 100 万个的所有内容都非常缓慢。我想动态更新颜色和方块的数量。
有没有人有关于如何使用 three.js/WebGL/Canvas 提高效率的提示?
EDIT1:第二个版本:这是我一开始和滑块改变时所做的:
// 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 );
}
【问题讨论】:
-
pixijs.com 怎么样?这是一个 2D 加速框架。我认为 400 万对于今天的计算能力来说是一个非常巨大的数字......
-
第二个可以显示多少个方块?
-
只更新已更改的内容?如果每秒改变几个方块会有所帮助。对于许多填充矩形,画布会很慢。对于三种方法,您是否每帧都重新创建框?我认为即使有数百万个盒子,webgl 也应该更快。您能否分享更多代码,可以说是您的事件循环?
-
我不知道这是否会有所帮助,但无论如何它是一本好书:html5rocks.com/en/tutorials/webgl/million_letters
-
使用一个几何体并在片段着色器中完成所有工作?
标签: javascript html canvas three.js webgl