Багатократна буферизація

Матеріал з Вікіпедії — вільної енциклопедії.
Jump to navigation Jump to search
Множини 1, 2 і 3 представляють операції одинарної, подвійної та потрійної буферизації відповідно з увімкненою вертикальною синхронізацією. На кожному графіку час тече зліва направо. Зауважте, що 3 показує ланцюг обмінів[en] з трьома буферами; початкове визначення потрійної буферизації викидатиме кадр C як тільки кадр D завершиться, і почне промальовувати кадр E у буфер 1 без затримки. Множина 4 показує, що стається, коли кадр (на прикладі B) займає більше часу, ніж зазвичай, для промальовування. У цьому випадку оновлення кадру пропускається. У чутливих до часу реалізаціях, таких як програвання відео, весь кадр може бути опущений. З трибуферним ланцюгом обмінів у множині 5, промальовування кадру B може початися без очікування копіювання кадру A до відеопам'яті, знижуючи ймовірність відсутності вертикального зворотного ходу затриманого кадру.

В інформатиці багатократною буферизацією називається використання більше, ніж одного буферу для зберігання блоку даних, так що «читач» побачить остаточну (можливо, застарілу) версію даних швидше за частково оновлену, створену «записувачем». Вона також використовується для уникнення потреби у використанні двопортової RAM[ru] у випадку, коли читачами та записувачами є різні пристрої.

Опис[ред.ред. код]

Найкращим способом пояснити роботу багатократної буферизації є взяти приклад із реального світу. Нехай у погожий день ви вирішили набрати води у басейн, щоправда ви не можете знайти шланг. Тоді вам доведеться наповнювати басейн відрами. Отже, ви наповните одне відро (чи буфер) з крану, закриєте кран, підете до басейну, виллєте воду, повернетеся до крану і повторите процедуру. Це приклад одинарної буферизації. Кран буде закритий, поки ви «оброблюєте» відро з водою.

Тепер розглянемо, що ви робитимете, маючи два відра. Ви заповните перше відро, після чого поставите друге під відкритий кран. Поки друге відро наповнюється водою, ви матимете час вилити воду з першого у басейн. Коли ви повернетеся, ви можете просто поміняти відра, так що перше наповнюватиметься у той час, поки ви виливатимете воду з другого у басейн. Так може повторюватися, поки басейн не наповниться. Можна побачити, що цим способом басейн наповнюється набагато швидше, оскільки менше часу витрачається на очікування, нічого не роблячи, поки відро наповнюється. Це приклад подвійної буферизації. Кран може бути відкритим увесь час, і не треба чекати завершення обробки.

Якщо ви залучите когось іншого носити відра до басейну, поки одне наповнюється, а інше спустошується, то отримаєте приклад потрійної буферизації. Якщо цей крок займає забагато часу, ви можете використати більше відер, так що кран постійно їх наповнюватиме.

В інформатиці випадку з відкритим краном не може бути, чи не має бути, переважно вимикаючи його (подібно до аудіопотоків). Також, комп'ютери зазвичай надають перевагу порціям даних, аніж потокам. У таких випадках подвійна буферизація застосовується досить часто.

Мережа Петрі подвійної буферизації[ред.ред. код]

Докладніше: Мережі Петрі
Мережа Петрі подвійної буферизації

Мережа Петрі на рисунку показує роботу подвійної буферизації. Вершини переходу W1 і W2 представляють запис відповідно до буферів 1 і 2, а R1 і R2 — читання з буферів 1 і 2 відповідно. На початку спрацює тільки вершина переходу W1. Після спрацювання W1, вершини R1 і W2 спрацюють одночасно. Після того, вершини R2 і W1 спрацюють одночасно, і так далі.

Отже, після першого переходу, коли W1 спрацьовує наодинці, система стає періодичною, і вершини переходу спрацьовують завжди парами (R1 з W2 і R2 з W1 відповідно).

Подвійна буферизація у комп'ютерній графіці[ред.ред. код]

У комп'ютерній графіці подвійною буферизацією називається спосіб промальовування графіки, що усуває (чи знижує) мерехтіння, розриви та інші артефакти.

Програмам важко промальовувати екран так, щоб пікселі не змінювалися понад раз. Наприклад, при оновленні сторінки тексту, набагато легше очистити всю сторінку, а потім малювати літери, ніж якось стерти всі пікселі, що не відносяться одночасно до старих і нових літер. Проте, це проміжне зображення користувач побачить мерехтливим. Крім того, монітори постійно перемальовують видиму відеосторінку (приблизно 60 разів на секунду), тож навіть досконале оновлення може бути видимим короткочасно як горизонтальний роздільник між «новим» зображенням та неперемальованим «старим», званий розривом.

Програмна реалізація подвійної буферизації має всі операції малювання, результати яких зберігаються у деякій ділянці системної пам'яті, званій «заднім буфером». Коли всі операції малювання вважаються завершеними, вся ділянка (чи лише змінена частина) копіюється до відеопам'яті («переднього буферу»); це копіювання зазвичай синхронізується з растровим променем монітора для уникнення розривів. Подвійна буферизація обов'язково вимагає більше пам'яті та процесорного часу за одиночну через необхідність виділення системної пам'яті для заднього буферу, час на операції копіювання, та час очікування синхронізації.

Композитні менеджери вікон часто сполучають операції «копіювання» та «композитингу», використовувані у позиціюванні вікон, перетворення їх з ефектами масштабування чи викривлення, та роблячи порції прозорими. Отже «передній буфер» може містити лише композитне зображення, яке видно на екрані, тоді як інший, «задній буфер» для кожного вікна містить некомпозитне зображення усього вмісту вікна.

Гортання сторінок[ред.ред. код]

У методі гортання сторінок (іноді званим пінг-понг буферизацією), замість копіювання даних, обидва буфери здатні бути відображеними (обидва у VRAM). Щоразу один буфер активно показується монітором, поки інший, фоновий — промальовується. Коли промальовування завершено, вони міняються ролями. Гортання сторінок зазвичай здійснюється шляхом зміни значення вказівника на початок відображуваних даних у відеопам'яті.

Гортання сторінок набагато швидше за копіювання даних і може гарантувати, що розриви не з'являтимуться доти, доки сторінки змінюються через кадровий імпульс монітора, що гасить — період гасіння, коли ніякі відеодані не промальовуються. Поточний активний і видимий буфер називається переднім, а фонова сторінка — «заднім буфером».

Потрійна буферизація[ред.ред. код]

У комп'ютерній графіці, потрійна буферизація подібна до подвійної, але може надавати більшу продуктивність. У подвійній буферизації програми мають чекати на завершення копіювання чи обміну промальованого зображення перед початком промальовування наступного. Таке очікування може займати кілька мілісекунд, під час яких обидва буфери є недоторканими.

У потрійній буферизації програми мають два задні буфери, як і змогу негайно починати промальовування на тому з них, який не бере участі у вищезгаданому копіюванні. Третій, передній, буфер зчитується відеокартою для відображення на моніторі. Щойно зображення було надіслано монітору, передній буфер обмінюється (або копіюється) з тим заднім буфером, який містить найостанніше завершене зображення. Оскільки один із задніх буферів завжди завершений, відеокарта ніколи не чекає на завершення програмного забезпечення. Отже, програмне забезпечення та відеокарта є цілком незалежними, і можуть працювати кожна у своєму темпі. Нарешті, подане зображення починається без очікування синхронізації, а отже, з мінімальними лагами.[1]

Завдяки тому, що програмний алгоритм не опитує графічне апаратне забезпечення у подіях оновлення монітора, алгоритм може працювати максимально швидко. Це може означати, що кілька зображень будуть записані до задніх буферів, але не будуть відображені на моніторі.

Існує альтернатива потрійної буферизації — трибуферний ланцюг обмінів[en]. У цьому випадку програма промалювавши обидва задні буфери, очікує на переміщення одного з них на екран до того, як почне промальовувати наступний задній буфер (тобто за принципом трьох-елементної черги). Вищенаведена діаграма ілюструє цей процес.

Чотирикратна буферизація[ред.ред. код]

Термін «чотирикратна буферизація» використовується у стереоскопічних реалізаціях, і означає використання подвійної буферизації для кожного з зображень для лівого та правого ока, загалом чотирьох буферів. Команда обміну чи копіювання буферів зазвичай застосовується до обох пар одночасно. У разі використання потрійної буферизації загальна кількість буферів дорівнює шести.

Чотирикратна буферизація — технологія реалізації стереоскопічного рендерингу кадрів у комп'ютерній графіці. Для забезпечення стереоскопічного рендерингу кожне око повинно отримувати окреме зображення. Чотирикратна буферизація використовує подвійну буферизацію разом з переднім і заднім буферами для кожного ока, загалом чотири буфери.

Подібно до вертикальної синхронізації у двовимірному режимі, чотирикратна буферизація дозволяє синхронно обмінювати передні та задні буфери для кожного ока, дозволяючи дисплею легко працювати з різними частотами кадрів.

Чотирикратна буферизація вимагає особливої підтримки драйверами відеокарт, що унеможливлює її для більшості споживчих карт. Проте її підтримують, наприклад відеокарти AMD серії Radeon HD 6000.

Стандарти 3D, такі як OpenGL[2] і Direct3D також підтримують чотирикратну буферизацію.

Подвійна буферизація з прямим доступом до пам'яті[ред.ред. код]

Термін подвійної буферизації використовується для копіювання даних між двома буферами для передачі прямого доступу до пам'яті (DMA), а не для збільшення продуктивності, але для задоволення конкретних вимог пристроїв щодо адресації (особливо 32-розрядні пристрої на системах із ширшою адресацією, наданою розширенням фізичних адрес)[3]. Драйвери Microsoft Windows особливо помітно використовуватимуть подвійну буферизацію. На системах на базі Linux чи BSD вона називається стрибковими буферами, оскільки дані повинні «стрибати» крізь ці буфери для введення та виведення.

Інші застосування[ред.ред. код]

Подвійна буферизація також застосовується як техніка сприяння черезрядковості чи деінтерлейсингу відеосигналів.

Див. також[ред.ред. код]

Примітки[ред.ред. код]

  1. Вілсон, Дерек (26 червня 2009). Triple Buffering: Why We Love It [Потрійна буферизація: Чому нам це подобається] (англійською). AnandTech. Процитовано 16 липня 2009. 
  2. Сегал, Марк; Акелей, Курт (11 серпня 2008). The OpenGL Graphics System: A Specification (Version 3.0) (PDF). с. 490. 
  3. Physical Address Extension - PAE Memory and Windows. Microsoft Windows Hardware Development Central. 2005. Процитовано 7 квітня 2008. 

Посилання[ред.ред. код]