AnasayfaBlog › Render Hattı

LabelInn Render Hattının İçinde — 480 ms'de Canvas'tan Zebra'ya

Bir termal etiket baskısındaki kullanıcı-görünür gecikme, altta yatan yazılım mimarisinin her gün onu kullanan insanlara görünür olduğu nadir yerlerden biridir. Bas'a basın, yazıcının meşgul olduğunu görün. O iki an arasındaki boşluk büyükse — birkaç yüz milisaniyenin ötesinde herhangi bir şey — operatör fark eder. Küçükse kimse konuşmaz.

Bu yazı, o boşluk sırasında LabelInn'in içinde ne olduğuna dair geliştirici-hedefli bir incelemedir. Hiçbiri patentli değil. Hiçbiri roket bilimi değil. Tamamı, gerek olmayan her katmandan gecikmeyi çıkarmanın sıkıcı disiplini, artı diğer etiket-baskı platformlarının yapmadığı birkaç bilinçli karar.

Beş aşamalı hat

Tek bir etiket baskısı için hat uçtan uca beş aşama çalışır:

  1. Canvas durum anlık görüntüsü — kullanıcı Bas'a bastığı anda tasarım canvas'ının canlı durumu
  2. Eleman bazlı değer çözümü — her dinamik elemanın veri kaynağı son bir dizgeye veya görüntüye değerlendirilir
  3. Render — çözülmüş canvas yazıcı-yerel komut akışına rasterleştirilir
  4. Taşıma — komut akışı fiziksel kanalı üzerinden yazıcıya teslim edilir (USB, TCP, Bluetooth)
  5. Denetim yazımı — ne basıldığının kaydı kalıcı depolamaya yazılır

N etiketin toplu baskısı için 2-4. aşamalar çalışan isolate'lara paralelleştirilir. Tek bir etiket için hat sırayla çalışır ancak her aşama tipik durumda sub-100 ms olacak şekilde ayarlanır.

Aşama 1 — Canvas durum anlık görüntüsü

Kullanıcının baktığı canvas reaktif bir depodur. Bas tuşu, tıklama anında o deponun tüm durumunu tek bir değişmez değer olarak yakalar. Yakalama bir işaretçi kopyasıdır — serileştirme yok, widget ağacında yürüme yok, derin klon yok. Sub-mikro saniye.

Bu, denetim makinesinin kullanıcı Bas'a bastığında canvas'ta gerçekten ne olduğunu kaydetmek için kullandığı anlık görüntüdür — baskı diyaloğunda yapılan elle düzenlemeler dahil. Bunun neden önemli olduğu için sorumluluk vaka çalışmasına bakın.

Aşama 2 — Eleman bazlı değer çözümü

Bir etiketteki her dinamik eleman bir veri kaynağına sahiptir. Çözücü anlık görüntüyü dolaşır ve her elemanı son bir değere çözer:

Çözücü, en yavaş eleman türünün API bağlama olacağı şekilde tasarlanmıştır ve bu, önbelleği ısıtan ön getirme tarafından sınırlandırılmıştır. Operatör için her eleman bazlı çözüm bir hash aramasıdır; tüm etiketin çözümü tipik olarak sub-milisaniyedir.

Çözülmüş değerler aynı zamanda denetim kaydına yazılanlardır. Bu, yukarıdaki vaka çalışmasında tartışılan elle düzenleme sorumluluk boşluğunu kapatan mimari karardır.

Aşama 3 — Render

Render, çözülmüş canvas'ı alır ve yazıcı-yerel komut akışını üretir. Zebra ailesi yazıcılar için bu ZPL'dir. TSC için TSPL'dir. Bixolon için SLCS. Brother için P-touch ESC. Epson ColorWorks için farklı bir ESC varyantı. Render edici, raster bitmap üzerinde değil eleman listesi üzerinde çalışan küçük dönüştürmelerin bir hattıdır — bu da 12 elemanlı bir 4×6" etiketin tek haneli milisaniyelerde render edildiği anlamına gelir, bir bitmap oluşturuyor olsaydık göreceğiniz onlarca-yüz milisaniyede değil.

Yerel elemanlar (metin, barkod, çizgi, dikdörtgen, görüntü) bu şekilde oluşturulur. HTML elemanları için — gerçek HTML, CSS ve JavaScript çalıştıran canvas ilkelinin Chart.js, D3 ve Three.js dahil — render edici sıcak bir WebView havuzuna açılır ve sonuçtaki bitmap'leri aynı komut akışına birleştirir. Mimari HTML eleman yazısında ele alınır.

Aşama 4 — Taşıma

Komut akışı fiziksel kanalı üzerinden yazıcıya teslim edilir. Taşıma katmanı kanal başına bölünmüştür:

Taşıma mutlak terimlerle en uzun-kuyruk aşamasıdır çünkü yazıcının mekanik meşguliyeti (motor uyanması, kafa ısıtması, etiket indeksi) burada. Sıcak yazıcılar için uçtan uca taşıma 100-300 ms ekler. On beş saniye boşta olan bir yazıcı için yalnızca motor uyanması 200 ms ekler — ve yazılım tarafında bunu optimize etmek için bir şey yoktur.

Aşama 5 — Denetim yazımı

Denetim yazımı, baytlar yazıcıya gittikten sonra gerçekleşir. Kullanıcının kritik yolundan uzaktadır. Kayıt canvas anlık görüntüsünü, çözülmüş eleman bazlı değerleri, operatör kimliğini, yazıcı kimliğini ve zaman damgalarını taşır. Bir sunucu tarafı tetikleyici kaydı kiracı başına HMAC anahtarıyla imzalar (FDA Part 11 beyaz kâğıdına bakın) ve hash zincirli deftere bağlar.

Sıcak yazıcıda uçtan uca zamanlama

AşamaTipik99. yüzdelik
Canvas anlık görüntü< 1 µs< 1 µs
Eleman bazlı çözüm (12 eleman)~0,5 ms2 ms
Yazıcı komut akışına render3-8 ms20 ms
Sıcak bir yazıcıya LAN/USB üzerinden taşıma100-250 ms400 ms
Yazıcı meşguliyeti (motor + kafa + indeks)150-250 ms500 ms
Uçtan uca "Bas'a bas" → etiket meşgul~280-480 ms~900 ms
Denetim yazımı (eşzamansız, operatör yolundan uzakta)30-60 ms200 ms

Bu operatöre ne verir

Saniyede bir birim çalışan bir hattaki operatör için hat takip eder. Yeni bir şablonu doğrulayan bir testçi için Bas-baskıya-meşgul döngüsü interaktif olacak kadar kısadır: bir değeri değiştirirsiniz, Bas'a basarsınız, sonucu görürsünüz, tekrar değiştirirsiniz. Platforma karşı entegre olan bir geliştirici için baskı, entegrasyon test döngüsünün donanımda darboğaz olmayacak kadar hızlıdır.

Bu özelliklerin hiçbiri otomatik değildir. Her biri belirli bir mimari kararın sonucudur — OS kuyruğunu atla, isolate'lara paralelleştir, veri kaynaklarını önceden ısıt, denetim yazımını operatör yolundan uzak tut. Bunlardan herhangi birini çıkarın ve hat yavaşlar.

Hattınızın Koştuğundan Daha Hızlı Yazdırın

✓ Sub-500 ms canvas-meşguliyet, tipik ✓ Toplu paralellik için isolate havuzu ✓ Çoklu protokollü cihaz taşıması (USB, TCP, BT)

Mevcut etiket-baskı aracınız bir üretim hattında darboğazsa, onu değiştiren mimari budur.

14 günlük Pro denemeyi başlat →