เมืองในขวด – ระบบเรย์แคสติ้ง 256 ไบต์
(frankforce.com)City In A Bottle – ระบบเรย์แคสติ้ง 256 ไบต์
-
บทนำ
- วันนี้ขอแนะนำเอนจินเรย์แคสติ้งขนาดเล็กและตัวสร้างเมืองที่บรรจุอยู่ในไฟล์ HTML ขนาด 256 ไบต์
- โปรแกรมนี้รวมแนวคิดหลายอย่างไว้ในพื้นที่เล็กมาก จนสามารถทำความเข้าใจได้เหมือนการแก้ปริศนา
- องค์ประกอบหลักคือโค้ด HTML, ลูปอัปเดตเฟรม, ระบบเรนเดอร์, เอนจินเรย์แคสติ้ง และตัวเมืองเอง
-
โค้ดทั้งหมด
- โค้ดนี้ไม่ใช่เพียง JavaScript snippet แบบง่าย ๆ แต่เป็นโปรแกรม HTML ทั้งชุด
-
<canvas style=width:99% id=c onclick=setInterval('for(c.width=w=99,++t,i=6e3;i--;c.getContext`2d`.fillRect(i%w,i/w|0,1-d*Z/w+s,1))for(a=i%w/50-1,s=b=1-i/4e3,X=t,Y=Z=d=1;++Z<w&(Y<6-(32<Z&27<X%w&&X/9^Z/8)*8%46||d|(s=(X&Y&Z)%3/Z,a=b=1,d=Z/w));Y-=b)X+=a',t=9)>
โค้ด HTML
- โค้ด HTML
- ส่วน HTML ประกอบด้วยองค์ประกอบ canvas แบบเรียบง่ายและอีเวนต์ onclick
-
<canvas style=width:99% id=c onclick=setInterval('',t=9)> - id ขององค์ประกอบ canvas ถูกตั้งเป็น
cเพื่อให้ JavaScript เข้าถึงได้ - อีเวนต์ onclick ใช้เริ่มโปรแกรม และสร้างลูปอัปเดตผ่านการเรียก
setInterval
โค้ด JavaScript
-
โค้ด JavaScript
- โค้ด JavaScript ขนาด 199 ไบต์ที่จะทำงานเมื่อคลิกที่ canvas
-
for(c.width=w=99,++t,i=6e3;i--;c.getContext`2d`.fillRect(i%w,i/w|0,1-d*Z/w+s,1))for(a=i%w/50-1,s=b=1-i/4e3,X=t,Y=Z=d=1;++Z<w&(Y<6-(32<Z&27<X%w&&X/9^Z/8)*8%46||d|(s=(X&Y&Z)%3/Z,a=b=1,d=Z/w));Y-=b)X+=a
-
การวิเคราะห์โค้ด
- มีการแยกโค้ดออกมาเพื่อให้อ่านง่ายขึ้น
-
c.width = w = 99 ++t for (i = 6e3; i--;){ a = i%w/50 - 1 s = b = 1 - i/4e3 X = t Y = Z = d = 1 for(; ++Z<w & (Y < 6 - (32<Z & 27<X%w && X/9^Z/8)*8%46 || d | (s = (X&Y&Z)%3/Z, a = b = 1, d = Z/w));) { X += a Y -= b } c.getContext`2d`.fillRect(i%w, i/w|0, 1 - d*Z/w + s, 1) }
-
คำอธิบายโค้ดทีละขั้น
c.width = w = 99: กำหนดค่าเริ่มต้นให้ canvas และตั้งความกว้างเป็น 99 พิกเซล++t: เพิ่มค่าตัวแปรเวลาเพื่อสร้างแอนิเมชันfor (i = 6e3; i--;){}: วนลูปเพื่อกำหนดความสว่างของแต่ละพิกเซลa = i % w / 50 - 1: คำนวณองค์ประกอบแนวนอนของเวกเตอร์กล้องb = s = 1 - i / 4e3: คำนวณองค์ประกอบแนวตั้งของเวกเตอร์กล้องX = t: ใช้ค่าเวลาเป็นตำแหน่ง X เริ่มต้นY = Z = d = 1: กำหนดค่าเริ่มต้นให้ Y, Z, dfor(; ++Z<w & ...;): ระบบเรย์แคสติ้งจะวนลูปจนกว่าจะตรวจพบการชนc.getContext2d.fillRect(i%w, i/w|0, 1 - d*Z/w + s, 1): วาดแต่ละพิกเซลเพื่อสร้างภาพสุดท้าย
การเรียนรู้เพิ่มเติม
- การเรียนรู้เพิ่มเติม
- เดโมนี้ถูกส่งเข้าร่วมงานเดโมปาร์ตี้ Revision 2022 และสามารถดูได้บน Pouet
- สามารถดูเวอร์ชันที่ขยายเป็นเชดเดอร์ 256 ไบต์ได้บน Shadertoy
- มีเครื่องมือแบบอินเทอร์แอ็กทีฟที่สร้างโดย Daniel Darabos ซึ่งสามารถใช้ปรับแต่งแง่มุมต่าง ๆ ของโปรแกรมได้แบบเรียลไทม์
ความเห็นของ GN⁺
-
จุดที่น่าสนใจ
- โปรแกรมนี้แสดงให้เห็นวิธีสร้างกราฟิกที่ซับซ้อนด้วยโค้ดขนาดเล็กมาก
- ใช้เพียงคณิตศาสตร์พื้นฐานที่แม้แต่วิศวกรซอฟต์แวร์ระดับเริ่มต้นก็เข้าใจได้ง่าย
- เป็นตัวอย่างที่ดีของการทำโค้ดให้เหมาะที่สุดและแนวมินิมัล ซึ่งอาจเป็นประโยชน์ในการแข่งขันอย่าง code golf
-
มุมมองเชิงวิจารณ์
- โค้ดถูกบีบอัดอย่างมาก จนอาจทำให้อ่านยาก
- เหมาะกับจุดประสงค์เชิงศิลปะและการทดลองมากกว่าการใช้งานจริง
-
เทคโนโลยีที่เกี่ยวข้อง
- โปรเจ็กต์ที่คล้ายกันสามารถดูตัวอย่างเชดเดอร์หลากหลายแบบได้บน Shadertoy
- สามารถสำรวจตัวอย่างโค้ดขนาดเล็กอื่น ๆ ได้บนแพลตฟอร์มอย่าง Dwitter
-
ข้อควรพิจารณาในการนำเทคโนโลยีไปใช้
- หากจะนำเทคโนโลยีนี้ไปใช้ ควรพิจารณาเรื่องความอ่านง่ายและการบำรุงรักษาของโค้ด
- ควรตระหนักถึงความยากในการปรับแต่งประสิทธิภาพและการดีบัก ที่มาพร้อมกับการทำฟังก์ชันซับซ้อนด้วยโค้ดขนาดเล็ก
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
สรุปรวมความคิดเห็นจาก Hacker News
1K Pinball Game in JavaScript:
การสร้างเชิงกระบวนวิธีและ lazy evaluation:
ความคิดเห็นอื่น ๆ: