A-tit indd



Download 3,35 Mb.
Pdf ko'rish
bet223/313
Sana05.06.2022
Hajmi3,35 Mb.
#638392
1   ...   219   220   221   222   223   224   225   226   ...   313
Bog'liq
Nistrem R. Patterni programmirovaniya igr-1

305
 Пример кода
Вы уже видели код. Он не идеален, но в нем правиль-
но реализована базовая функциональность — нужный 
нам публичный API и правильные низкоуровневые вы-
зовы аудиосистемы. Осталось просто исправить некото-
рые проблемы.
Первая — это 
блокировки
нашим API. Когда одна 
часть кода воспроизводит звук, другие части не могут 
делать ничего, пока метод 
playSound()
не закончит за-
грузку ресурсов и не начнет издавать звуки через динамик.
Мы хотим отложить эту работу, чтобы 
playSound()
быстрее возвращал управление. Нам нужно абстракт-
ный запрос 
материализовать
. Нам потребуется неболь-
шая структура, которая будет хранить детали ожидаю-
щего обработки запроса, чтобы мы могли использовать 
их позже:
struct PlayMessage
{
SoundId id;
int volume;
};
Затем нам нужно выделить 
Audio
немного места 
для хранения информации об ожидающем обработки 
запросе на воспроизведение. И тут ваш преподаватель 
по программированию посоветовал бы вам использо-
вать какую-нибудь существующую структуру данных, 
например фибоначчиеву кучу, или список с пропусками, 
или даже, черт побери, 
связанный
список. Но на практи-
ке старый добрый массив лучше всего подходит для хра-
нения однородных данных.
• Никакого динамического выделения памяти.
• Никаких накладных расходов на хранение допол-
нительной информации или указателей.
• Удобное для кэша использование памяти.
Людям, изучающим 
алгоритмы, платят 
за анализ новых струк-
тур данных. Они не за-
интересованы в том, 
чтобы придерживаться 
классики.


306
Очередь событий (Event Queue) — 
Паттерны программирования игр
Давайте сделаем это:
class Audio
{
public:
static void init() {numPending_ = 0;}
// 6 …
private:
static const int MAX_PENDING = 16;
static PlayMessage pending_[MAX_PENDING];
static int numPending_;
};
Мы можем задать размер массива для худшего из воз-
можных случаев. Чтобы воспроизвести звук, мы просто 
помещаем новое сообщение в конце:
void Audio::playSound(SoundId id, int volume)
{
assert(numPending_ < MAX_PENDING);
pending_[numPending_].id = id;
pending_[numPending_].volume = volume;
numPending_++;
}
Это позволит 
playSound()
вернуть управление по-
чти мгновенно, но нам все еще нужно воспроизвести 
звук. Код нужно где-то разместить — конечно же, в ме-
тоде 
update()
:
class Audio
{
public:
static void update()
{
for (int i = 0; i < numPending_; i++)
{
ResourceId resource = loadSound(
pending_[i].id);
int channel = ndOpenChannel();
Больше о том, что зна-
чит «удобный для кэша», 
вы найдете в главе «Ло-
кальность данных (Data 
Locality)» (с. 343).
Как подразумевает на-
звание, это паттерн Ме-
тод Update (с. 181)



Download 3,35 Mb.

Do'stlaringiz bilan baham:
1   ...   219   220   221   222   223   224   225   226   ...   313




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish