در بهار ۱۴۰۵، دنیای مهندسی نرمافزار شاهد یک تجربه نوآورانه دیگر در سنت دیرینه «اجرای Doom روی سختافزارهای غیرمتعارف» است. این بار لوکاس ووگل (Lukas Vogel) با بهرهگیری از توانمندیهای منطقی پایگاههای داده رابطهای، پروژهای تحت عنوان SQLDoom را با استفاده از CedarDB پیادهسازی کرده است که ثابت میکند موتورهای بازی و RDBMSها میتوانند شباهتهای ساختاری عمیقی داشته باشند.
معماری SQLDoom: فراتر از یک هک ساده
ایده اصلی پشت SQLDoom این است که منطق اصلی بازی (Game Logic) به جای CPUهای کلاسیک، درون موتور پایگاهداده پردازش شود. این پروژه که دنبالهای بر DoomQL محسوب میشود، با حدود ۵۹۰۰ خط کد SQL توسعه یافته است. در حالی که رابط کاربری (Frontend) به زبان Python برای مدیریت ورودیهای کاربر، صدا و خروجی تصویر (Rendering) استفاده میشود، تمام پردازشهای ریاضی و فیزیک بازی به صورت دستورات SQL در CedarDB انجام میپذیرد.
مهندسی دادهها و تبدیل WAD به جداول رابطهای
بزرگترین چالش در این پروژه، تبدیل فایلهای WAD بازی Doom به ساختار جدولبندی شده بود. ووگل متوجه شد که دادههای بازی بهصورت ذاتی روابط والد-فرزندی دارند که بهسادگی در قالب جداول SQL قابل تعریف است. به عنوان مثال، دادههای مربوط به نقشهها (Maps) و ویژگیهای محیطی به راحتی در جداول نرمالسازی شدند.
چرا SQL برای گیملوپ بهینه است؟
برخلاف زبانهای سنتی مانند C که نیازمند حلقههای تکرار (For/While) برای بهروزرسانی تکتک موجودیتها هستند، SQL از قدرت عملگرهای مجموعهای (Set-based operations) بهره میبرد. ووگل اشاره میکند که یک دستور UPDATE... WHERE میتواند وضعیت صدها موجودیت بازی را بهصورت همزمان و موازی تغییر دهد که خود یک دستاورد بزرگ در بهینهسازی عملکرد است.
چالش رندرینگ و الگوریتمهای هندسی
رندرینگ گرافیکی در این پروژه شامل یک کوئری پیچیده است که ۸۹ جدول مختلف را درگیر میکند. استفاده از درختهای دودویی (Binary Space Partitioning) که شاهکار جان کارمک در نسخه اصلی Doom بود، در اینجا به شکل یک جدول در پایگاهداده پیاده شده است. با استفاده از دستور SELECT... ORDER BY، دیوارها بهسادگی از نزدیکترین به دورترین نقطه مرتبسازی (Sort) میشوند که نشاندهنده تطابق الگوریتمهای هندسی با منطق دیتابیس است.
قابلیتهای پایگاهداده در خدمت چندنفرهسازی
شاید جذابترین بخش SQLDoom، مدیریت حالت بازی (Game State) باشد. در بازیهای سنتی، همگامسازی کلاینتها (Multiplayer Sync) چالشبرانگیز است، اما در اینجا با استفاده از مفاهیم تراکنش (Transaction)، تمام وضعیتها به صورت ACID رعایت میشوند. با یک START TRANSACTION و COMMIT، تمامی تغییرات بازی در لحظه برای سایر کلاینتها همگامسازی میشود.
مشخصات فنی پیادهسازی SQLDoom
- موتور هدف: CedarDB (سازگار با Postgres)
- حجم منطق SQL: حدود ۵۹۰۰ خط کد
- حجم منطق رندرینگ: ۱۳۰۰ خط کد (با کوئری ۸۹ جدولی)
- زبان واسط: Python برای مدیریت محیط و ورودی
- استراتژی همگامسازی: استفاده از ACID Transactions