1 คะแนน โดย GN⁺ 2024-08-11 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 175 Pixel Font Megapack ที่เปิดตัวในเดือนธันวาคม 2023 เป็นโปรเจกต์ฟอนต์พิกเซลที่ใช้ toolchain Rust ที่สร้างเองในการสร้างฟอนต์ ทดสอบคุณภาพ และจัดจำหน่าย
  • แพ็กก่อนหน้ามีฟอนต์ 12 แบบในปี 2016 และ 40 แบบในปี 2018 ส่วนแพ็กใหม่นี้เริ่มต้นด้วยเป้าหมายที่จะยกระดับ คุณภาพ·สไตล์·การรองรับภาษา·ระบบอัตโนมัติในการจัดจำหน่าย ไปพร้อมกัน
  • ฟอนต์ใหม่ก้าวข้ามข้อจำกัดเดิมที่รองรับเฉพาะ ASCII โดยรองรับตัวอักษรละตินเสริม 176 ตัวสำหรับ EFIGS แต่ตัดภาษาเอเชียและตัวอักษรที่ไม่ใช่ละตินออกไปเนื่องจากปัญหาด้านคุณภาพและเวลาการผลิต
  • เครื่องมือ Rust ชื่อ pifo สร้างเส้นขอบ glyph, kerning อัตโนมัติ, TTF, tilesheet และ texture atlas แบบแพ็ก จาก PNG tilesheet และการตั้งค่า TOML และประมวลผลฟอนต์ทั้ง 175 แบบได้ภายในไม่กี่วินาที
  • ภาพตัวอย่างขนาดใหญ่, kerning อัตโนมัติ และสคริปต์จัดจำหน่าย butler สำหรับ itch.io ช่วยลดภาระการตรวจทาน·แก้ไข·อัปโหลดด้วยมือ ทำให้ปรับปรุงคุณภาพฟอนต์เกือบ 200 แบบได้อย่างรวดเร็ว

จากแพ็กฟอนต์พิกเซลก่อนหน้า สู่ Megapack

  • แพ็กฟอนต์แรกในปี 2016 เป็นชุดฟอนต์ 12 แบบที่ทำขึ้นในช่วงเริ่มทำงานกับ Ikenfell
    • นำฟอนต์ที่ทำไว้สำหรับเกมมาขัดเกลาและเพิ่มอีกสองสามแบบ แล้วขายบน itch.io
    • ถูกนำไปใช้ในเกมอินดี้หลายเกม และได้รับเสียงตอบรับที่ดี
  • แพ็กที่สองในปี 2018 เพิ่มเป็น ฟอนต์ 40 แบบ และคุณภาพก็ดีขึ้นมาก
    • สร้างตาราง kerning เพื่อให้การเรนเดอร์ประโยคดูดีขึ้น
    • มีรูปแบบที่ build ไว้ล่วงหน้าให้ใช้งานง่ายในเกมเอนจินหลายตัวด้วย
    • โปรโมตด้วยวิธีนำฟอนต์ของตนไปใส่ในภาพสกรีนช็อตเกมของนักพัฒนาอินดี้ให้ดู
  • แพ็กก่อนหน้าถูกใช้ในเกมอินดี้หลายร้อยเกม และยังถูกใช้ใน Cadence of Hyrule ของ Nintendo ด้วย
    • ฟอนต์หลายแบบยังถูกใช้ใน Get in the Car, Loser ของ Love Conquers All Games ด้วย
  • หลังจาก Ikenfell วางจำหน่าย แม้จะมีช่วง burnout ยาวนาน แต่ก็พัฒนาทักษะ Rust ต่อไป และทำงานด้านฟอนต์ต่อเนื่องเพื่อสักวันหนึ่งจะสร้างแพ็กฟอนต์พิกเซลใหม่

เป้าหมายของ Megapack

  • เป้าหมายเริ่มต้นของแพ็กใหม่คือฟอนต์ 100 แบบ แต่ผลลัพธ์สุดท้ายคือ ฟอนต์พิกเซล 175 แบบ
    • แพ็กก่อนหน้ามี 12 แบบและ 40 แบบตามลำดับ
    • แพ็กใหม่นี้ตั้งเป้าให้มีฟอนต์ที่ใช้ได้กับหลากหลายแนว เช่น ไซไฟ แฟนตาซี สยองขวัญ ฟาร์ม และเกม cozy
  • คำขอและข้อร้องเรียนที่ใหญ่ที่สุดเกี่ยวกับแพ็กก่อนหน้าคือ รองรับเฉพาะอักขระ ASCII
    • แพ็กใหม่เลือกใช้ชุดตัวอักษรละตินเสริมเพื่อรองรับ EFIGS ซึ่งหมายถึง English, French, Italian, German, Spanish
    • ชุดอักขระสุดท้ายมี 176 ตัว
    • ภาษาเอเชียหรือภาษาที่ไม่ได้ใช้ตัวอักษรละตินถูกตัดออก เพราะเป็นชุดตัวอักษรที่ไม่คุ้นเคย ทำให้ยากที่จะได้คุณภาพตามต้องการ และต้องใช้เวลาผลิตเพิ่มขึ้นมาก
  • UI เกมจำเป็นต้องมีลำดับชั้นทางสายตา จึงต้องการทำให้แต่ละฟอนต์ไม่ใช่สไตล์เดียว แต่เป็น font family
    • ตัวอย่างเช่น font family Virtue มีสไตล์ 20 แบบ
    • นักพัฒนาสามารถปรับขนาดและน้ำหนักตัวอักษรได้โดยไม่ต้องผสมฟอนต์ที่มีบรรยากาศต่างกัน
  • Kerning เป็นปัจจัยที่กินเวลามากในการทำแพ็กก่อนหน้า
    • หากรองรับอักขระ 176 ตัว คู่ kerning ที่เป็นไปได้อาจเพิ่มขึ้นได้สูงสุดถึง 176² คู่
    • เพื่อไม่ต้องกรอกทุกคู่ด้วยมือ จึงเลือกวิธีคำนวณส่วนใหญ่แบบอัตโนมัติ และกรอกด้วยมือเฉพาะส่วนที่อัลกอริทึมยังทำได้ไม่พอ
  • การควบคุมคุณภาพและการจัดจำหน่ายก็เป็นเป้าหมายของระบบอัตโนมัติด้วย
    • ก่อนหน้านี้เมื่อแก้ข้อผิดพลาดของพิกเซลหรือบั๊ก kerning แล้ว ต้อง export ใหม่ ทดสอบ และอัปโหลดไป itch.io ด้วยตนเอง
    • toolchain ใหม่ตั้งเป้าให้สร้างข้อความตัวอย่างและการแสดงผล kerning เพื่อค้นหาปัญหาได้เร็ว และตรวจสอบผลการแก้ไขได้ทันที

การเตรียมตัวเพื่อยกระดับคุณภาพการออกแบบฟอนต์

  • แม้จะมีประสบการณ์ด้าน pixel art และฟอนต์พิกเซลมาก แต่ไม่เคยศึกษางาน ออกแบบตัวอักษร แบบดั้งเดิมอย่างจริงจัง
  • ระหว่างทำงานได้อ้างอิง Design School: Type ของ Richard Poulin
    • ใช้เป็นหนังสือเบื้องต้นที่ช่วยให้เรียนรู้ศัพท์และแนวปฏิบัติของการออกแบบตัวอักษร
  • ยังรวบรวมภาพถ่ายข้อความที่พบรอบตัวเป็น reference ด้วย
    • ป้ายร้านเล็ก ๆ พิพิธภัณฑ์ แกลเลอรี เทศกาล โปสเตอร์งานท้องถิ่น และปกหนังสือ กลายเป็นวัสดุอ้างอิง
    • ไม่ได้ทำเพื่อคัดลอกฟอนต์ แต่เพื่อศึกษารูปทรงตัวอักษร ตัวอักษรที่ลงต่ำกว่า baseline และความแตกต่างระหว่างตัวอักษรบางกับกว้าง
  • จากการสังเกตฟอนต์ตกแต่งที่เห็นกลางแจ้ง ได้เรียนรู้ว่าฟอนต์ที่ “หรูหรา” จำนวนมากไม่ได้ประดับตัวอักษรทุกตัวมากเกินไป แต่เน้นการตกแต่งที่ตัวพิมพ์ใหญ่ และจัดการตัวพิมพ์เล็กอย่างละเอียดอ่อนกว่า

