Как я могу оптимизировать создание сетки? - PullRequest
0 голосов
/ 15 октября 2019

Я добавил функциональность, которая позволяет создавать сетки при нажатии на землю. Но почему-то, когда я иду рядом с сеткой, браузер сильно отстает. Это не происходит с сетками, которые я делаю, когда создаю сцену.

Вот как я создаю объект

scene.registerBeforeRender(function () {
            window.addEventListener("click", function (evt) {
                var pickResult = scene.pick(evt.clientX, evt.clientY, evt.clientZ);
                if (pickResult.hit) {

                    createBlock(pickResult.pickedPoint.x, pickResult.pickedPoint.y, pickResult.pickedPoint.z);

                }
            });

        });

function createBlock(x, y, z) {
        var box = BABYLON.MeshBuilder.CreateBox("box", { height: 3, width: 3, depth: 3 }, scene);
        box.position.x = x;
        box.position.y = y + 1;
        box.position.z = z;
        box.checkCollisions = true;
    }

Я полагаю, это что-то связанное ссобытие onClick, как я попробовал тот же метод для события keyPush, и он работает просто отлично

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Просто мои два цента за это -

Причина, по которой он отставал, заключается в том, что вы регистрировали прослушиватель щелчков после каждого рендеринга кадра. технически это означает, что каждую секунду регистрировалось 60 обратных вызовов. Поэтому, когда вы щелкнули через несколько секунд, сотни обратных вызовов были вызваны один за другим. Без удовольствия: -)

Ваше решение было правильным: зарегистрируйте щелчок хотя бы один раз и выполните создание ящика при нажатии.

Чтобы сэкономить немного времени, исделайте это «вавилонским способом», вместо этого вы можете сделать следующее:

scene.onPointerDown = function (evt, pickResult) {
        // if the click hits
        if (pickResult.hit) {
            // do your thing here
            createBlock(pickResult.pickedPoint);
        }
    };

function createBlock(pickedPosition) {
        var box = BABYLON.MeshBuilder.CreateBox("box", { height: 3, width: 3, depth: 3 }, scene);
        box.position.copyFrom(pickedPosition);
        box.checkCollisions = true;
    }

Таким образом, Babylon заботится о том, чтобы обрабатывать регистрацию событий для вас, так что события выбора и касания также регистрируются (а не только щелчки). ,Он также заботится об удалении слушателей событий, когда сцена удаляется.

0 голосов
/ 15 октября 2019

Я только что узнал. Я удалил

scene.registerBeforeRender(function () {

и теперь работает нормально

...