この記事は現在英語版のみです。

(記事)

GLB Optimization, Before and After: Download Size vs GPU Memory in Real Projects

Separate download size from memory first, because the two often move in opposite directions: the encoding with the smallest download can decode to nearly twice the GPU geometry.

Polish Design engineering team・2026-10-27

Contents

When a GLB file is too large and a phone cannot run the scene, the vendor asked to optimize it will report a figure for how much was saved. That figure might be file size, download size, or memory after loading. These are three different measurements, and the figures often move in opposite directions.

Below are before-and-after figures from the LIDROP 3D configurator and the 3D city on the Chyihaur home page. Each row states what was measured, how it was measured, and its scope. The LIDROP project as a whole is covered in Building a 3D Configurator for a Folding Bike.

A team member pushes the needle of a large gauge

Two caveats. Unless noted, every figure was measured on a desktop machine (M1 Pro) and does not translate directly to phones. LIDROP has two measurement scopes, the download size of the 7 first-screen GLB files and the download size of the whole first screen, and the two cannot be added together or compared side by side.

The smallest download is not the smallest memory

The LIDROP first screen loads 7 GLB files. The team re-compressed the modeler's original files three ways: meshopt, qdraco (in this project, quantized Draco), and plain Draco. Plain Draco had the smallest download at 16.31MB, followed by qdraco at 21.18MB and meshopt at 26.32MB.

After decoding, the order reverses. The geometry that goes into the GPU is 52.18MB for meshopt, about 52MB for qdraco, and 96.86MB for plain Draco, about 1.86 times either of the other two. Plain Draco decodes vertex positions to Float32, while the other two use Int16. When phone memory is tight, decoded size matters more than download size, so the team did not choose plain Draco. It settled on qdraco: a download 19.5% smaller than meshopt, with no increase in GPU geometry.

Fig. 1The encoding with the smallest download has the largest decoded GPU geometry
Download sizeDecoded GPU geometry
  • 26.32MB
    meshopt
    52.18MB
  • 21.18MB
    qdracoChosen
    about 52MB
  • 16.31MB
    plain Draco
    96.86MB

LIDROP first-screen 7 GLB files. GPU geometry is estimated from the GLB contents and excludes textures.

This GPU geometry figure covers only the geometry of those 7 first-screen files. It excludes textures and is estimated by parsing the GLB contents. All three encodings were re-compressed from the modeler's original files, which is what makes the comparison hold up.

Before and after, row by row

Each Before and After pair is measured the same way, so figures should not be added across rows. The How measured column notes the method and scope of each row.

SubjectMetricBeforeAfterHow measured
LIDROP, 7 first-screen GLB filesDownload sizemeshopt 26.32MBqdraco 21.18MB (19.5% smaller)All three encodings re-compressed from the original files. Plain Draco is 16.31MB
Same as aboveGPU geometry (after decoding, excluding textures)meshopt 52.18MBqdraco about 52MB; plain Draco 96.86MBEstimated by parsing GLB contents
LIDROP H6, whole pageFirst-screen download size36.5MB32.5MBMeasured after the build by reading resource-load records in a headless browser and grouping the records by file extension (GLB is about 80%). Changes: shrink the placeholder color images that get replaced, lower the resolution of one texture, and defer loading one data file
Chyihaur home page 3D cityGPU texture memory: 8 textures reduced from 4096 x 4096 to 2048 x 2048 (WebP quality 80)about 681MBabout 170MBCalculated with the formula textures x edge² x 4 bytes x 4/3 (mipmap)
Same as aboveTexture download size3.38MB2.84MBTexture file size
Same as aboveGPU memory: after switching to KTX2 (ETC1S, with mipmaps)about 170MBabout 30MBEstimated; these textures are already in the production release. The two steps combined go from about 681MB to about 30MB
Fig. 2Two steps take GPU texture memory from about 681MB to about 30MB
  1. 8 textures at 4096 x 4096about 681MB
  2. Reduced to 2048 x 2048about 170MB
  3. Then switched to KTX2about 30MB

GPU texture memory of the 3D city on the Chyihaur home page. Figures are estimates, and these textures are already in the production release.

The 3D city on the Chyihaur home page (recorded from the live site): the camera pushes in on the Ferris wheel, hotspots stand between the city blocks, and a click opens the linked page. The Chyihaur rows in the tables measure this scene's textures.

Second table: a building model

This table comes from the property-viewing website co-developed with Mxm. The original modeling file has about 34 million vertices, 49 million faces, and 19,000 objects, with no lights or cameras.

SubjectMetricBeforeAfterHow measured
A building modelTower shell face count (shape-preserving reduction)about 2,400,000 facesabout 700,000 facesCounted by script; vertices welded first (1.5mm), then dissolved by angle (threshold 0.75° to 2.5°)
Same as aboveInterior panoramasabout 60 images at 6000 x 3000, about 300MB original4096 x 2048 WebP plus a 512 x 256 base image, about 15MB totalTotal file size
Same as aboveAbout 800 plantsabout 3GB in the original render file formatabout 50KB of inputFile size; the plant models are not loaded, and instances are generated on the fly from marker points

Two scopes of download size cannot be compared side by side

  • Download size of the 7 first-screen LIDROP GLB files: 26.32MB to 21.18MB.
  • First-screen download size of the whole LIDROP page: 36.5MB to 32.5MB, with GLB at about 80%.

The two differ in both scope and method. The first counts only the files of the 7 GLBs, while the second covers every resource loaded on the first screen of the page, of which GLB is only a part. The two figures cannot be added together or compared side by side.

The LIDROP configurator as it runs (Japanese version): the H6 in dimension view.
The LIDROP configurator as it runs (Japanese version): the H6 in dimension view.

Compression and measurement practices

Compare from the original files

To compare encodings, re-compress each one from the modeler's original files. Compressing an already compressed file again, or converting between two encodings, stacks quantization, and the resulting numbers say nothing about the encoding itself.

An engineer measures a large block with a tape

List manual fixes before re-compressing

Manually fixed material settings, such as switching a material from blend to mask or deciding which materials are double-sided, get overwritten with defaults when a file is re-compressed from the original. List the manual fixes before re-compressing, then check each fix one by one afterward.

Wait for the scene to load, and measure both the tab and the GPU process

While loading, the canvas is smaller and the numbers read low. Confirm the scene has finished loading before measuring (canvas width equals window width times pixel ratio). The tab memory figure in Chrome also leaves out the GPU process, so measure both.

Measure on a real GPU

Headless browsers default to software rendering, which fully expands KTX2 compressed textures and inflates the memory numbers. Measure memory on a real GPU.

Confirm pixels are the bottleneck before lowering the pixel ratio

Temporarily lowering the pixel ratio during interaction sounds reasonable, but it helps only when the scene is bound by pixel count. Measure whether the bottleneck is pixels, draw calls, or triangle count before deciding to change anything. If pixels are not the bottleneck, switching back and forth is itself an extra cost.

Fig. 3Lowering the pixel ratio helps only when pixels are the bottleneck
  1. Consider lowering itTemporarily, during interaction
  2. Measure the bottleneckPixels, draw calls, triangles
  • Pixels are the limit
    Lower itLowering helps
  • Pixels are not
    Leave itSwitching is an extra cost

The scope of these figures

The GPU figures in the tables are estimates, and desktop figures cannot be converted directly to phone figures. Memory on real phones has to be measured separately on the target models.

The tables list no fps, because frame rate depends on the device, browser, resolution, and scene, and a figure from a single desktop machine cannot represent real user experience. A headless browser by default manages only 1 to 3 frames per second, and the animation loop also freezes when a browser tab is hidden. If a vendor quotes a percentage improvement in frame rate, have the vendor state the device, browser, resolution, and scene.

How optimized models become a path buyers can finish is covered in the path of a 3D property showroom.

When compression is not the answer

In these cases, do not spend money compressing the model yet:

  • The model is already light, or most of the file is texture. Geometry encoding changes only geometry, so for parts dominated by textures, switching geometry encoding makes no difference.
  • The problem is in the scene's draw calls or the code. When the bottleneck is there, neither a lower pixel ratio nor an even smaller model file will fix it.
  • The client requires every detail preserved, such as high-precision surface textures. A high-compression texture format (ETC1S) can introduce color shifts, and textures that need accurate color can use UASTC instead, which has higher quality and larger files. When every detail is required, there is little room to compress, so agree on an acceptable color shift first.

Confirm these points before trusting a vendor's figures

Other points to check when choosing a vendor are covered in Evaluating a Software Vendor: A Scorecard and Pre-Contract Checklist. For vendor figures like these, confirm the following first:

  1. Confirm whether the figure is file size, download size, or memory after loading.
  2. Ask the vendor to state the scope: a single file, the first screen, or the whole page.
  3. Confirm the device the figure was measured on (desktop, real phone, or emulator) and whether the GPU process was measured.
  4. Ask the vendor to state whether the comparison starts from the original files or from already compressed files, and whether image quality and manual fixes were checked.
  5. If a frame rate is given, ask the vendor to list the device, browser, resolution, and scene.

To find out whether a GLB is worth compressing, or to check how an optimization report was measured, send the team the file, the target device, and where things are stuck. 3D web development starts with measurement and then decides whether to change anything.

(お問い合わせ)

Start a project.

三つのステップで、判断に足る進め方と予算帯が得られます。

  1. 01最初の打ち合わせを予約:時間を選びます。完全な仕様は不要です。
  2. 02オンライン相談(15〜30分):進め方の方向性、予算帯、スケジュール案を提示。
  3. 03素材を確認したうえで、約3〜5営業日で見積書兼納品仕様明細書を提出します。
メール
hello@polish-design.com.tw
郵送先住所
(104) 台湾 台北市 中山区 植福路191-1号 3F

最初の打ち合わせを予約

平日 16:00〜18:00オンライン30分

先に時間帯を選び、Google アカウントまたはメールアドレスで確認します。予約が確定するとカレンダーに追加できます。

時間を選ぶ

または、先に内容を送信

まだ時間を決めていない場合は、先にプロジェクトの内容をお送りください。担当者がメールで返信します。送信後に続けて予約することもできます。

補足情報(任意):サービス項目、現在のフェーズ、既存リンク、知ったきっかけ

入力内容は、今回のプロジェクト評価にのみ使用します。

ISO/IEC 27001:2022 認証書

(Certificate)

ISO/IEC 27001:2022

認証機関
ARES International Certification
認証範囲
インタラクティブ没入型3Dシステムの開発プロセス、ならびにネットワークおよびインフラの運用・管理。

認証機関サイトで確認