Мэдээ

C кодоос 35% бага мөрөөр: Домогт DOOM тоглоомыг цэвэр SQL дээр бүтнээр нь ажиллуулжээ

TOGTOKHTOGTOKH·2026 оны аравдугаар сарын 5·1 үзсэн·
C кодоос 35% бага мөрөөр: Домогт DOOM тоглоомыг цэвэр SQL дээр бүтнээр нь ажиллуулжээ

Програм хангамжийн салбарт "Хэрэв дэлгэц, процессортой л бол дээр нь DOOM ажиллах ёстой" гэсэн бичигдээгүй дүрэм бий. Ухаалаг хөргөгч, дижитал тооцоолуураас эхлээд жирэмсний тест, сансрын хиймэл дагуул хүртэл 1993 оны энэ сонгодог бүтээлийг ажиллуулж байсан түүхтэй.

Гэхдээ ямар нэгэн үйлдлийн систем, стандарт график сан ашиглахгүйгээр, зөвхөн реляци өгөгдлийн сангийн SELECT, UPDATE query-ээр 3D орчинд мангасуудтай буудалцаж болно гэвэл та итгэх үү?

Өндөр хурдны CedarDB-ийн багийн инженер Лукас Фогель (Lukas Vogel) Doom-ийн физик хөдөлгүүр, тоглоомын логик, тэр бүү хэл 3D рэндэрлэгчийг (renderer) цэвэр SQL дээр бичиж, SQLDoom нэртэйгээр олон нийтэд танилцууллаа. Энэ нь зүгээр нэг үзүүлэн төдий бус, анхны тоглоомын 35 FPS хурдтайгаар бүрэн тоглох боломжтой, multiplayer дэмжлэгтэй бүрэн хэмжээний систем юм.


Архитектур: Client бол "тэнэг" дэлгэц, Өгөгдлийн сан бол тоглоомын бүх зүйл

SQLDoom-ийн бүтэц тун энгийн бөгөөд гайхмаар:

  • Frontend (Python): Ердөө гар дээрх товчлуурын даралтыг (WASD, сум, хулгана) хүлээн авч, өгөгдлийн сан руу илгээх, хариуд нь ирсэн 320x200 пикселийн өнгөний матрицыг дэлгэцэнд харуулах үүрэгтэй 150-хан мөр бүхий Python код.
  • Backend (CedarDB): Тоглоомын газрын зураг, объектууд, сумны траектор, тоглогчийн координатууд хүснэгт (tables) хэлбэрээр хадгалагдана. Секундэд 35 удаа тоглоомын дараагийн алхам SQL query-ээр бодогдоно.

Тоглоомын клиент болон серверийн хооронд тусгай сүлжээний протокол байхгүй бөгөөд зөвхөн өгөгдлийн сангийн стандарт Postgres wire protocol-оор холбогддог.


Процедур кодоос Реляци сэтгэлгээ рүү: 9,000 мөр C яагаад 5,900 мөр SQL болсон бэ?

Жон Кармакийн 1993 онд C хэл дээр бичсэн Doom-ийн эх код ойролцоогоор 9,000 мөр байдаг. Харин SQLDoom төсөлд үүнийг ердөө 5,900 мөр SQL болгон бууруулжээ.

C хэл дээр талбай дээр байгаа бүх мангас эсвэл нижигнэж буй сумнуудын хөдөлгөөнийг тооцоолохын тулд for эсвэл while давталтаар (loop) бүх жагсаалтаар гүйж, нэг нэгээр нь боловсруулдаг. Харин өгөгдлийн сангийн реляци алгебр дээр энэ нь ердөө ганцхан багц комманд юм:

UPDATE projectiles 
SET x = x + vx, y = y + vy 
WHERE active = TRUE;

