بازنویسی کامل یک موتور گرافیکی تجاری با زبان برنامهنویسی Jai — Rewriting a Commercial Engine in Jai
خلاصه
توسعهدهنده Polygonjs پس از سالها کار با TypeScript و جاوااسکریپت، به دلیل محدودیتهای حافظه، مشکلات Garbage Collector و پیچیدگیهای دسکتاپ، تصمیم گرفت کل موتور خود را از صفر با زبان Jai بازنویسی کند. این مقاله نگاهی به چالشهای مهاجرت به یک زبان سطح پایین و دستاوردهای عملکردی آن دارد.
مقدمه و زمینه
ابزار Polygonjs حدود هشت سال پیش به عنوان یک پلتفرم هندسه رویهای (Procedural Geometry) در مرورگر متولد شد. این موتور در ابتدا با استفاده از TypeScript و Vue.js بر پایه کتابخانه محبوب three.js پیادهسازی شده بود و توانست پروژههای تجاری متعددی را به سرانجام برساند. با این حال، با بزرگتر شدن ابعاد پروژه، محدودیتهای ذاتی اکوسیستم جاوااسکریپت شروع به ایجاد اصطکاک برای توسعهدهنده کرد.
چرا جاوااسکریپت دیگر پاسخگو نبود؟
دو چالش اصلی توسعهدهنده با جاوااسکریپت عبارت بودند از:
- کنترل حافظه: در تولید هندسههای رویهای، حجم زیادی از حافظه مصرف میشود. در جاوااسکریپت ابزار دقیقی برای ردیابی شفاف تخصیص و آزادسازی حافظه وجود ندارد و اگر شیء دیگری مرجعی به دادهها نگه دارد، Garbage Collector اجازه پاکسازی را نمیدهد که در نهایت به نشت حافظه (Memory Leak) منجر میشود.
- مکانیزم Garbage Collector (GC): اجرای ناگهانی GC میتواند بخشی از بودجه زمانی فریم (Frame Budget) را ببلعد و باعث افت فریم شود؛ موضوعی که برای یک محیط تعاملی و متحرک بسیار آزاردهنده است.
- مشکلات دسکتاپ و Native: برای انتشار نسخه دسکتاپ از طریق ابزارهایی مانند Electron، ارتباط با کتابخانههای بومی (مانند Steam API برای بخش چندنفره) پیچیده و مستعد خطاهای همگامسازی و نشت حافظه بود.
ورود به دنیای Jai
پس از بررسی گزینههای مختلف، توسعهدهنده توانست به نسخه بتا زبان برنامهنویسی Jai (اثر جان بلو / Jonathan Blow) دسترسی پیدا کند. این زبان سطح پایین به توسعهدهنده اجازه میدهد کنترل کاملی بر نحوه تخصیص، مدیریت و آزادسازی حافظه داشته باشد (مثلاً استفاده از Pool Allocators یا Temp Allocator). علاوه بر این، قابلیت کامپایل برای پلتفرمهای مختلف از جمله سیستمعاملهای دسکتاپ و WebAssembly را به راحتی فراهم کرد.
روند بازنویسی طی دو سال
- سال اول (ساخت فونداسیون): بازنویسی منطق شیءگرا به ساختار مبتنی بر struct و function در یک زبان سطح پایین چالشی بزرگ بود. در این مدت، لایه رندرینگ همچنان به سه.js متکی بود و دادهها از طریق WebAssembly به جاوااسکریپت منتقل میشدند.
- سال دوم (بهینهسازی و رندر اختصاصی): توسعهدهنده سیستم مدیریت حافظه قابل بازیافت (Recyclable System) را پیادهسازی کرد که در آن حافظه به جای آزادسازی مکرر، بازنشانی و بازاستفاده میشود. همچنین با یادگیری خام WebGPU و wgpu، موتور رندر اختصاصی خود را ساخت.
وضعیت فعلی و دیدگاه جامعه هکرنیوز
نسخه دوم Polygonjs اکنون منتشر شده و به صورت یک فایل اجرایی ساده برای هنرمندان و یک SDK برای توسعهدهندگان عرضه میشود.
در بحثهای Hacker News، کاربران به نکات جالبی اشاره کردند:
- برخی منتقدان اشاره کردند که در دسترس نبودن عمومی زبان Jai پس از سالها، ادعاهای اولیه درباره سرعت توسعه زبانهای سفارشی را زیر سوال میبرد.
- عدهای دیگر با تحسین نویسنده، بازنویسی یک موتور تجاری موفق را تصمیمی شجاعانه اما منطقی برای کسب کنترل کامل بر عملکرد سیستم دانستند.
این مطلب بهصورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل