Skip to main content
Go to Editor

Tài liệu

Learn how to optimize your Spine 2D animations, reduce file size, and improve performance

FPSPlusPremiumUIVideoYouTubeanimationbiểu đồbảngbộ nhớchỉ sốcó-mất-dữ-liệudữ liệuexportgiao-diệngiáguidehiệu nănghướng dẫnkhái niệmkhông-mất-dữ-liệukết nốikết quảloạingười mới bắt đầupipelineplaybackquy trìnhrecorderrecordingsocketthống kêtimelinetrình-xemtối ưu hóavideoviewerví dụđiều khiểnđăng ký

Bắt đầu: Quy trình cơ bản

người mới bắt đầuquy trìnhhướng dẫn

Hướng dẫn này sẽ giúp bạn bắt đầu nhanh với JSON Optimizer.

  1. Tải dự án: Dùng InputNode để tải các tệp .json, .atlas.png của bạn.
  2. Chọn preset (chế độ Plus): Ở chế độ Plus, dùng bảng bên phải để chọn một preset có sẵn (ví dụ: "Basic Fallback"). Việc này sẽ tự động tạo một đồ thị tối ưu hóa. Ở chế độ Free, hãy dựng đồ thị tối thiểu thủ công: InputNodeQuantizerNodeOutputNode.
  3. Chạy đồ thị: Nhấn nút "Chạy đồ thị".
  4. So sánh kết quả: Chuyển sang tab "Trình xem" để so sánh trực quan hoạt ảnh gốc và hoạt ảnh đã tối ưu.
  5. Xem lại thay đổi: Ở các tab "Kết quả" và "Thống kê", bạn sẽ thấy thông tin chi tiết về những key nào đã bị sửa đổi hoặc bị xóa.

Loại socket & luồng dữ liệu

socketloạidữ liệukết nối

Bài viết này giải thích các kiểu dữ liệu được dùng bởi socket trong đồ thị node và những gì có thể kết nối với nhau.

Quy tắc nhanh

Hầu hết các node xử lý làm việc trên dữ liệu Spine. Các node liên quan đến atlas làm việc trên dự án atlas hoặc sprite. Dùng ValidatorNode khi bạn không chắc socket đang mong đợi gì.

Các loại socket

  • Dữ liệu Spine — biểu diễn dự án Spine thân thiện với môi trường chạy, được hầu hết node xử lý sử dụng.
  • Dự án atlas — metadata atlas + ảnh các trang, dùng bởi các node atlas.
  • Sprite — ảnh/vùng sprite đã được unpack (Atlas Unpacker → Trình xem tài nguyên / Atlas Repacker).
  • JSON — Spine JSON gốc hoặc đã được tái tạo để chẩn đoán/kiểm tra/so sánh.
  • Thay đổi — danh sách/luồng khác biệt do một số bộ tối ưu tạo ra và được node xem/báo cáo sử dụng.

Khóa → loại → kết nối tới

Khóa socket (ví dụ)Kiểu dữ liệuĐược tạo bởiKết nối tới
payload, payload_in, payload_outDữ liệu SpineInputNode, hầu hết node xử lýNode xử lý (RDP/Spline/Refit/Quantizer/Cleanup/...), sau đó OutputNode.payload
original_jsonJSONInputNodeDiagnosticNode, JSONDiffNode.json_before, OutputNode.original_json, một số node atlas (ví dụ: chế độ alpha của repacker)
reconstructed_json_outJSONOutputNodeJSONDiffNode.json_after, trình xác thực/gỡ lỗi
changesDanh sách thay đổiMột số node xử lý + OutputNodeAnimationViewerNode (tuỳ chọn), báo cáo/gỡ lỗi
atlas_projectDự án atlasInputNode / trình xem atlasAtlasUnpackerNode.atlas_project, OutputNode.atlas_project, các bộ lọc atlas
atlas_in, atlas_outDự án atlas (hoặc luồng liên quan atlas)Node/bộ lọc atlasNode atlas, AtlasViewerNode, AtlasMergerNode (qua nhiều đầu vào)
sprites_out, sprites_in, sprites_data_inSpriteAtlasUnpackerNode, bộ lọcAssetViewerNode.sprites_in, AtlasRepackerNode.sprites_data_in
atlas_inputsNhiều dự án atlasNhiều nguồnAtlasMergerNode.atlas_inputs (kết nối nhiều atlas)

Các quy trình thực tế

  • Tối ưu JSON cơ bản: InputNode → (tuỳ chọn: DiagnosticNode / bộ lọc) → bộ tối ưu (RDPNode, SplineNode, QuantizerNode, …) → OutputNode.
  • Đóng gói lại atlas: InputNode.atlas_projectAtlasUnpackerNode → (tuỳ chọn: AssetViewerNode) → AtlasRepackerNodeOutputNode.atlas_project/atlas_assets.

Gói đăng ký & tính năng Premium

đăng kýPremiumPlusgiá

re-polish cung cấp hai gói đăng ký phù hợp với các nhu cầu khác nhau.

Gói Free

  • ✓ Biểu đồ nút cơ bản
  • ✓ Trình xem JSON
  • ✓ Timeline phát animation trên nhiều track với mức trộn tùy chỉnh giữa các animation
  • ✓ Tối ưu hóa hạn chế
  • ✓ Phiên bản Spine: 4.2, 4.1, 4.0, 3.8, 3.7

Gói Plus ($5/tháng)

  • ✓ Tất cả tính năng miễn phí
  • ✓ Bộ công cụ tối ưu hóa cho keyframe, curve và texture
  • ✓ Đưa vật lý vào keyframe (bake)
  • ✓ Làm sạch keyframe đã bake thành đường cong
  • ✓ Cài đặt trước biểu đồ
  • ✓ Hỗ trợ ưu tiên

Cách nhận Plus

Nhấp nút Upgrade ở thanh điều hướng trên cùng, sau đó:

  • Chọn Get Plus
  • Bạn sẽ được chuyển sang Patreon — hoàn tất đăng ký
  • Quay lại trình chỉnh sửa node khi đang đăng nhập cùng tài khoản Patreon để dịch vụ xác minh liên kết và bật Plus
  • (Tuỳ chọn) Nhập mã kích hoạt (cho các ưu đãi đặc biệt)

Khái niệm cơ bản: Có mất dữ liệu và không mất dữ liệu

khái niệmcó-mất-dữ-liệukhông-mất-dữ-liệungười mới bắt đầu

Tất cả các phương pháp tối ưu được chia thành hai loại:

Khuyến nghị: Luôn bắt đầu với tối ưu không mất dữ liệu. Chỉ dùng phương pháp có mất dữ liệu khi cần giảm thêm kích thước tệp, và luôn kiểm tra kết quả bằng mắt.

Cách đo lường hiệu quả

hướng dẫnchỉ sốthống kê

Để hiểu hiệu quả của tối ưu hóa, hãy chú ý đến các chỉ số sau:

  • Kích thước tệp: Kích thước cuối cùng của tệp .json là mục tiêu chính của tối ưu hóa.
  • Số lượng khung hình chính: Trong thẻ "Thống kê", bạn sẽ tìm thấy bảng và biểu đồ hiển thị số lượng khung hình chính đã bị xóa trong mỗi hoạt ảnh.
  • So sánh trực quan: Luôn sử dụng thẻ "Trình xem" để so sánh hoạt ảnh "trước" và "sau". Đảm bảo rằng tối ưu hóa có mất dữ liệu không gây ra các hiện tượng trực quan không chấp nhận được.
  • Báo cáo trong bảng "Kết quả": Tại đây bạn có thể kiểm tra chi tiết từng thay đổi cụ thể được thực hiện đối với dữ liệu của bạn.

Trình xem: Bảng điều khiển

trình-xemđiều khiểngiao-diện

Thẻ Trình xem hiển thị bảng Điều khiển phủ lên canvas. Nó được chia thành ba nhóm:

Điều khiển hoạt ảnh

  • Hoạt ảnh — chọn hoạt ảnh Spine đang phát.
  • Giao diện — chọn giao diện được áp dụng.
  • Tốc độ — hệ số tốc độ phát (0.1× → 3.0×).

Điều khiển chế độ xem

  • Đặt lại góc nhìn — khôi phục vị trí camera/bố cục mặc định.
  • Tùy chọn hiển thị — các giá trị để định vị chế độ xem so sánh: Khoảng cách X / Khoảng cách Y (khoảng cách giữa Gốc/Đã tối ưu) và Dịch chuyển X / Dịch chuyển Y (dịch chuyển toàn cục).

Điều khiển gỡ lỗi

  • Chế độ gỡ lỗi — bật các lớp phủ gỡ lỗi khi kết xuất (phụ thuộc vào engine).
  • Bật vật lý — bật/tắt mô phỏng vật lý (nếu skeleton sử dụng vật lý).
  • Nhãn — bật/tắt lớp phủ nhãn.

Trình xem: Bảng hiệu năng

hiệu năngFPSbộ nhớUI

Bảng Performance hiển thị các chỉ số runtime theo thời gian thực cho (các) skeleton đang phát.

Thời gian thực

  • FPS — số khung hình/giây được monitor đo.
  • Frame Time — thời gian mỗi khung hình (ms, càng thấp càng tốt).
  • FPS chart — 120 mẫu gần nhất hiển thị dạng cột.

Chỉ số skeleton

  • Visible Slots — số slot hiển thị ở mẫu gần nhất.
  • Avg. Visible — trung bình trượt của slot hiển thị (ổn định hơn một khung hình).
  • Vertices — số lượng vertex hiện tại dùng để render.
  • Bounds (px) — kích thước bounds hiện tại (rộng×cao) theo pixel.
  • Avg. Bounds — trung bình trượt của bounds.
  • Largest Texture — trang atlas lớn nhất (theo kích thước) được phát hiện cho skeleton.
  • Texture Memory — ước tính tổng bộ nhớ texture cho các trang atlas đã tải. Khi có thể, bảng cũng hiển thị chi tiết theo từng trang (tên file, kích thước và dung lượng ước tính).

Cải thiện (khi có Optimized)

  • Slot Improvement — so sánh Avg. Visible giữa Original và Optimized.
  • Memory Change — so sánh Texture Memory giữa Original và Optimized.

Trình xem: Dòng thời gian

viewertimelineanimationplaybackguide

Bảng Dòng thời gian là một bộ sắp xếp hoạt ảnh có thể gắn kết ở cuối Trình xem. Nó cho phép bạn sắp xếp các clip hoạt ảnh trên nhiều track, điều khiển phát lại và xem trước các chuyển tiếp.

Track & Clip

  • Tối đa 4 track hoạt ảnh — mỗi track tương ứng với một lớp trackIndex của Spine. Track cao hơn hoà trộn lên trên các track thấp hơn.
  • Thêm hoạt ảnh — nhấp nút + trên bất kỳ track nào để mở trình chọn hoạt ảnh (có bộ lọc tìm kiếm).
  • Kéo & thay đổi kích thước clip — kéo thân clip để di chuyển dọc theo track; kéo cạnh trái/phải để thay đổi thời gian bắt đầu hoặc thời lượng.
  • Xóa clip — chọn clip và nhấn Delete hoặc Backspace.
  • Phát hiện chồng lấn — các clip chồng lấn trên cùng track được đánh dấu màu đỏ.

Điều khiển phát lại

  • Phát / Tạm dừng / Dừng — các điều khiển phát lại tiêu chuẩn.
  • Trước / Tiếp — nhảy đến đầu clip trước hoặc clip tiếp theo.
  • Tốc độ hoạt ảnh — thanh trượt từ 0.1× đến 3.0×.
  • Tự động dừng — phát lại tự động dừng khi kết thúc dòng thời gian.

Hoà trộn chuyển tiếp

  • Thời gian hoà trộn toàn cục — đặt thời gian crossfade mặc định giữa các clip liên tiếp.
  • Tùy chỉnh theo từng chuyển tiếp — nhấp vào bong bóng chuyển tiếp giữa hai clip để đặt thời gian hoà trộn tùy chỉnh. Bạn có thể đặt lại các tùy chỉnh riêng về giá trị toàn cục.

Tua & Kéo

  • Đầu phát — kéo tay cầm trên thước thời gian hoặc nhấp vào thước để tua.
  • Xem trước thời gian con trỏ — di chuột qua vùng track hiển thị thời gian tại vị trí con trỏ.
  • Web Worker — việc tua và tính toán sự kiện được chuyển sang worker nền để đảm bảo hiệu năng mượt mà.

Phát lại nhận biết vật lý

  • Chuyển đổi vật lý giữa Update (ràng buộc hoạt động) và None (tắt).
  • Khi tua, thời gian skeleton được tiến tới để ổn định đúng các ràng buộc vật lý.

Hỗ trợ nhiều Skeleton

  • Bộ chọn cặp mục tiêu — mỗi track có thể nhắm tất cả các cặp (🌐 Tất cả các cặp) hoặc một skeleton cụ thể.
  • Vị trí và tỷ lệ từng skeleton — đầu vào dịch chuyển X/Y và tỷ lệ cho từng skeleton riêng lẻ.
  • Thứ tự vẽ — đầu vào số để kiểm soát ưu tiên lớp kết xuất.

Vẽ gỡ lỗi

Bật/tắt hiển thị cho: Xương, Tên xương, Vùng, Lưới, Vỏ, Ranh giới, Đường dẫn, Cắt, Điểm.

Chọn giao diện

Hộp kiểm đa chọn cho tất cả giao diện được định nghĩa trong skeleton đã tải.

Cài đặt hiển thị

  • Khoảng cách X / Y — khoảng cách giữa các cặp skeleton.
  • Dịch chuyển X / Y — dịch chuyển khung nhìn toàn cục.
  • Chuyển đổi PMA — chế độ alpha nhân trước (Spine 3.x) hoặc chế độ alpha atlas (Spine 4.x: auto / pma / bleed / none).
  • Nhãn skeleton — bật/tắt lớp phủ nhãn.

Trình xem: Ghi hình

viewerrecorderrecordingexportvideoguide

Ghi hình quay lại hoạt ảnh Spine từ trình xem dưới dạng video, ảnh động hoặc chuỗi ảnh.

Chế độ ghi hình

  • ⚡ Ghi nhanh — quay thời gian thực sử dụng MediaRecorder + captureStream(). Chỉ xuất WebM. Nhanh nhưng giới hạn ở tốc độ khung hình thời gian thực.
  • 🎬 Xuất HQ — kết xuất từng khung hình ngoại tuyến sử dụng WebCodecs VideoEncoder + readPixels(). Hỗ trợ tất cả định dạng và tạo ra đầu ra pixel hoàn hảo.

Định dạng đầu ra

  • Video: WebM, MP4, AVI, MOV
  • Ảnh động: GIF, Animated PNG (APNG)
  • Chuỗi ảnh: PNG Sequence, WebP Sequence

Codec (Xuất HQ)

VP8, VP9, H.264 (AVC), AV1, ProRes — các codec khả dụng được tự động phát hiện dựa trên hỗ trợ của trình duyệt.

Chất lượng

  • Cài đặt sẵn: Thấp (~1 Mbps), Trung bình (~3 Mbps), Cao (~5 Mbps), Không mất dữ liệu (~20 Mbps).
  • Bitrate tùy chỉnh — chỉ định bằng kbps để kiểm soát chi tiết.

Thời gian

  • FPS: 24, 30, 60 hoặc tùy chỉnh (1–120 fps).
  • Khởi động — giây để vật lý/ràng buộc ổn định trước khi bắt đầu ghi.
  • Dừng sau — giữ khung hình cuối trong một khoảng thời gian đặt.
  • Bao gồm khung hình cuối — bật/tắt.

Khung nhìn & Cắt

  • Bật/tắt cắt — bật/tắt vùng cắt.
  • Hình chữ nhật cắt — X, Y, Chiều rộng, Chiều cao theo tọa độ thế giới Spine.
  • Bắt theo cặp — tự động khớp vùng cắt theo cặp skeleton với khoảng đệm có thể cấu hình.
  • Lớp phủ cắt tương tác — kéo các góc/cạnh trực tiếp trong khung nhìn.

Độ phân giải

  • Chế độ tỷ lệ — thanh trượt phần trăm (10%–400%).
  • Chế độ cố định — kích thước pixel cụ thể (tối đa 4096px).
  • Độ phân giải đầu ra được tính toán hiển thị trực tiếp.

Tùy chọn kết xuất

  • Kết xuất xương — bao gồm lớp phủ gỡ lỗi xương.
  • Kết xuất hình ảnh — bao gồm ảnh attachment.
  • Kết xuất khác — hộp giới hạn, đường dẫn.
  • MSAA — None / 2× / 4× khử răng cưa.
  • Làm mượt — mức 0–8 với lựa chọn thuật toán (Bicubic / Bilinear).

Nền

  • Trong suốt — tự động tắt cho các định dạng không hỗ trợ alpha (ví dụ: GIF, JPEG).
  • Màu đơn — bộ chọn màu tùy chỉnh.
  • Ô cờ — chỉ báo trong suốt trực quan.
  • Hỗ trợ kênh alpha: VP9+WebM, AV1+MP4, PNG Sequence, APNG, WebP Sequence.

Lớp phủ HUD

  • Bật/tắt: thông tin track, thời gian, số khung hình, FPS, nhãn skeleton.
  • Văn bản tùy chỉnh — chuỗi watermark.
  • Vị trí — 4 góc (trên-trái, trên-phải, dưới-trái, dưới-phải).
  • Cỡ chữ — 8–64px, cùng bộ chọn màu chữ.

Lặp lại & Nhiều Skeleton

  • Số lần lặp — 1–100 vòng lặp.
  • Cặp mục tiêu — ghi một skeleton cụ thể hoặc tất cả.
  • Chế độ skeleton — Kết hợp (một tệp duy nhất) / Tệp riêng (một tệp cho mỗi skeleton).

Mẫu tên tệp

Chuỗi mẫu với các biến: {project}, {animation}, {W}, {H}, {fps}. Bản xem trước trực tiếp của tên tệp đã giải quyết được hiển thị.

Tích hợp dòng thời gian

Phạm vi ghi hình xuất hiện dưới dạng clip nét đứt đỏ/cam trên dòng thời gian. Kéo cạnh để thay đổi kích thước phạm vi, kéo thân để di chuyển vị trí, hoặc dùng nút cài đặt (⚙️) để mở toàn bộ cài đặt ghi hình.

Thẻ Kết quả

kết quảbảngtối ưu hóa

Thẻ Kết quả hiển thị đầu ra tối ưu hóa chi tiết.

  • Bảng kết quả — dạng xem mỗi thay đổi một dòng của kết quả tối ưu JSON (ví dụ: hoạt ảnh/xương/thuộc tính/khung hình chính nào được sửa hoặc bị xóa).
  • So sánh sprite/atlas — khi dùng tối ưu texture, phần này so sánh kích thước sprite và kết quả đóng gói.

Mẹo: dùng thẻ này để trả lời: chính xác đã thay đổi gì?

Thẻ Thống kê

thống kêbiểu đồchỉ số

Thẻ Thống kê tóm tắt kết quả tối ưu hóa bằng biểu đồ và các chỉ số tổng hợp.

  • Biểu đồ tối ưu — trực quan hóa tác động tối ưu trên toàn bộ dữ liệu (khi tối ưu JSON tạo ra thay đổi).
  • Bảng chỉ số — các con số chính như kích thước trước/sau và phần trăm giảm.
  • Thống kê đóng gói texture — nếu dùng đóng gói lại atlas, hiển thị số trang, tổng/đã dùng diện tích, hiệu quả và chi tiết theo từng trang.

Dùng thẻ này để trả lời: tổng thể cải thiện được bao nhiêu?

Ví dụ pipeline (Video)

Videoví dụpipelineYouTube

Dưới đây là các quy trình hoàn chỉnh, thực tế từ playlist YouTube chính thức.

Mở toàn bộ playlist

Ví dụ

Spine2D Experiments 1: Tối ưu đường cong với thuật toán RDP — bản demo tối ưu Spine 2D cơ bản: thuật toán Ramer–Douglas–Peucker (RDP) loại bỏ dữ liệu đường cong và key dư thừa để giảm JSON. RDP có thể loại bỏ key quan trọng, vì vậy hãy luôn kiểm tra hoạt ảnh và loại trừ xương/slot nhạy cảm bằng các node lọc trước node RDP. Xem trên YouTube

Spine2D Experiments 2: Tối ưu đường cong với thuật toán lượng tử hóa — lượng tử hóa là trình tối ưu đường cong an toàn nhất: làm tròn giá trị (thường đến 1 chữ số thập phân) giúp giảm kích thước ngay lập tức. Ví dụ: [0.115,14.5,0.222,-27.78] → [0.1,14.5,0.2,-27.8]. Dùng node lượng tử hóa làm bước cuối trước node đầu ra để chốt tối ưu; video cho thấy trước/sau với thay đổi hình ảnh gần như không nhận thấy. Xem trên YouTube

Spine2D Experiments 3: Tái dựng đường cong với Spline và Refit — Spline không mất dữ liệu cho các đoạn thẳng (loại bỏ key ở giữa dư thừa), còn Refit có mất dữ liệu nhưng mạnh: tái dựng các đoạn phức tạp thành một đường cong Bézier. Các thuật toán này lý tưởng sau khi bake physics và dọn dẹp bằng node Schneider. Lưu ý: Refit trên 100 vòng lặp có thể mất vài phút để tìm đường cong tốt nhất. Video cho thấy cách hoạt động của cả hai phương pháp và phần trăm tối ưu đạt được. Xem trên YouTube

Spine2D Experiments 4: Loại bỏ dữ liệu dư thừa với các node hiển thị gắn kết và cleanup — tối ưu cấu trúc Spine 2D bằng các node hiển thị gắn kết và cleanup. Node hiển thị gắn kết vô hiệu hóa phần gắn khi alpha về 0 và khôi phục khi fade‑in, giảm draw call và key dư thừa. Cleanup loại bỏ dư thừa logic: track màu/alpha không dùng, key xoay IK do constraint điều khiển hoàn toàn, và key path constraint. Video cho thấy các tối ưu logic này khác với việc đơn giản hóa đường cong như thế nào. Xem trên YouTube

Spine2D Experiments 5: Xây dựng pipeline phi tuyến (bộ lọc và node gộp) — tối ưu phi tuyến Spine 2D: chia luồng dữ liệu bằng các bộ lọc (Hoạt ảnh, Xương, Slot, Tham số hoặc Giao diện), chạy thuật toán khác nhau trên các nhánh song song (ví dụ nén mạnh cho xương thân trong khi giữ hoạt ảnh mặt không mất dữ liệu), sau đó gộp các nhánh bằng node gộp thành một skeleton. Quy trình này vượt qua pipeline Đầu vào → Tối ưu → Đầu ra đơn giản và cho phép tối ưu chỉ những phần cần thiết. Xem trên YouTube

Spine2D Experiments 6: Đóng gói lại texture và scale chọn lọc — pipeline tối ưu texture nâng cao: các node Atlas Unpacker/Repacker cho phép unpack, đổi kích thước hoặc nén và repack atlas ngay trong một đồ thị, nhanh hơn quy trình Spine tiêu chuẩn. Với pipeline phi tuyến, bạn có thể tách tài nguyên, giữ texture nhân vật ở 100% và giảm các texture khác xuống 25%, rồi hợp nhất lại thành một atlas dùng chung. Các node Atlas/Asset Viewer cung cấp kiểm tra trực quan và lọc tài nguyên/atlas ở mọi giai đoạn. Điều này giúp dễ xác định mục tiêu đổi kích thước, xử lý chọn lọc và tái kết hợp kết quả như một mẫu có thể tái sử dụng. Xem trên YouTube

Spine2D Experiments 7: Co giãn skeleton tức thì bằng node Scale — tối ưu Spine 2D từ đầu đến cuối kèm scale skeleton. Node Scale thay thế quy trình Spine rườm rà (export/import, repack/unpack, sửa đường dẫn) bằng một bước trong đồ thị: đặt kích thước mục tiêu, xem trước tức thì trong khung xem và lặp lại theo thời gian thực. Video kết nối tối ưu đường cong và key, xử lý tài nguyên và thay đổi kích thước skeleton trong một pipeline gọn. Xem trên YouTube

Spine2D Experiments 8: Tổng quan node bản beta công khai — tổng quan mọi node có trong bản beta công khai và cách re‑polish kết nối nhu cầu của animator và developer. Bao gồm dọn key dư thừa, đơn giản hóa Bézier→linear, làm tròn để giảm kích thước, loại bỏ phần gắn vô hình, dọn thuộc tính không dùng, phát hiện ký tự không phải tiếng Anh, và atlas unpack/filter/scale/repack. Dual Viewer xác thực kết quả với so sánh trực quan và FPS song song. Public Beta đang mở tại re-polish.com. Xem trên YouTube

Spine2D Experiments 9: Bake ràng buộc vật lý vào keyframe — trong video này, tôi trình bày các thử nghiệm mới nhất về việc bake các ràng buộc vật lý vào keyframe tiêu chuẩn. Thuật toán bake mới đảm bảo: vòng lặp hoàn hảo (không giật hoặc nhảy giữa khung đầu và cuối), kích thước tệp tối ưu (tự động dọn dẹp đường cong giúp kích thước JSON gần với bản gốc) và tương thích ngược (key đã bake cho phép dùng animation vật lý Spine 4.2 trong Spine 4.1 hoặc thậm chí 4.0). Xem trên YouTube

Nodes

Input

Nhập tệp dự án Spine, đầu vào chỉ-JSON, tài nguyên demo và gói ZIP vào đồ thị.

Mục đích: Đây là điểm vào chính cho hầu hết quy trình làm việc. Node này đọc JSON, atlas và texture rồi chuẩn hóa chúng thành dữ liệu nội bộ để các node phía sau có thể xử lý.

Các chế độ được hỗ trợ:
1. Dự án đầy đủ: JSON + atlas + texture
2. Chỉ JSON: xử lý dữ liệu skeleton/animation mà không có atlas
3. Gói ZIP: tệp zip đóng gói chứa một dự án hoàn chỉnh
4. Tài nguyên demo: dữ liệu mẫu tích hợp sẵn để thử nghiệm nhanh

Đầu ra chính:
- **payload_out**: dữ liệu đã chuẩn hóa cho các node tối ưu hóa
- **original_json_out**: JSON nguồn để so sánh hoặc tái dựng
- **atlas_project_out**: dự án atlas đã được parse khi có cung cấp texture

Picture Input

Thêm ảnh PNG/JPEG độc lập vào viewport để bạn tạo các bản xem trước và khung hình trình bày gọn gàng hơn.

Mục đích: Dùng node này để đặt ảnh trực tiếp vào viewport như các lớp trình bày hoặc trợ giúp trực quan. Nó hữu ích khi bạn muốn trang trí một cảnh, thêm đồ họa hỗ trợ và làm cho bản xem trước dự án trông chỉn chu hơn trước khi quay video hoặc demo.

Quy trình: Tải một ảnh, sau đó dùng các công cụ viewport để scale, di chuyển và chỉnh z-index của ảnh để nó nằm đúng vị trí trong bố cục. Cách này giúp bạn tạo các shot giới thiệu hấp dẫn mà không phải đụng đến dữ liệu chính của dự án Spine.

Node này hoạt động độc lập và không cung cấp graph sockets.

Output

Thu thập kết quả cuối cùng và cho phép bạn tải dữ liệu đã tối ưu hóa xuống dưới dạng các tệp riêng lẻ, nhóm tệp hoặc kho lưu trữ.

Mục đích: Hoạt động như trung tâm xuất cho JSON đã tối ưu hóa, dữ liệu atlas, texture và sprite. Nó có thể lắp ráp kết quả từ một bộ JSON/atlas/texture duy nhất, từ nhiều bộ tệp, hoặc chỉ từ sprite khi bạn muốn đầu ra hình ảnh mà không cần dựng lại toàn bộ dự án Spine.

Tùy chọn xuất:
- Tải tệp riêng lẻ hoặc dưới dạng một kho lưu trữ duy nhất
- Tải kết quả đã đóng gói hoặc một kho lưu trữ chứa các tệp chưa đóng gói
- Xuất JSON ở dạng gọn hoặc dạng pretty-print dễ đọc
- Xuất toàn bộ dữ liệu dự án Spine hoặc chỉ kết quả sprite/hình ảnh

Quy trình chaining: OutputNode không nhất thiết phải là điểm cuối tuyệt đối của đồ thị. Bạn có thể chuyển đầu ra của nó sang một giai đoạn pipeline khác và chạy cùng các tệp đó qua thêm các lượt tối ưu hóa. Trên thực tế, tối ưu hóa key và curve đã được thử nghiệm tới 3 lần lặp liên tiếp.

Đầu ra chính:
- **reconstructed_json_out**: JSON Spine đã dựng lại
- **original_json_passthrough_out**: passthrough của JSON gốc
- **payload_out**: payload cho chaining tiếp theo
- **changes**: các thay đổi tối ưu hóa đã thu thập
- **atlas_assets**: tài nguyên atlas sẵn sàng để xuất

RDP

Đơn giản hoá đường cong hoạt ảnh (RDP).

Mục đích: Giảm số lượng khung hình chính trong các đoạn hoạt ảnh tuyến tính hoặc gần tuyến tính bằng cách loại bỏ các điểm nằm trên đường thẳng giữa hai điểm khác.

Quy tắc vàng: Tắt mặc định. Bảo vệ các đường cong có hình dạng đáng kể (diện tích/độ cong) khỏi bị làm phẳng thành tuyến tính. Chỉ tắt khi cần nén mạnh hơn sau khi đã kiểm tra bằng mắt.

Khóa socket: payload_in, payload_out, changes

Spline

Tối ưu hoá đường cong bằng spline.

Mục đích: Làm khớp đường cong mượt mà trong khi vẫn giữ chất lượng hình ảnh.

Khóa socket: payload_in, payload_out, changes

Refit

Refit (Bezier) để giảm số khung hình chính.

Mục đích: Khớp ít đường cong hơn trong giới hạn sai số.

Khóa socket: payload_in, payload_out, changes

Quantizer

Giảm độ chính xác của các giá trị số trong khung hình chính và đường cong.

Mục đích: Phương pháp đơn giản nhưng hiệu quả để giảm kích thước tệp bằng cách làm tròn số đến số chữ số thập phân được chỉ định.

Sử dụng: Có thể áp dụng cho hầu hết tất cả dữ liệu hoạt ảnh. Trở nên hiệu quả hơn với số lượng khung hình chính cao hơn.

Cẩn thận: Lượng tử hóa quá mạnh (độ chính xác thấp) có thể gây rung hoặc hiện tượng trực quan trong hoạt ảnh.

Cleanup

Thực hiện các tác vụ dọn dẹp khác nhau để loại bỏ dữ liệu hoạt ảnh dư thừa hoặc không cần thiết.

Mục đích: công cụ chuyên dụng để loại bỏ một số loại dữ liệu dư thừa mà các bộ tối ưu khác có thể bỏ sót.

Cách dùng: nối payload của bạn vào 'payload_in' và lấy kết quả từ 'payload_out'. Nếu bạn muốn báo cáo theo từng thay đổi, hãy dùng thêm 'changes'.

Khoá socket:
- Đầu vào: payload_in
- Đầu ra: payload_out, changes

Các hạng mục dọn dẹp hiện được hỗ trợ:
1. **Loại bỏ kênh màu/alpha không dùng**: loại bỏ timeline màu/alpha cho các slot không bao giờ hiển thị trong suốt hoạt ảnh.
2. **Loại bỏ xoay IK dư thừa**: loại bỏ khung hình chính xoay khỏi các bone bị điều khiển hoàn toàn bởi IK constraint với mix 100%.
3. **Loại bỏ key ràng buộc đường dẫn**: loại bỏ khung hình chính rotate/translate khỏi các bone bị điều khiển hoàn toàn bởi path constraint (mix 100%).
4. **Chuẩn hoá ký tự không phải tiếng Anh**: thay thế các ký tự không phải tiếng Anh trong tên/định danh để tránh vấn đề với các công cụ phía sau.

Scale

Chia tỷ lệ tất cả các giá trị số trong khung hình chính hoạt ảnh theo hệ số được chỉ định.

Mục đích: Chia tỷ lệ đồng đều dữ liệu hoạt ảnh, hữu ích để thay đổi kích thước skeleton theo tỷ lệ hoặc điều chỉnh cường độ hoạt ảnh.

Sử dụng: Kết nối với payload và đặt hệ số tỷ lệ. Giá trị trên 1.0 phóng to, dưới 1.0 thu nhỏ.

Tham số:
- **Scale Factor**: Số nhân được áp dụng cho tất cả giá trị vị trí và kích thước.
- **Include Rotations**: Có chia tỷ lệ giá trị xoay hay không (thường bị vô hiệu hóa).

Trường hợp sử dụng:
- Thay đổi kích thước hoạt ảnh đã nhập để phù hợp với kích thước skeleton mới
- Tạo các biến thể phóng đại hoặc tinh tế của hoạt ảnh
- Chia tỷ lệ hàng loạt nhiều hoạt ảnh cho các kích thước nhân vật khác nhau

Schneider

Khớp các đường cong Bézier mượt vào khung hình chính hoạt ảnh bằng thuật toán khớp đường cong Schneider.

Mục đích: Khớp đường cong nâng cao tạo ra các đường cong Bézier có vẻ tự nhiên từ các chuỗi khung hình chính dày đặc.

Khả dụng: **Chỉ dành cho Plus**.

Cách hoạt động: Thuật toán Schneider phân tích vị trí và tiếp tuyến khung hình chính để tạo các điểm điều khiển Bézier tối ưu phù hợp chặt chẽ với chuyển động gốc.

Tham số:
- **Error Tolerance**: Độ lệch tối đa cho phép so với khung hình chính gốc. Thấp hơn = chính xác hơn, cao hơn = đường cong mượt hơn.
- **Corner Angle**: Góc ngưỡng (độ) tại đó chia đường cong thành các đoạn.

Tốt nhất cho:
- Hoạt ảnh vẽ tay hoặc nhập với nhiều khung hình chính
- Chuyển đổi nội suy tuyến tính thành đường cong Bézier mượt
- Giảm số lượng khung hình chính trong khi duy trì chất lượng đường cong

Lưu ý: Tính toán chuyên sâu hơn các thuật toán đơn giản hơn như RDP, nhưng tạo ra chất lượng đường cong cao hơn.

Physics Constraint Bake

Bake ràng buộc vật lý thành khung hình chính: chuyển động PhysicsConstraint thành khung hình chính xoay/tịnh tiến và loại bỏ timeline vật lý.

Mục đích: Chuyển mô phỏng vật lý thời gian chạy thành khung hình chính rõ ràng để hoạt ảnh mang tính quyết định và có thể chỉnh sửa mà không cần PhysicsConstraints. Sau bake, PhysicsConstraints và timeline vật lý sẽ bị loại khỏi payload.

Khả dụng: **Chỉ dành cho Plus**.

Đầu vào/Đầu ra:
- **payload_in** → **payload_out** (đã bake)
- **changes** (danh sách thay đổi tùy chọn)

Điều khiển:
- **Sample FPS**: tốc độ lấy mẫu mô phỏng.
- **Bake Rotation**: ghi khung hình chính xoay.
- **Bake Translation**: ghi khung hình chính tịnh tiến.
- **Bake Translation (Children)**: áp dụng bake tịnh tiến cho xương con phụ thuộc chuyển động vật lý.

Ghi chú:
- Cần Spine JSON gốc để tái dựng dữ liệu mô phỏng.
- Dùng khi muốn loại bỏ PhysicsConstraints nhưng vẫn giữ chuyển động.

Attachment Visibility