Ингэснээр хэдэн зуун сум, дайсны координатын шилжилтийг CedarDB зэрэгцээ тооцоолол (parallel execution) ашиглан хүснэгтийн түвшинд агшин зуур шийдчихэж байгаа юм. Түүнчлэн Doom-ийн бүх зураг, газрын зураг агуулсан .WAD файлын бүтэц нь өөрөө хана, сектор, полигон гэсэн хатуу parent-child шатлалтай тул өгөгдлийн сангийн реляци схемд төгс нийцжээ.


89 Common Table Expression (CTE)-ээр 3D ертөнцийг зурах нь

Төслийн хамгийн гайхалтай инженерийн ололт бол SQL Renderer юм. 3D орчныг тооцоолохын тулд дараах шат дараалсан математик үйлдэл хэрэгтэй болдог:

  1. Тоглогчийн харах өнцгөөс цацраг тусгах (Raycasting)
  2. Ханануудын байршлыг тодорхойлох BSP (Binary Space Partitioning) модны гүйлт
  3. Хананы өндөр, харагдах зай, гэрэлтүүлгийн уналтыг бодох
  4. Текстурийн пикселүүдийг хувиргаж, давхарлагдаж буй объектуудыг (sprites) нэвт харагдах сувгаар нь цэгцлэх
  5. Тоглогчийн амь, сумны тоог харуулах HUD-ийг наах

Эдгээр бүх алхам нь нийт 89 ширхэг дараалсан CTE (Common Table Expressions) бүхий аварга том ганцхан SQL query-ээр бодогддог! Query-ийн үр дүнд өгөгдлийн сан нь 320x200 хэмжээтэй 64,000 пикселийн RGB кодыг массив хэлбэрээр буцаах ба энэ нь орчин үеийн зөөврийн компьютер дээр 60 Hz хүртэл давтамжтай ажиллаж чадаж байна.


Multiplayer болон "SQL Cheat Code"

Олон тоглогчтой онлайн тоглоом хөгжүүлэхэд хамгийн хэцүү даваа нь тоглогчдын байршлыг нэгэн зэрэг алдаагүй синхрончлох (state synchronization, race condition үүсгэхгүй байх) байдаг.

Гэтэл энэ зовлонг өгөгдлийн сангийн системүүд хэдэн арван жилийн өмнө ACID транзакц болон Transaction Isolation Levels-ээр төгс шийдчихсэн. Өөрөөр хэлбэл, өгөгдлийн сан өөрөө бэлэн, найдвартай тоглоомын сервер болчихдог. Олон тоглогч нэгэн зэрэг холбогдоход хэн түрүүлж сум тавьсныг транзакцын дарааллаар ямар ч маргаангүй шийдвэрлэнэ.

Цаашлаад, тоглоомын бүх төлөв өгөгдлийн санд нээлттэй тул "хакердах" эсвэл "чит" хийх нь дээд цэгтээ хүрчээ. Хэрэв та тоглоомонд үхэх гэж байгаа бол өөр нэг терминал нээгээд ердөө ганц query ажиллуулахад л хангалттай:

UPDATE players 
SET health = 9999, armor = 9999, current_weapon = 'BFG9000' 
WHERE username = 'devx_player';

Хөгжүүлэгчдэд өгөх сургамж

SQL-ийг бид ихэнхдээ энгийн өгөгдөл татах, шүүх, тайлан гаргах төдийхнөөр хардаг. Гэвч уг төсөл реляци сэтгэлгээ болон орчин үеийн гүйцэтгэл сайтай RDBMS-үүд (ялангуяа vectorized engine, JIT compilation ашигладаг системүүд) ямар гайхалтай математик тооцоолох чадамжтай болохыг практик дээр нотоллоо.

Танд дараагийн удаа нарийн төвөгтэй төлөв удирдах, зэрэгцээ тооцоолол хийх шаардлага гарвал хэдэн мянган мөр процедур код бичихийн өмнө өгөгдлийн сангийнхаа хүчийг дутуу үнэлээгүй биз гэдгээ нэг эргэцүүлээд үзээрэй.

Эх сурвалж: CedarDB Blog - We ported the original Doom to SQL, Tom's Hardware

Сэтгэгдэл

Ачаалж байна...