บทบาทของเครื่องมือ Rust pifo

  • เพื่อบรรลุเป้าหมาย จึงเขียนโปรแกรม Rust ของตัวเองชื่อ pifo
  • การออกแบบฟอนต์เองทำในเครื่องมือ pixel art ทั่วไป
    • อินพุตคือ PNG tilesheet และไฟล์ TOML สำหรับตั้งค่า
    • ตัวอย่างคำสั่งอยู่ในรูป pifo --all --output "Faraway" --input "Faraway*"
  • pifo ตัดภาพอินพุตเป็นไทล์ glyph แยกกัน สร้างเส้นขอบ glyph คำนวณคู่ kerning อัตโนมัติ แล้ว export เป็นไฟล์ TTF
    • สร้างรูปแบบอื่น ๆ สำหรับใช้โดยตรงในเอนจินหลายตัวควบคู่กันด้วย
    • งานของ glyph แต่ละตัวถูกทำแบบขนาน ทำให้ฟอนต์หนึ่งแบบประมวลผลได้แทบจะทันที
    • แม้จะประมวลผลฟอนต์ 175 แบบทีละตัว ก็ใช้เวลาเพียงไม่กี่วินาที
  • Rust crate หลักที่ใช้มีดังนี้
    • clap: แยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่ง
    • image: ถอดรหัสและเข้ารหัสภาพ
    • rayon: การประมวลผลแบบขนาน
    • serde: serialization ข้อมูล
    • glyph-names: แมปอักขระกับชื่อ glyph
    • ab-glyph: โหลดฟอนต์และ rasterization
    • crunch: การแพ็กสี่เหลี่ยม

กระบวนการสร้างเส้นขอบ glyph

  • ฟอนต์ชีตแต่ละชุดประกอบด้วย tilesheet และไฟล์ตั้งค่า TOML
    • การตั้งค่ามี version, baseline, line_gap, spacing, metrics, auto_kerning, auto_kerning_min, manual_kerning, skip_kerning_left, skip_kerning_right เป็นต้น
    • ขนาดกริดอาจแตกต่างกันได้ แต่ต้องเป็นกริดที่สม่ำเสมอเสมอ และอักขระต้องอยู่ในตำแหน่งที่กำหนด
    • เครื่องมือประมวลผลเฉพาะพิกเซลสีขาว 100% เท่านั้น ส่วนพื้นหลังลายตารางและ baseline ใช้เป็นเพียงไกด์
  • TrueType glyph ประกอบด้วย เส้นขอบ (contour) หนึ่งเส้นขึ้นไป
    • ในฟอนต์พิกเซล ต้องสร้างเส้นขอบให้กับแต่ละกลุ่มพิกเซลที่เชื่อมต่อกัน หรือแต่ละ cluster
    • ตัวอย่างเช่น ถ้าตัวพิมพ์เล็ก t มีพิกเซลสองก้อนที่แยกจากกัน ก็ต้องมีเส้นขอบสองเส้น
  • การสร้างเส้นขอบดำเนินเป็นหลายขั้นตอน
    • เลือกเฉพาะพิกเซลสีขาวจาก RgbaImage แล้วรวบรวมเป็น HashSet ของโครงสร้าง Point
    • เริ่มจากพิกเซลใดก็ได้ ทำ flood fill ไปยังพิกเซลที่อยู่ติดกัน และทำซ้ำจนไม่เหลือพิกเซลที่ยังไม่ถูกเยี่ยมชม เพื่อหา cluster
    • ในแต่ละ cluster เก็บด้านที่ไม่มีพิกเซลข้างเคียงเป็น edge ที่เปิดออก
    • เชื่อม head และ tail ของ edge เพื่อสร้างเส้นทางปิด แล้วแปลงเป็นเส้นขอบ
  • Cluster ที่มีรูสามารถสร้างเส้นขอบได้หลายเส้น
    • เส้นขอบด้านนอกวนตามเข็มนาฬิกา ส่วนรูด้านในวนทวนเข็มนาฬิกา
    • ความต่างของทิศทางนี้สอดคล้องกับวิธีที่ TTF ใช้แสดงรู
  • จุดกลางบนเส้นตรงต่อเนื่องจะถูกลบออก
    • เป็นการปรับแต่งเพื่อลดขนาดไฟล์และเพิ่มความเร็วในการ rasterize

ระบบอัตโนมัติสำหรับตาราง kerning

  • สิ่งที่ต้องมีถัดจากเส้นขอบในการสร้าง TTF คือ ตาราง kerning
    • ตาราง kerning จะดึงคู่ตัวอักษรบางคู่ไปทางซ้าย เพื่อให้คำดูเป็นธรรมชาติมากขึ้น
    • ตัวอย่างเช่น ถ้าดึงคู่ Va, lt ไปทางซ้าย 1 พิกเซล ก็จะดูดีขึ้น
  • Kerning แบบกำหนดเองระบุใน manual_kerning ของ TOML
    • ใช้รูปแบบเช่น { left = "V", right = "a", kern = -1 }
    • รองรับตัวเลือก alts = true เพื่อไม่ต้องกำหนดอักขระมีเครื่องหมายกำกับทุกตัวแยกกัน
    • แมปอักขระทางเลือกอย่าง àáâãäå กับ a เพื่อใช้ kerning เดียวกัน
  • Kerning อัตโนมัติคำนวณโดยเลื่อน glyph ด้านขวาไปทางซ้ายทีละ 1 พิกเซล
    • หา ตำแหน่งที่ใกล้ที่สุดที่ไม่แตะกับ glyph ด้านซ้าย
    • การสัมผัสกันที่มุมก็ถือว่าแตะกันด้วย
    • ในตัวอย่าง LV สามารถดึง V ได้ 1 พิกเซล แต่ 2 พิกเซลจะทำให้พิกเซลแตะกัน ดังนั้นค่า kerning คือ -1
  • การคำนวณ kerning อัตโนมัติเคารพค่าที่กำหนดเองและการตั้งค่ายกเว้น
    • ใช้ skip_kerning_left, skip_kerning_right เพื่อยกเว้น glyph ในทิศทางใดทิศทางหนึ่งได้
    • ใช้ rayon เพื่อคำนวณคู่ kerning ทั้งหมดแบบขนาน

รูปแบบการ export

  • PIFO ไม่ได้สร้างแค่ TTF แต่ยังสร้าง tilesheet และ texture atlas แบบแพ็กด้วย
  • ไฟล์ TTF เป็นไฟล์ไบนารีที่ประกอบด้วยตารางหลายชุด
    • เครื่องมือ export เติมตาราง head, hhea, maxp, OS/2, hmtx, cmap, loca, glyf, kern, name, post
    • แต่ละตารางต้องบันทึกตำแหน่ง ความยาว และ checksum และจัดการด้วย begin_table() กับ end_table()
  • ขนาดพื้นฐานของฟอนต์พิกเซลกำหนดเป็น 16
    • เมื่อเรนเดอร์ที่ขนาด 16 พิกเซลจะตรงกับ 1 px พอดี
    • หากต้องการขยายโดยไม่สั่น ให้เรนเดอร์เป็นเลขคูณของ 16 เช่น 32, 48, 64
  • การ export tilesheet จะเรียงตามลำดับ Unicode codepoint ต่างจากชีตอินพุต
    • ไฟล์ข้อมูลที่สร้างมาด้วยกันมีแถว·คอลัมน์ ขนาดไทล์ baseline ระยะห่างบรรทัด ความกว้างช่องว่าง metrics ของ glyph และตาราง kerning
    • ใช้ serde เพื่อ serialize เป็นหลายรูปแบบ เช่น JSON, XML, TOML
  • สร้าง atlas แบบแพ็กด้วย
    • ใช้ crate แพ็กสี่เหลี่ยมที่สร้างเองชื่อ crunch
    • เมื่อแพ็กให้แน่น ข้อมูลตำแหน่งเดิมจะหายไป จึงมีข้อมูลเพิ่มเติมสำหรับการเรนเดอร์ เช่น x, y, w, h, off_x, off_y, adv

การทดสอบคุณภาพและภาพตัวอย่าง

  • เพื่อให้ได้คุณภาพตามต้องการ ได้เพิ่มฟีเจอร์ สร้างภาพตัวอย่างขนาดมหึมา เข้าไปใน PIFO
  • ภาพตัวอย่างประกอบด้วยบล็อกทดสอบหลายส่วน
    • ตัวอักษรทั้งหมดและประโยคทดสอบบางประโยค
    • บางส่วนจากเรื่องสั้น They're Made out of Meat ของ Terry Bisson
    • คำทดสอบที่ใช้กลยุทธ์จาก Text for Proofing Fonts: A farewell to The Quick Brown Fox
    • ชุดตัวเลขทั้งหมดและสัญลักษณ์สกุลเงิน
    • คู่ kerning ของตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก และตัวพิมพ์ใหญ่เล็กผสมกัน
    • เครื่องหมายวรรคตอนหลากหลายแบบ
  • ระหว่างทำงานสามารถสร้างภาพตัวอย่างได้ทันที จึงค้นหาและแก้ปัญหาได้เร็ว
    • กระบวนการนี้ช่วยยกระดับคุณภาพโดยรวมและความเรียบร้อยของฟอนต์เกือบ 200 แบบ

ระบบอัตโนมัติสำหรับการจัดจำหน่ายบน itch.io

  • ผลลัพธ์สุดท้ายคือ ฟอนต์พิกเซล 175 แบบ และเลือก itch.io ที่เคยใช้อยู่เป็นร้านขายออนไลน์สำหรับดาวน์โหลด
  • งานที่ยุ่งยากที่สุดคือการสร้างโปรเจกต์ itch แยกสำหรับแต่ละฟอนต์
    • งานนี้ต้องทำเพียงครั้งเดียวต่อฟอนต์
    • หลังจากนั้น การอัปโหลดและบำรุงรักษาสามารถจัดการด้วยสคริปต์บรรทัดคำสั่งได้
  • สคริปต์จัดจำหน่ายประกอบด้วยสามขั้นตอน
    • คอมไพล์ PIFO ในโหมด release
    • build asset ของฟอนต์ที่ต้องการ
    • อัปเดตโปรเจกต์ itch ของแต่ละฟอนต์ด้วย asset ใหม่
  • แพตเทิร์นอินพุตอย่าง --input "Faraway*" จะค้นหาสไตล์ที่มี prefix เดียวกัน เช่น Faraway - Regular, Faraway - Bold แล้วรวมเป็นแพ็กเกจ font family เดียว
  • การอัปโหลดขั้นสุดท้ายใช้เครื่องมือจัดจำหน่ายบรรทัดคำสั่ง butler ที่ itch มีให้
    • จัดจำหน่ายด้วยรูปแบบ butler push ../distro/faraway chevyray/pixel-font-faraway:assets
    • Butler ติดตามไฟล์ที่เปลี่ยนแปลงและอัปเดตเฉพาะส่วนที่จำเป็น จึงไม่ต้องทำ file hashing หรือการจัดการเวอร์ชันพิเศษแยกต่างหาก

1 ความคิดเห็น

 
GN⁺ 2024-08-11
ความคิดเห็นจาก Hacker News
  • เป็นฟอนต์ที่เจ๋งมาก และบทความก็น่าสนใจ
    เห็นเกมปลอมตรงมุมขวาบน https://chevyray.dev/blog/creating-175-fonts/old_previews.pn... แล้วก็คิดว่าอยากให้มันเป็นเกมจริง ๆ
    ชอบเพราะให้บรรยากาศคล้าย “Wonder Boy in Monster World สำหรับ GBA”
    แต่ดูจากไลเซนส์แล้ว ดูเหมือนว่า ไม่อนุญาตให้ใช้ TTF ในโปรเจกต์ซอฟต์แวร์โอเพนซอร์ส จึงควรระวังไว้
    ไม่ใช่ทนายความ แต่ข้อสุดท้ายอ่านแล้วเหมือนห้ามไว้อย่างชัดเจน: https://github.com/ChevyRay/pixel_font_megapack_license/blob...

    • ถ้าชอบเกมแพลตฟอร์ม แนะนำให้ลองเล่น Celeste
      ฉากในม็อกอัปนั้นอ้างอิงจากฉากเปิดของ Celeste
    • การแจกจ่ายตัวฟอนต์เองในรูปแบบโอเพนซอร์สหรือ CC นั้นไม่ได้แน่นอน แต่จะถึงขั้นห้ามนำไปใส่และแจกจ่ายร่วมกับซอฟต์แวร์ที่ส่วนอื่นเป็นโอเพนซอร์สหรือไม่นั้นยังดูคลุมเครือ
      เจตนาดูชัดว่าให้ใช้กับ เกมในขั้นผลิตภัณฑ์สุดท้าย ซึ่งโอเพนซอร์สพบได้น้อยกว่า มากกว่าจะใช้กับเกมเอนจินหรือเทมเพลต
      อ่านบทความนี้แล้วก็นึกถึงกรณีขอบเขตลิขสิทธิ์แบบอื่น ๆ ด้วย คือในสหรัฐฯ แบบตัวอักษร (typeface) ไม่ถือเป็นสิ่งที่ได้รับความคุ้มครองลิขสิทธิ์
      ฟอนต์ได้รับความคุ้มครองในฐานะโปรแกรมคอมพิวเตอร์ แต่แบบตัวอักษรและฟอนต์บิตแมปธรรมดาไม่ได้รับ
      ดังนั้นเวิร์กโฟลว์นี้จึงเหมือนกับการสร้าง TTF ที่มีลิขสิทธิ์จากไทล์ชีตต้นฉบับที่ไม่มีลิขสิทธิ์ แล้วก็ย้อนกลับไปเป็นไทล์ชีต/แอตลาสผลลัพธ์ที่ไม่มีลิขสิทธิ์อีกครั้ง
    • ควรเขียนว่า ในโปรเจกต์ซอฟต์แวร์โอเพนซอร์ส ไม่ใช่ “ในซอฟต์แวร์โอเพนซอร์ส”
  • น่าประทับใจจริง ๆ
    การทำชุดฟอนต์ที่สมบูรณ์อาจใช้เวลาได้ง่าย ๆ ถึง 1 ปี
    ต้องทำกลิฟทั้งหมดตั้งแต่ 'A' ถึง 'Z' ตัวพิมพ์ใหญ่/เล็ก วงเล็บ แอมเพอร์แซนด์ เครื่องหมายอัศเจรีย์ และถ้าเป็นไปได้ก็ต้องทำรูปแบบแปรผันอย่างตัวหนา/ตัวเอียงด้วย
    ถ้าไม่มีรูปแบบแปรผันเหล่านี้ การใช้งานฟอนต์ก็จะถูกจำกัด
    โดยเฉพาะสิ่งที่แยกฝีมือคือ kerning หรือระยะห่างระหว่างตัวอักษร ซึ่งถ้าจะหมกมุ่นก็หมกมุ่นได้ไม่รู้จบ
    ในเนื้อหาบทความก็บอกว่า หากรองรับ 176 ตัวอักษร จะต้องป้อนคู่ kerning ได้สูงสุด 176² = 37,976 คู่ จึงตัดสินใจสร้างเครื่องมือเองเพื่อกึ่งอัตโนมัติส่วนใหญ่ และป้อนด้วยมือเฉพาะส่วนที่อัลกอริทึมยังไม่พอ

    • นั่นเป็นเรื่องเมื่อจำกัดฟอนต์ไว้สำหรับใช้งานภาษาอังกฤษล้วน ๆ
      หากต้องการรองรับภาษาอื่น แม้แต่ภาษาที่ใช้ตัวอักษรละตินอย่างฝรั่งเศส สเปน อิตาลี โปรตุเกส ก็ยังต้องมี ตัวอักษรเพิ่มเติม
      จากนั้นก็อาจเริ่มอยากรองรับอักษรกรีก ซีริลลิก ญี่ปุ่น จีน ต่อไปอีก
      ตัวอย่างเช่น ตาม Wikipedia ระบุว่า “ฟอนต์ Noto รองรับมากกว่า 77,000 ตัวอักษร ซึ่งคิดเป็นประมาณครึ่งหนึ่งของ 149,186 ตัวอักษรที่นิยามไว้ใน Unicode 15.0”
    • ชุดฟอนต์ที่สมบูรณ์อาจใช้เวลาได้ง่าย ๆ ถึง 1 ปี แต่การทำ ตระกูลฟอนต์ อาจกลายเป็นโปรเจกต์ตลอดชีวิตได้
    • พูดตรง ๆ ว่า “ชุดฟอนต์ที่สมบูรณ์ใช้เวลาได้ง่าย ๆ ถึง 1 ปี” นั้นผมไม่ค่อยเข้าใจนัก
      อะไร ๆ ก็หมกมุ่นได้ไม่รู้จบทั้งนั้น
      สาขาอย่างภาษา การเขียน ดนตรี การประดิษฐ์อักษร ก็ดูเหมือนจะดึงดูดคนที่มีแนวโน้มหมกมุ่นได้มากเป็นพิเศษ
      ประเด็นคือคำพูดแบบนี้ฟังเหมือนเป็นการ สร้างกำแพงกั้นการเข้ามา
      คำพูดที่ทำให้คนซึ่งกำลังจะเข้ามาใหม่ในสาขาใดสาขาหนึ่งรู้สึกท้อ มักฟังดูอ่อนไหวอยู่เสมอ
  • ดีมาก
    สิ่งหนึ่งที่สงสัยคือทำไมถึงเลือกชุดย่อยนี้จากบรรดา อักขระพิเศษของสแกนดิเนเวีย
    ภาษาสวีเดนมี äöå ส่วนภาษานอร์เวย์/เดนมาร์กมี æøå แต่ฟอนต์นี้มี æ ทว่าไม่มี ø
    ถ้าอย่างนั้น แม้ตัด æ ออกก็ยังคงรองรับภาษาสวีเดนได้ และถ้าเพิ่ม ø ก็จะรองรับภาษานอร์เวย์กับเดนมาร์กได้ด้วย
    เลยสงสัยว่าเป็นการตกหล่นธรรมดา หรือมี locale ที่ใช้ æ แต่ไม่ใช้ ø อยู่หรือไม่
    อนึ่ง ไม่ได้สับสน æ กับลิเกเจอร์ œ ซึ่งเป็นกลิฟแยกที่ใช้ในภาษาฝรั่งเศส

    • ภาษาไอซ์แลนด์ใช้ ö แทน ø แต่ในขณะเดียวกันก็ต้องใช้ ð และ ý ซึ่งฟอนต์นี้ไม่มีด้วย
      อย่างไรก็ตาม Æ ก็ยังใช้ในข้อความภาษาอังกฤษโบราณอย่าง “encyclopædia” หรือในรูปพหูพจน์ของคำที่มาจากภาษาละตินอยู่บ้าง: https://en.wiktionary.org/wiki/Category:English_plurals_in_-...
    • อันนี้เป็นแค่การตกหล่นจริง ๆ
      อันที่จริง หลังจากโปรเจกต์เดินหน้าไปค่อนข้างมากแล้ว ถึงได้รู้ว่าในชุดตัวอักษรของผม ไม่มี ø
      การเพิ่มกลับเข้าไปในทุกฟอนต์แล้วออกแพตช์นั้นทำได้แน่นอน แต่กำลังรอดูว่ามีความต้องการมากพอให้ทำงานขนาดนั้นหรือไม่
      ถึงอย่างนั้น ถ้ารองรับได้เพิ่มอีกสองภาษาก็น่าจะเจ๋งไม่น้อย
  • ชอบฟอนต์บางตัวที่ใช้ในไซต์และการจัดสไตล์แบบเรียบง่ายด้วย
    โชคดีที่มีบทความแยกเผยแพร่ไว้: https://chevyray.dev/blog/how-this-site-is-made/#catppuccin-...

  • น่าสนใจ
    ก่อนหน้านี้ไม่รู้เลยว่าเวลานำฟอนต์พิกเซลไปเข้ารหัสเป็น TTF จะต้อง แปลงเป็นเวกเตอร์
    สำหรับคนที่โหลดไปใช้กับ text renderer ที่เหมาะสม ก็น่าจะทำให้ขยาย/ย่อได้ลื่นขึ้นในระดับหนึ่ง
    แน่นอนว่าเอนจินเกมที่ใช้ฟอนต์พิกเซลแทบจะ 1:1 อาจเป็นข้อยกเว้น

    • การทำแบบนั้นทำให้ใช้ได้กับโปรแกรมแก้ไขกราฟิกแบบดั้งเดิมอย่าง Photoshop, InDesign, Affinity, Aseprite ด้วย
      เครื่องมือเหล่านี้ไม่มีแนวคิดของ ฟอนต์พิกเซล ดังนั้นถ้าใช้ TTF ที่ปิด hinting และ anti-aliasing ก็จะนำไปใช้ในแอปเหล่านั้นได้
  • เจ๋งมาก
    ดีด้วยที่งานนี้ช่วยคนทำในเชิงการเงินได้
    ชื่อ Chevy Ray นี่จำได้จากแวดวงเกมอินดี้ แต่จำไม่ออกแน่ชัดว่าเขาทำอะไรไว้
    น่าจะเป็นอะไรสักอย่างในกระแสเดียวกับ VVVVVV, Nidhogg หรือ Canabalt ราว ๆ ปี 2010–2012

    • เป็น Flashpunk
      Beacon ก็ยอดเยี่ยมเหมือนกัน — ทำให้นึกถึงวันเก่า ๆ และคิดถึงเกมอินดี้
    • เกมที่พูดถึงน่าจะเป็น Beacon
    • Ikenfell
    • Ikenfell ก็เล่นสนุกมากจริง ๆ
    • Flashpunk?
  • ยอดเยี่ยม
    เวลาเห็น บุคคลแบบดาวินชี อย่างผู้เขียนบทความนี้ ก็ทำให้นึกถึงยุคที่ศิลปินกับวิศวกรไม่ได้แยกกันชัดเจน แต่เป็นคนคนเดียวกัน

    • ถ้าอย่างนั้นแนะนำให้อ่านเรื่องดาวินชีให้จริงจังกว่านี้
      ไม่ใช่บทความแนว “10 อันดับสิ่งประดิษฐ์ของดาวินชี”
      ในความเป็นจริง ระหว่างสองด้านนั้นมีเส้นแบ่งค่อนข้างใหญ่
      ผมเองก็สามารถโมเดลยานอวกาศที่จะไปถึง Alpha Centauri ใน Maya ด้วยไดนามิกส์น่าสงสัยที่ยังไม่ผ่านการพิสูจน์ได้เหมือนกัน
      แต่นั่นยังห่างไกลจากการสร้างมันขึ้นมาจริง ๆ แล้วส่งออกไปสู่อวกาศระหว่างดวงดาว
      ภาพวาดก็สวยและเต็มไปด้วยจินตนาการดี
  • ใน Rust การทำให้งานแบบนี้ รันบนหลายคอร์ นั้นง่ายจนน่าสนใจ
    แค่แทรกการเรียกหนึ่งครั้งเข้าไปใน chain ของฟังก์ชันก็อาจเพียงพอแล้ว

    • Rust ถูกออกแบบมาให้มีความปลอดภัยด้านหน่วยความจำและความปลอดภัยของเธรดเป็นพื้นฐาน
      ภายใต้สมมติฐานว่าทำตามกฎที่ภาษากำหนด มัลติเธรดดิ้ง ก็แทบจะ “ฟรี”
      กฎของ Amdahl ยังมีผลอยู่ แต่ อย่างน้อยแอปก็ไม่ระเบิดต่อหน้าต่อตา
    • นี่ไม่ใช่คุณสมบัติเฉพาะของ Rust
      Scala และ Java ก็รองรับความสามารถแบบนี้เป็นพื้นฐานเช่นกัน
  • เป็นงานที่ยอดเยี่ยมจริง ๆ และบทความก็ดีด้วย
    ถ้าใช้เทคนิคบางอย่าง ก็น่าจะทำให้อัลกอริทึมจำนวนมากเร็วขึ้นได้
    เท่าที่อ่านมา จุดชี้ทางอาจเป็นการเปลี่ยนแฮชแมปในการวาดตัวอักษรและการแมปตัวแปรของ ASCII ให้เป็น บิตแมปกับอาร์เรย์ดัชนีแบบไบต์
    แน่นอนว่าตอนนี้มันเร็วพออยู่แล้ว จึงไม่ได้สำคัญมากสำหรับโค้ดนี้

    • ดีใจที่หยิบเรื่องนี้ขึ้นมาพูด ถูกต้องทั้งหมดเลย
      ในเว็บไม่มีโค้ดทั้งหมด แต่จริง ๆ แล้วมีการจัดสรรและโคลนสตริงกับโครงสร้างข้อมูลค่อนข้างมาก
      จุดที่เห็นชัดก็เขียนโค้ดให้เหมาะสมที่สุดแล้ว ส่วนอย่างการคัดลอกบิตแมปหรืองานที่ขนานได้ง่ายนั้นเร็วถึงขั้นเสร็จแทบจะทันที จึงไม่ได้ลองปรับแต่งส่วนอื่นด้วยซ้ำ
      แต่ถ้าจะทำก็ทำได้
      เป็นเรื่องง่ายที่จะลืมไปว่าภาษา ที่ใกล้ระดับล่าง อย่าง Rust, C++, Go นั้นเร็วแค่ไหน และยิ่งเมื่อใช้เครื่องมือพื้นฐานสำหรับมัลติเธรดดิ้งกับคิวงาน ฯลฯ ก็ยิ่งเป็นแบบนั้น
  • คนที่สนใจฟอนต์ควรลองดู https://tomorrow.type.today/ ด้วย
    เป็น สตูดิโอไทโปกราฟี ที่ทำฟอนต์ต้นฉบับและเชิงทดลองที่ยอดเยี่ยม
    ในทีมเรามีคนหนึ่งที่หลงใหลไทโปกราฟีมาก จึงกำลังสร้างคอลเลกชันงานของพวกเขาไว้ที่ https://play.soot.com/tomorrowtypetoday

    • เผื่อไว้เป็นข้อมูล บริษัทนั้นจดทะเบียนในรัสเซีย