หลายวันก่อน ผลการทดลองออกแล้ว องค์กรบนพื้นฐานของการเปิดตัวของ เคอร์เนล Linux ภายในพื้นที่เสมือน 3 มิติ ของเกมผู้เล่นหลายคนออนไลน์
การทดลองนี้ เสร็จสิ้นบน VRChat ซึ่งช่วยให้โหลดโมเดล 3 มิติด้วย shaders ของตัวเองได้. ในการใช้แนวคิดที่คิดขึ้นนั้น โปรแกรมจำลองที่ใช้สถาปัตยกรรม RISC-V ได้ถูกสร้างขึ้นซึ่งทำงานบนฝั่ง GPU ในรูปแบบของพิกเซลเชดเดอร์
เกี่ยวกับโครงการ
อีมูเลเตอร์ขึ้นอยู่กับการใช้งานในภาษาซี ในทางกลับกันการสร้างนั้นใช้การพัฒนาตัวจำลอง riscv-rust ที่เรียบง่ายซึ่งได้รับการพัฒนาในภาษา Rust โค้ด C ที่เตรียมไว้จะถูกแปลเป็น Pixel Shader ในภาษา HLSL เหมาะสำหรับการโหลดลงใน VRChat
โปรแกรมจำลอง ให้การสนับสนุนอย่างเต็มที่สำหรับสถาปัตยกรรมชุดคำสั่ง rv32imasu หน่วยควบคุมหน่วยความจำ SV32 และชุดอุปกรณ์ต่อพ่วงขั้นต่ำ (UART และตัวจับเวลา) ความสามารถที่เตรียมไว้นั้นเพียงพอที่จะโหลดเคอร์เนล Linux 5.13.5 และสภาพแวดล้อมบรรทัดคำสั่งพื้นฐานของ BusyBox ซึ่งคุณสามารถโต้ตอบได้โดยตรงจากโลกเสมือน VRChat
ประมาณเดือนมีนาคม 2021 ฉันตัดสินใจเขียนโปรแกรมจำลองที่สามารถเรียกใช้เคอร์เนล Linux แบบเต็มใน VRChat เนื่องจากข้อจำกัดโดยธรรมชาติของแพลตฟอร์มนั้น เครื่องมือที่เลือกจึงต้องเป็นตัวสร้างเงา และหลังจากทำงานไม่กี่เดือน ตอนนี้ฉันภูมิใจที่จะแนะนำตัวจำลอง RISC-V CPU / SoC ตัวแรกของโลก (ที่ฉันรู้จัก) ใน HLSL pixel shader ที่สามารถทำงานได้ถึง 250 kHz (บน 2080 Ti) และ บูต Linux 5.13.5 พร้อมรองรับ MMU
อีมูเลเตอร์ถูกนำไปใช้ใน shader ในรูปแบบของพื้นผิวไดนามิกของตัวเอง (Unity Custom Render Texture) เสริมด้วยสคริปต์อุดรที่ให้ไว้สำหรับ VRChat ซึ่งใช้เพื่อควบคุมอีมูเลเตอร์ขณะรันไทม์
เนื้อหาหน่วยความจำหลักและสถานะตัวประมวลผลของระบบจำลองจะถูกบันทึกเป็นพื้นผิวที่มีขนาด 2048 × 2048 พิกเซล ดังนั้นจึงใช้งานโปรเซสเซอร์ที่จำลองที่ 250 kHz นอกจากลินุกซ์แล้ว Micropython ยังสามารถรันบนอีมูเลเตอร์ได้อีกด้วย
ในการใช้งาน Linux ฉันคิดว่าเราต้องการหน่วยความจำหลัก (RAM) อย่างน้อย 32 MiB แต่ขอให้ปลอดภัยและสร้าง 64 - ความแตกต่างด้านประสิทธิภาพจะไม่มาก และควรมี VRAM เพียงพอ
ในตอนแรก ความกังวลด้านประสิทธิภาพหลักคือความเร็วสัญญาณนาฬิกา นั่นคือจำนวนรอบของ CPU ที่สามารถดำเนินการได้ในเฟรมเดียว
ในการจัดระเบียบการจัดเก็บข้อมูล ยืนหยัดด้วยการสนับสนุนการอ่านและการเขียน เคล็ดลับที่เกี่ยวข้องกับการใช้วัตถุกล้องที่เชื่อมโยงกับพื้นที่สี่เหลี่ยมถูกนำมาใช้ สร้างโดย shader และกำหนดเอาต์พุตของพื้นผิวที่แสดงผลไปยังอินพุตของ shader ดังนั้น, พิกเซลใดๆ ที่เขียนขึ้นระหว่างการใช้งาน Pixel Shader สามารถอ่านได้โดยการประมวลผลเฟรมถัดไป
เมื่อใช้ตัวแบ่งพิกเซล อินสแตนซ์ที่แยกจากกันของตัวสร้างภาพจะทำงานแบบขนานกันสำหรับแต่ละพิกเซลในพื้นผิว
คุณลักษณะนี้ทำให้การใช้งานยุ่งยากขึ้นอย่างมาก และต้องการการประสานงานแยกกันของสถานะของระบบจำลองทั้งหมด และการเปรียบเทียบตำแหน่งของพิกเซลที่ประมวลผลกับสถานะของเนื้อหา CPU หรือ RAM ของระบบจำลองที่เข้ารหัสไว้ (แต่ละพิกเซลสามารถเข้ารหัสได้ 128 บิตของ ข้อมูล).
ในกรณีนี้ รหัส shader ต้องการการรวมการตรวจสอบจำนวนมาก เพื่อทำให้การใช้งาน Perl preprocessor perlpp ง่ายขึ้น
สำหรับผู้ที่เป็น สนใจสเปก มีการกล่าวถึงว่า:
- รหัสอยู่บน GitHub
- 64 MiB ของ RAM ลบสถานะ CPU ถูกเก็บไว้ในพื้นผิวรูปแบบจำนวนเต็ม 2048 × 2048 พิกเซล (128 bpp)
- พื้นผิวการเรนเดอร์ที่กำหนดเองของ Unity พร้อมการสลับบัฟเฟอร์ช่วยให้สามารถเข้ารหัส / ถอดรหัสสถานะระหว่างเฟรม
- pixel shader ใช้สำหรับการจำลองเนื่องจากการคำนวณและ VRChat ไม่รองรับ shader UAV
ในที่สุด หากคุณสนใจที่จะทราบข้อมูลเพิ่มเติมคุณสามารถตรวจสอบรายละเอียด ในลิงค์ต่อไปนี้.