Tối ưu hóa kết xuất bằng cách đặt attachment của slot thành null khi alpha của nó bằng 0.

Mục đích: Ngăn game engine phải xử lý hoặc kết xuất các phần gắn vô hình.

Sử dụng: Phân tích các track alpha/màu và tự động thêm hoặc sửa đổi khung hình chính trên kênh 'attachment' tương ứng.

Tham số:
- **Alpha Threshold**: Giá trị alpha mà dưới đó một phần gắn được coi là vô hình.
- **Auto Restore**: Nếu được bật, node sẽ tự động khôi phục phần gắn hiển thị cuối cùng khi giá trị alpha vượt quá ngưỡng.

Payload Merger

Hợp nhất nhiều payload hoạt ảnh đã xử lý trở lại thành một payload thống nhất duy nhất.

Mục đích: Thiết yếu cho các pipeline xử lý song song nơi các hoạt ảnh hoặc nhóm xương khác nhau được tối ưu hóa riêng và cần được kết hợp lại.

Chiến lược hợp nhất:
1. **Đầu vào cơ sở**: Cung cấp cấu trúc skeleton (xương, slot, skin, v.v.)
2. **Đầu vào ghi đè**: Cung cấp các track đã xử lý thay thế track cơ sở
3. **Ghi cuối cùng thắng**: Khi nhiều ghi đè cung cấp cùng một track, cái cuối cùng có ưu tiên

Phát hiện xung đột:
- Xung đột giữa các đầu vào ghi đè được phát hiện và báo cáo
- Thay thế Cơ sở → Ghi đè là hành vi bình thường (không phải xung đột)
- Toast cảnh báo hiển thị khi xảy ra xung đột track

Ví dụ pipeline:
```
Input → AnimFilter('run') → Cleanup ───────┐
      → AnimFilter('idle') → Quantizer ────┤
      → (base) ────────────────────────────→ Merger → Output
```

Trường hợp sử dụng:
- Các trình tối ưu hóa khác nhau cho các hoạt ảnh khác nhau
- Xử lý xương/slot riêng biệt với việc kết hợp lại
- Thử nghiệm A/B các chiến lược tối ưu hóa khác nhau

Animation Viewer

Công cụ trực quan để kiểm tra và so sánh các đường cong hoạt ảnh trước và sau khi tối ưu hóa.

Mục đích: Cung cấp biểu diễn đồ họa của khung hình chính và đường cong cho kênh đã chọn.

Sử dụng: Bằng cách kết nối cả hai đầu vào 'payload_before' và 'payload_after', nó sẽ phủ các đường cong gốc và đã tối ưu hóa, giúp trực quan hóa tác động của tối ưu hóa của bạn dễ dàng hơn.

Animation Filter

Lọc các track hoạt ảnh dựa trên tên hoạt ảnh (ví dụ: 'run', 'idle').

Mục đích: Hữu ích để áp dụng các chiến lược tối ưu hóa khác nhau cho các hoạt ảnh khác nhau.

Sử dụng: Ví dụ, bạn có thể áp dụng tối ưu hóa có mất dữ liệu mạnh (như DCT) cho hoạt ảnh nhân vật nền trong khi sử dụng tối ưu hóa không mất dữ liệu (như Spline) cho hành động nhân vật chính.

Asset Filter

Lọc tài nguyên atlas theo tên, hoạt động ở hai chế độ: trước giải nén (lọc văn bản atlas) hoặc sau giải nén (lọc sprite).

Mục đích: Kiểm soát tài nguyên nào được bao gồm trong quy trình - tài nguyên nào giải nén từ atlas hoặc sprite nào đã giải nén để đóng gói lại.

Chế độ:
1. CHẾ ĐỘ TRƯỚC GIẢI NÉN (trước AtlasUnpacker):
   - Đầu vào: atlas_in (atlas_project)
   - Đầu ra: atlas_out (atlas_project đã lọc)
   - Quy trình: InputNode → AssetFilter → AtlasUnpacker
   - Trường hợp sử dụng: Lọc tài nguyên nào giải nén từ atlas (tiết kiệm thời gian xử lý)

2. CHẾ ĐỘ SAU GIẢI NÉN (sau AtlasUnpacker):
   - Đầu vào: sprites_in (sprites)
   - Đầu ra: sprites_out (sprites đã lọc)
   - Quy trình: AtlasUnpacker → AssetFilter → AtlasRepacker
   - Trường hợp sử dụng: Lọc sprite nào đã giải nén để bao gồm trong atlas cuối cùng

Hành vi UI:
- Trong chế độ TRƯỚC GIẢI NÉN: Phân tích văn bản atlas để phát hiện tên tài nguyên
- Trong chế độ SAU GIẢI NÉN: Phát hiện tên tài nguyên từ mảng sprite
- Công tắc 'Cho phép tất cả': Khi được chọn, cho phép tất cả tài nguyên đi qua (danh sách hiển thị nhưng bị vô hiệu hóa)
- Hộp kiểm: Chọn tài nguyên cụ thể để bao gồm (khi 'Cho phép tất cả' không được chọn)

Ví dụ:
- Trước giải nén: Chỉ chọn tài nguyên 'char_*' để chỉ giải nén sprite nhân vật
- Sau giải nén: Loại trừ sprite 'background_*' khỏi atlas đóng gói lại cuối cùng
- Tạo atlas chỉ vũ khí bằng cách chọn mẫu 'weapon_*'

Bone Filter

Lọc các track hoạt ảnh xương dựa trên tên xương.

Mục đích: Cho phép nhắm mục tiêu hoặc loại trừ các xương cụ thể khỏi quá trình tối ưu hóa.

Sử dụng: Bạn có thể muốn loại trừ các xương nhạy cảm, như những xương được sử dụng cho biểu cảm khuôn mặt, khỏi tối ưu hóa mạnh để bảo toàn từng chi tiết trong khi tối ưu hóa mạnh các xương ít quan trọng hơn.

Skin Filter

Lọc dữ liệu hoạt ảnh và tài nguyên dựa trên tên skin.

Mục đích: Chỉ xử lý các skin cụ thể từ dự án Spine có nhiều skin.

