Yangi ochiq manba modeli: pull requestsga yopiq, remixga ochiq
Ochiq manba dasturlash modeli yangi bosqichga chiqdi. Remix modeli pull requestsni rad etib, dasturlarni qaysi maqsadda ishlatilishi mumkinligini ochiq qoldiradi.

Yuqori unumli o‘yinlar va real‑vaqt ilovalari xotira boshqaruviga juda katta eʼtibor qaratadi. Kichik kechikishlar ham kadrlar sonini pasaytirishi, foydalanuvchi tajribasini yomonlashtirishi mumkin. Ushbu maqolada biz double headed stack allocator deb nomlangan xotira boshqaruv usulini, uning yaratilish tarixini, texnik asoslarini va amalda qanday natija berishini batafsil ko‘rib chiqamiz.
O‘yin motorlari har bir kadrda yuzlab, ba’zan millionlab obyektlarni yaratadi, yangilaydi va yo‘q qiladi. Bu jarayonlar ko‘pincha vaqtinchalik (transient) xotira talab qiladi – ya’ni, ma’lum bir kadr ichida ishlatiladi, keyin darhol bo‘shatiladi. An’anaviy dinamik xotira ajratish (malloc / new) bu holatda sekin bo‘lib, fragmentatsiya muammosiga olib keladi. Shuning uchun ishlab chiquvchilar bump allocator yoki stack allocator kabi yengil usullarni qo‘llashadi.
Oddiy stack allocator xotira blokini oldindan ajratib, unga tos (top of stack) ko‘rsatkichini bir butun son qo‘shish orqali ajratadi. Xotira olish – tos += size, bo‘shatish – tos = 0 (yoki oldingi nuqtaga qaytarish). Bu operatsiyalar CPU da bir necha tsiklni egallaydi, demak profilingda deyarli “zero” vaqt ko‘rsatiladi.
tos atomik qo‘shish bilan bir nechta iplar bir vaqtning o‘zida ajratish qilishi mumkin.Bu yondashuv Surreal Software’da “This is Vegas” o‘yinida animatsiya blendlarini optimallashtirishda qo‘llanilgan. Natijada profilerdagi “allocation” bo‘limi deyarli yo‘q bo‘ldi.
Oddiy stack allocator bir tomonli bo‘lib, xotira blokining bir uchidan boshlanadi. Ammo o‘yinlarda bir nechta mustaqil tizimlar (masalan, darajalar va qahramon modellari) bir vaqtning o‘zida dinamik xotira talab qilishi mumkin. Bu holatda fragmentatsiya tezda yuzaga keladi: bo‘sh joylar kichik bo‘laklarga bo‘linadi, katta bloklar uchun yetarli bo‘sh joy topilmaydi.
Double headed stack allocator bu muammoni ikki “tos” ko‘rsatkichini bir-biriga qarshi yo‘nalishda harakatlantirish orqali hal qiladi:
Bu usul fragmentatsiyani de‑faktom minimal darajaga tushiradi, chunki har bir tizim o‘z segmentida birlashtirilgan bo‘laklarni ishlatadi.
uint8_t* StackAllocate(uint8_t* mem, size_t& tos, size_t size){ uint8_t* ret = &mem[tos]; tos += size; return ret;}
Blizzard’da StarCraft 2 jamoasi double headed stack allocator’ni daraja streaming va qahramon shakl‑o‘zgartirish mexanizmlari uchun qo‘lladi. Misol uchun, 100 MB xotira blokida:
tos = 0; // deallocate all stack allocations
Double headed stack allocator bu vaziyatda levelTos ni 30 MB ga ko‘taradi, characterTos esa o‘zgarmas qoladi, va bo‘sh joy birlashtiriladi. Natijada fragmentatsiya yo‘qoladi, aloqador kod esa yana integer qo‘shish va tayinlashdan iborat bo‘lib qoladi.
Profilerdagi o‘lchovlar shuni ko‘rsatdiki, ajratish va bo‘shatish vaqtida 0 % CPU yuklanishi kuzatildi, bu esa real‑vaqt o‘yinlarda kadr tezligini sezilarli darajada oshirdi.
Double headed stack allocator ham o‘z chegaralariga ega:
Kelajakda bu texnikani yanada rivojlantirish yo‘nalishlari quyidagilar:
Double headed stack allocator – bu oddiy, lekin kuchli xotira boshqaruv usuli bo‘lib, fragmentatsiyani kamaytirish, ajratish tezligini maksimal darajaga yetkazish va ko‘p ipli muhitda ham barqaror ishlashni ta’minlaydi. O‘yinlarda daraja streaming va qahramon shakl‑o‘zgartirish kabi ikki mustaqil tizim bir vaqtning o‘zida dinamik xotira talab qilganda bu yondashuv aniq foyda keltiradi. Uning cheklovlari ham mavjud, lekin to‘g‘ri dizayn va qo‘shimcha mexanizmlar bilan bu muammolarni yengish mumkin. Xotira boshqaruvini yanada samarali qilishga intilayotgan har bir dasturchi double headed stack allocator konseptsiyasini o‘z loyihalariga qo‘shishi tavsiya etiladi.
Manba: The Double Headed Stack Allocator
Asl manba: blog.demofox.org