В архитектуре CesiumJS ключевую роль в высокопроизводительном
рендеринге играет низкоуровневый слой примитивов (Primitives API). В
этой системе GeometryInstance выступает базовой единицей
геометрических данных, предназначенной для эффективного батчинга,
переиспользования геометрии и минимизации количества
WebGL-дравколлов.
GeometryInstance представляет собой контейнер,
объединяющий:
Основная идея заключается в том, что одна и та же геометрия может быть инстанцирована множество раз с различными трансформациями и визуальными параметрами.
В CesiumJS существует три уровня абстракции:
GeometryInstance находится между геометрией и
примитивами, позволяя:
Типичная структура экземпляра:
const instance = new Cesium.GeometryInstance({
geometry: new Cesium.BoxGeometry({
vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,
maximum: new Cesium.Cartesian3(2500000.0, 2500000.0, 2500000.0),
minimum: new Cesium.Cartesian3(-2500000.0, -2500000.0, -2500000.0)
}),
modelMatrix: Cesium.Matrix4.IDENTITY,
id: "box-1",
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
Cesium.Color.RED.withAlpha(0.8)
)
}
});
Поле geometry определяет форму объекта. Используются
специализированные классы:
BoxGeometrySphereGeometryEllipseGeometryRectangleGeometryPolygonGeometryCorridorGeometryWallGeometryPolylineGeometryКаждая геометрия описывает только форму, без визуального оформления и трансформаций сцены.
Ключевое правило: Geometry отвечает за форму, GeometryInstance — за экземпляр и его поведение в сцене.
modelMatrix задаёт преобразование экземпляра в мировом
пространстве:
const modelMatrix = Cesium.Matrix4.fromTranslation(
Cesium.Cartesian3.fromDegrees(30.0, 60.0, 1000.0)
);
При использовании GeometryInstance одна и та же геометрия может быть размещена в разных точках мира без пересоздания буферов.
Одной из наиболее мощных возможностей является система атрибутов.
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
Cesium.Color.BLUE
)
}
Атрибуты позволяют задавать уникальные параметры для каждого экземпляра:
Поле id используется для:
id: {
name: "Building A",
height: 120,
type: "office"
}
При выборе объекта через scene.pick возвращается этот
идентификатор, что позволяет связать графику с бизнес-логикой.
GeometryInstance не используется самостоятельно. Он
передаётся в Primitive:
const primitive = new Cesium.Primitive({
geometryInstances: [instance],
appearance: new Cesium.PerInstanceColorAppearance({
translucent: true
}),
asynchronous: false
});
Primitive выполняет:
Основная причина использования GeometryInstance — batching.
Без инстансинга:
С GeometryInstance:
GeometryInstance отделяет форму от внешнего вида. Внешний вид
задаётся через Appearance:
PerInstanceColorAppearanceMaterialAppearanceEllipsoidSurfaceAppearancePolylineMaterialAppearanceПример:
appearance: new Cesium.PerInstanceColorAppearance({
translucent: false,
closed: true
})
Это позволяет использовать одну геометрию с разными визуальными стилями.
GeometryInstance может использоваться для классификации:
classificationType: Cesium.ClassificationType.TERRAIN
Возможные режимы:
Используется для:
При включённой поддержке picking каждый GeometryInstance может возвращаться как результат выбора:
const picked = scene.pick(windowPosition);
console.log(picked.id);
Это делает возможным:
Несколько экземпляров объединяются в один Primitive:
const instances = [
new Cesium.GeometryInstance({ ... }),
new Cesium.GeometryInstance({ ... }),
new Cesium.GeometryInstance({ ... })
];
Преимущества:
GeometryInstance влияет на:
Оптимизационные правила:
Entity API:
GeometryInstance:
Ключевое различие:
GeometryInstance используется в сценариях:
При корректной архитектуре позволяет рендерить сотни тысяч объектов без значительной потери производительности.
Несмотря на гибкость, существуют ограничения:
Эти ограничения компенсируются высокой скоростью рендеринга и предсказуемостью поведения.
GeometryInstance напрямую участвует в pipeline:
Эта цепочка делает GeometryInstance ключевым звеном между геометрическим описанием и GPU-рендерингом.