我的显示器的分辨率为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的效率?
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 );

            }

最佳答案

到目前为止,我看到的最多的个人积分是potree。

http://potree.org/https://github.com/potree

尝试一些演示,我能够以20-30fps的速度在3D中观察到500万个点。我相信这也是当前的技术极限。

我没有自己测试potree,所以我不能对这项技术说太多。但是有数据转换器和查看器(基于3js),因此应该只弄清楚如何转换数据。

简要介绍您的问题

处理大数据的最佳方法是将它们分为四叉树(2d)或八叉树(3d)。这将使您不必为程序距离相机太远或根本看不见的部分打扰。

另一方面,当您进行过多的webgl调用时,程序不喜欢。尝试这样理解它,您想每秒创建约60张图像。但是,每次为GPU设置一些参数时,程序都必须进行一些同步。拆分数据意味着您将需要进行更多的设置,所以树的位置一定不要太小。

最后一件事,有人说:



我不建议这样做,坏主意。纹理查找非常快,但是属性总是更快。如果我们谈论的是4M点,则您负担不起从制服中读取数据的能力。

抱歉,我无法为您提供代码,没有Threejs,我可以做到,我不是Threejs专家:)

10-07 17:58