Асинхронный рендеринг объектов в Cesium 1.7+

Всем добрый день,

Я немного работаю с Cesium и начал, когда можно было использовать Primitive Collections. У меня работал примитивный рендеринг щелчком и перетаскиванием, но теперь я хочу обновить Cesium и перейти к сущностям. Я переместил код, провел рефакторинг и могу щелкать и перетаскивать, чтобы рисовать фигуры; однако, прежде чем я смог перевернуть асинхронный флаг, и он отображался при перемещении мыши. Теперь я не могу этого сделать. Я попытался установить «allowDataSourcesToSuspendAnimation» в средстве просмотра на false, но безрезультатно. Любая помощь будет чрезвычайно признательна.

По своей наивности я забыл добавить к своему вопросу фрагмент кода. Это прослушиватель событий такта часов, который срабатывает только тогда, когда происходит нажатие мыши (логическое значение установлено в true)

var radius = Cesium.Cartesian3.distance(cartesianStartMousePosition, cartesianMousePosition);
                                if (radius > 0) {

                                    if (currentEntity && currentEntity.id) {
                                        currentEntity.position = cartesianStartMousePosition;
                                        currentEntity.ellipse = {
                                            semiMinorAxis: radius,
                                            semiMajorAxis: radius,
                                            material: new Cesium.ColorMaterialProperty(myColor)
                                        };
                                        currentEntity.label = {
                                            text: 'New Overlay',
                                            scale: 0.35
                                        };
                                        overlayEntities.resumeEvents();
                                    }
                                    else {
                                        currentEntity = new Cesium.Entity({
                                            position: cartesianStartMousePosition,
                                            ellipse: {
                                                semiMinorAxis: radius,
                                                semiMajorAxis: radius,
                                                material: new Cesium.ColorMaterialProperty(myColor)
                                            },
                                            label: {
                                                text: 'New Overlay',
                                                scale: 0.35
                                            },
                                            isSaved: false
                                        });
                                        overlayEntities.add(currentEntity);
                                    }
                                    bDrewPrim = true;
                                }

person Paul Greaney    schedule 10.03.2015    source источник
comment
Можете ли вы предоставить небольшой фрагмент кода, который показывает проблему?   -  person emackey    schedule 11.03.2015
comment
Фрагмент был добавлен к исходному вопросу. Прошу прощения, что не добавил в оригинал   -  person Paul Greaney    schedule 11.03.2015


Ответы (1)


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

var lastRadius = 0;

...

if (radius > 0 && !Cesium.Math.equalsEpsilon(radius, lastRadius, Cesium.Math.EPSILON2)) {
    lastRadius = radius;

    if (currentEntity && currentEntity.id) {
        currentEntity.ellipse.semiMinorAxis = radius;
        currentEntity.ellipse.semiMajorAxis = radius;
    } else {
        // Same as before...

Я считаю, что примитив эллипсоида строится в рабочем потоке, поэтому этот код пытается избежать установки нового radius каждого тика, если к нему не были применены реальные изменения.

Кроме того, вы не показываете обработчик нажатия мыши, но убедитесь, что вы устанавливаете этот флаг, если вы еще не установили его:

viewer.scene.screenSpaceCameraController.enableInputs = false;

Это остановит вращение земного шара, пока вы перетаскиваете эллипс. Вы можете сбросить это значение на true при поднятии мыши.

person emackey    schedule 11.03.2015
comment
Спасибо, попробую. Действия мыши по умолчанию удаляются до того, как будет выполнено рисование, так что это обрабатывается. Как вы думаете, это позволит обновлять в режиме реального времени? - person Paul Greaney; 11.03.2015
comment
Это сработало. При перемещении мыши наблюдается мерцание и небольшая задержка, но я думаю, что причиной может быть то, как обрабатываются объекты по сравнению с примитивами. Большое спасибо за ваш ответ! - person Paul Greaney; 12.03.2015