Skip to main content
Go to Editor

Tài liệu

Hướng dẫn này sẽ giúp bạn bắt đầu nhanh với JSON Optimizer. Tải dự án: Dùng InputNode để tải các tệp .json , .atlas và .png của bạn. Chọn preset (chế độ Plus):

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. Tải dự án: Dùng InputNode để tải các tệp .json , .atlas và .png của bạn. Chọn preset (chế độ Plus): Ở chế độ Plus, dùng bảng bên phải để chọn một preset có s...

Read article

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. 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 n...

Read article

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ạ...

Read article

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: Không mất dữ liệu: các phương pháp này chỉ loại bỏ dữ liệu dư thừa... Ví dụ: Node tối ưu Spline , CleanupNode . Có mất dữ liệu: các phương pháp này đơn giản hoá...

Read article

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...

Read article

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...

Read article

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). F...

Read article

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 t...

Read article

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 ở...

Read article

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...

Read article

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í...

Read article

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–D...

Read article

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

Video To Png Sequence

Chuyển đoạn video thành chuỗi khung hình PNG cho quy trình Spine.

Đây là công cụ đầu vào miễn phí trong menu Input, phù hợp cho quy trình sản xuất. Công cụ hỗ trợ chroma key cho phông xanh và làm sạch matte kiểu unpremultiply cho nền đen. Đầu ra được gửi qua payload_out và atlas_out.

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.

Version: Định dạng phiên bản Spine JSON cho bộ xương stub được tạo.
Blending: Chế độ hòa trộn cho đính kèm được tạo (Bình thường, Cộng, Nhân, Màn hình).

Psd To Skeletons

Tải tệp PSD/PSB nhiều lớp và tạo các skeleton Spine liên kết với nhau, giữ nguyên bố cục cảnh trong Photoshop để dựng preview chính xác.

Mục đích: Hãy dùng node này khi cảnh đã được dàn sẵn trong Photoshop và bạn muốn biến stack layer đó thành một tập skeleton Spine liên kết bên trong viewer. Mỗi layer PSD đang hiển thị sẽ trở thành skeleton kiểu hình ảnh riêng, được đặt theo tọa độ PSD, nhờ đó việc dựng preview và đặt vật thể chính xác trở nên dễ hơn rất nhiều.

Quy trình trong viewer: Sau khi generate, bạn vẫn có thể đổi draw order trong viewer và đặt các skeleton khác vào giữa các layer PSD đã import, vì vậy các nhân vật hoặc props Spine bổ sung có thể nằm trực tiếp trong bố cục Photoshop.

Khả dụng: Node miễn phí. Node này hoạt động độc lập và không expose graph sockets.

Version: Định dạng phiên bản Spine JSON dùng cho các skeleton layer được tạo ra.
Blending: Chế độ blending dùng cho các attachment được tạo ra.
Load PSD: Mở bộ chọn PSD/PSB và tạo skeleton layer liên kết từ tệp đã chọn.
File Info: Tóm tắt chỉ đọc của tệp PSD/PSB hiện đang được tải.
Layer Count: Số lượng chỉ đọc của các layer nhìn thấy sẽ được chuyển thành skeleton liên kết.
Preflight: Báo cáo chỉ đọc về các vấn đề tên layer được phát hiện trước khi generate.

Project Input

Tải thư mục hoặc kho lưu trữ dự án Spine vào graph và cung cấp ProjectPayload qua socket project_out cho các node phía sau hỗ trợ project.

Mục đích: Điểm vào cho các workflow dựa trên project. Quét thư mục hoặc kho lưu trữ dự án Spine, tạo ProjectPayload và giữ metadata đã cache sẵn sàng cho các node phía sau như Project Viewer, bộ lọc, Static Bake và Deduplicator.

Điều khiển:
- **Load Folder**: Mở bộ chọn thư mục của hệ thống thông qua File System Access API, quét thư mục đã chọn, cập nhật phần tóm tắt, cache metadata và khởi động file watcher để các thay đổi về sau có thể được quét lại.
- **Browse (Fallback)**: Dùng input **webkitdirectory** ẩn cho các trình duyệt không có **showDirectoryPicker()**. Nó tải project, nhưng không có persistent directory handle, nên không có live watching và rescans đáng tin cậy.
- **Load Archive**: Tải kho lưu trữ **.zip** hoặc **.spine** như cây project ảo. Project tải từ archive không giữ directory handle, nên **Rescan** cố ý không khả dụng.
- **Rescan**: Quét lại thư mục đã tải trước đó khi có handle thư mục. Quyền đọc sẽ được kiểm tra lại trước khi quét. Project được tải qua fallback browse hoặc chế độ archive thường sẽ báo là chưa có thư mục nào được tải.
- **Clear Project**: Dừng theo dõi file và xóa payload hiện tại, phần tóm tắt, execution cache và metadata payload đã cache.
- **Reset to Defaults**: Chỉ đặt lại các control node chung. Nó **không** gỡ project hiện tại và không thay thế **Clear Project**.
- **Drop folder or .zip here**: Điểm vào drag-and-drop nhận thư mục và kho lưu trữ rồi chuyển qua cùng pipeline tải.

Đầu ra:
- **project_out**: ProjectPayload với cây đã quét, danh sách file phẳng, tổng dung lượng và phân rã theo loại cho các node phía sau hỗ trợ project.
- **stats**: Đầu ra chẩn đoán chỉ dành cho DEV.

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

Epsilon: Độ lệch tối đa so với đường cong gốc. Giá trị cao hơn sẽ loại bỏ nhiều khung hình chính hơn nhưng có thể mất chi tiết đường cong.
Steep: Ngưỡng nhạy độ cong. Bảo vệ các đường cong phức tạp khỏi bị làm phẳng thành đường thẳng.
Round Mode: Chế độ làm tròn cho giá trị đã tối ưu: Không (giữ nguyên), Thập phân (1 chữ số), Số nguyên.
Golden Rule: Khi bật, bảo vệ các đường cong có hình dạng/diện tích quan trọng khỏi bị đơn giản hóa bởi RDP.
S Run Length: Số lượng tối thiểu các đường cong S chuẩn của Spine liên tiếp trước khi cơ chế làm phẳng theo mẫu này được kích hoạt. Đặt 0 để tắt tính năng.
S Deviation: Độ lệch chuẩn hóa cho phép so với mẫu đường cong S chuẩn của Spine, tính theo phần nghìn (0-300). Giá trị thấp yêu cầu khớp sát hơn; giá trị cao làm phẳng nhiều chuỗi gần với mẫu hơn.

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

Max Error: Sai số xấp xỉ tối đa cho phép khi khớp spline. Thấp hơn = khớp gần hơn với bản gốc.
Min Group Size: Số khung hình chính tuyến tính liên tiếp tối thiểu cần thiết để tạo nhóm có thể loại bỏ.

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

Error Tolerance: Độ lệch tối đa cho phép giữa đường cong gốc và Bézier đã khớp. Thấp hơn = khớp chính xác hơn.
Max Iterations: Số vòng lặp tinh chỉnh cho khớp đường cong. Nhiều hơn = khớp tốt hơn nhưng chậm hơn.

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.

Precision: Số chữ số thập phân cho giá trị khung hình chính. Ít hơn = tệp nhỏ hơn nhưng độ chính xác thấp hơn.

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.

Remove Unused Color Tracks: Loại bỏ các thành phần màu/alpha không bao giờ thay đổi so với mặc định.
Remove Redundant IKRotation: Loại bỏ khung hình chính xoay xương được điều khiển hoàn toàn bởi ràng buộc IK.
Remove Redundant Path Constraint Keys: Loại bỏ khung hình chính ràng buộc đường dẫn giống với giá trị thiết lập.
Sanitize Non English Characters: Thay thế ký tự không phải ASCII trong tên xương/slot bằng ký tự an toàn.

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

Scale Bones: Tỷ lệ vị trí và kích thước xương.
Scale Attachments: Tỷ lệ vị trí và kích thước đính kèm.
Scale Animations: Tỷ lệ khung hình chính hoạt ảnh.
Scale Constraints: Tỷ lệ tham số ràng buộc.
Scale Path: Tỷ lệ dữ liệu đường dẫn.

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.

Min Segment Size: Số khung hình chính tối thiểu trong một đoạn để xử lý.

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

Warn conflicts: Hiển thị cảnh báo khi có xung đột khi hợp nhất payload.

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.

Show changed: Chỉ hiển thị hoạt ảnh đã thay đổi.
Animation: Lựa chọn hoạt ảnh để xem.
Target: Xương/slot mục tiêu để xem.
Property: Thuộc tính hiển thị (xoay, dịch chuyển, v.v.).

Project Viewer

Displays a Spine project from the project_in socket for inspection and preview without mutating the incoming data.

Deduplicator

Deduplicates atlas projects by consuming project_inputs and returning payloads, atlas_projects, original_jsons, and shared_atlas_out for canonicalized downstream workflows.

The Deduplicator node scans all atlas regions for visually identical or near-identical sprites. It merges duplicates by choosing a canonical representative and remapping references. Several thresholds control detection sensitivity for different sprite types (glow, solid, alpha). Optionally constrains the output canonical atlas dimensions. A verification pass ensures the deduplicated result is visually equivalent to the original within the specified RMSE tolerance.

Repack mode: Chế độ đóng gói lại sau loại trùng lặp.
Glow threshold: Ngưỡng phát hiện sprite hiệu ứng phát sáng.
Solid threshold: Ngưỡng phát hiện sprite đặc.
Min sprite area: Diện tích sprite tối thiểu để phân tích (pixel²).
Alpha hash threshold: Ngưỡng hash alpha để so sánh.
Verification threshold: Ngưỡng xác minh loại trùng lặp.
Color rmse threshold: Ngưỡng RMSE màu để phát hiện trùng lặp.
Constrain canonical atlas size: Ràng buộc kích thước atlas chuẩn.
Max canonical atlas width: Chiều rộng tối đa atlas chuẩn.
Max canonical atlas height: Chiều cao tối đa atlas chuẩ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

Page Info: Kích thước và thông tin trang atlas.
Stats: Thống kê sử dụng diện tích và số sprite.

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.

Asset select: Lựa chọn tài sản để xem.
Pixel stats: Hiển thị thống kê pixel cho tài sản.