Sử dụng: Khi dự án Spine có nhiều skin (ví dụ: 'default', 'armor', 'casual'), node này cho phép bạn lọc skin nào để bao gồm trong xử lý.

Tham số:
- **Skins List**: Hộp kiểm cho mỗi skin có sẵn
- **Allow All**: Công tắc để bao gồm tất cả skin (mặc định)

Trường hợp sử dụng:
- Tạo atlas riêng cho mỗi skin
- Áp dụng tối ưu hóa khác nhau cho các skin khác nhau
- Loại trừ các skin ít sử dụng khỏi bản dựng đã tối ưu hóa

Lưu ý: Skin chia sẻ cấu trúc skeleton nhưng có thể có các attachment khác nhau.

Slot Filter

Lọc các track hoạt ảnh slot dựa trên tên slot.

Mục đích: Hữu ích để nhắm mục tiêu hoặc loại trừ các slot cụ thể có thể có yêu cầu về thời gian hoặc khả năng hiển thị đặc biệt.

Sử dụng: Bạn có thể sử dụng nó để loại trừ các slot vũ khí hoặc hiệu ứng được chuyển đổi bằng code khỏi bị ảnh hưởng bởi tối ưu hóa khả năng hiển thị attachment.

Parameter Filter

Lọc các track hoạt ảnh dựa trên loại thuộc tính của chúng (ví dụ: rotation, scale, color).

Mục đích: Cho phép áp dụng các tối ưu hóa tiếp theo chỉ cho các loại dữ liệu hoạt ảnh cụ thể.

Sử dụng: Đặt node này trước trình tối ưu hóa để giới hạn phạm vi của nó. Ví dụ, bạn có thể áp dụng tối ưu hóa RDP chỉ cho các track 'translation' và 'scale'.

Atlas Unpacker

Trích xuất các sprite riêng lẻ từ texture atlas Spine.

Mục đích: Phân tách tệp atlas thành các sprite thành phần, cho phép phân tích hoặc đóng gói lại riêng lẻ.

Sử dụng: Kết nối đầu ra 'atlas_project' từ InputNode với đầu vào 'atlas_project_in' của node này. Đầu ra sau đó có thể được gửi đến AssetViewer để kiểm tra hoặc AtlasRepacker để tối ưu hóa.

⭐ Cắt xén lưới: Kết nối đầu ra 'Original JSON' từ InputNode đến đầu vào 'Skeleton JSON' để kích hoạt cắt xén tự động các sprite theo ranh giới lưới của chúng (thay vì ranh giới hình chữ nhật). Điều này làm giảm đáng kể việc sử dụng bộ nhớ kết cấu cho các sprite có tệp đính kèm lưới bằng cách loại bỏ các pixel trong suốt bên ngoài vỏ lưới.

Đầu ra:
- **sprites_out**: Mảng sprite được chuẩn hoá (cho viewer/repacker)
- **sprites_data_out**: Ảnh/metadata sprite đã trích xuất (gói có cấu trúc)
- **atlas_out**: Chuyển tiếp atlas project

Khoá socket: atlas_project, atlas_project_in, skeleton_json_in, sprites_out, sprites_data_out, atlas_out

Atlas Repacker

Đóng gói lại các sprite riêng lẻ thành một hoặc nhiều texture atlas mới được tối ưu hóa.

Mục đích: Tối ưu hóa bộ nhớ texture và có khả năng giảm các lệnh gọi vẽ bằng cách tạo các sprite sheet hiệu quả.

Sử dụng: Chấp nhận 'sprites_data' (thường từ AtlasUnpacker) và tạo bố cục atlas mới.

Tham số:
- **Max Texture Size**: Chiều rộng/cao tối đa của các trang atlas đầu ra.
- **Padding**: Khoảng cách tính bằng pixel giữa mỗi sprite.
- **Scale**: Thay đổi kích thước tất cả sprites trước khi đóng gói.
- **Power of Two**: Buộc kích thước atlas đầu ra phải là lũy thừa của hai (ví dụ: 1024, 2048), được yêu cầu bởi một số nền tảng.
- **Allow Rotation**: Cho phép xoay sprites 90 độ để đóng gói hiệu quả hơn.

Atlas Viewer

Trực quan hóa bố cục atlas texture và vị trí sprite.

Mục đích: Công cụ gỡ lỗi và kiểm tra để hiểu cấu trúc atlas.

Khoá socket: atlas_project, atlas_in, atlas, json

Atlas Merger

Kết hợp nhiều nguồn atlas thành một atlas thống nhất duy nhất.

Mục đích: Hợp nhất nhiều dự án atlas thành một.

Đầu vào:
- **atlas_inputs**: Mảng đa đầu vào của các dự án atlas

Đầu ra:
- **atlas_out**: Dự án atlas đã hợp nhất
- **merged_out**: Đầu ra hợp nhất kế thừa
- **merged_atlas_out**: Đầu ra hợp nhất kế thừa

Trường hợp sử dụng:
- Kết hợp atlas nhân vật với atlas vũ khí
- Hợp nhất sprite cơ sở với nội dung DLC
- Kết hợp lại sau khi xử lý atlas song song

Pipeline điển hình:
```
InputA → Unpacker → Repacker ─┐
                               ├→ Atlas Merger → Unpacker → Repacker → Output
InputB → Unpacker → Repacker ─┘
```
Trước Repacker, dữ liệu là các sprite riêng lẻ; sau Repacker, chúng trở thành dự án atlas. Atlas Merger kết hợp các dự án atlas, sau đó bước cuối Unpacker → Repacker đóng gói lại tất cả chặt hơn thành một atlas thống nhất.

Asset Viewer

Hiển thị các sprite riêng lẻ từ atlas đã giải nén.

Mục đích: Công cụ gỡ lỗi trực quan cho thao tác atlas.

Sử dụng: Chấp nhận 'sprites_data' từ node Atlas Unpacker và cho phép bạn trực quan hóa từng hình ảnh được trích xuất, kiểm tra các thuộc tính của nó (kích thước, xoay, v.v.) và xác minh độ chính xác trực quan sau khi giải nén.