Оновлення області пам’яті в графічному пристрої (текстура, буфер тощо) не зовсім те саме, що зміна стану візуалізації.
Те, що робить зміну стану рендерингу дорогою, - це кількість роботи, яку повинен виконати водій, щоб перевірити новий стан (и) та змінити трубопровід. Це, швидше за все, також спричинить деяку синхронізацію між процесором та графічним пристроєм. Однак обсяг даних, переданих між пристроями, повинен бути малим для зміни стану (можливо, лише кілька команд).
З іншого боку, для оновлення текстури / буфера основна вартість лежить у самій передачі даних. Теоретично, якщо ви не читаєте дані текстури назад до центрального процесора після оновлення, не повинно бути затримок синхронізації та конвеєра. Однак слід розглянути ще один аспект: накладні витрати API. Навіть якщо обсяг даних, який ви надсилаєте на графічний пристрій, невеликий, якщо ви робите це досить часто, з часом вартість спілкування з драйвером / пристроєм стане більшою, ніж вартість передачі даних. Це ще одна причина, чому дозування настільки важлива при оптимізації рендерінгу.
Тож у вашому випадку найкращим підходом, як мені здається, було б зберегти копію текстури, що ви оновлюєте, коли ви надходите нові дані. Встановіть брудний прапор і консолідуйте якомога більше оновлень в одному glTexSubImage
для всієї текстури (або великої послідовної частини її). Ви також можете грати з об'єктами Pixel Buffer і намагатися робити асинхронну передачу даних, щоб максимально скоротити стояки конвеєра. Якщо ви можете реалізувати якусь подвійну буферизацію, тоді ви можете записати до однієї копії текстури, поки інша передається. Цей підручникдосліджує цей сценарій. Це мій інтуїтивний підхід, я б спробував зменшити кількість викликів API і "пакетно" оновити текстуру. Однак, це дуже спекулятивно, і вам доведеться профайлювати та порівнювати це з іншими підходами, як-от робити кілька невеликих оновлень, щоб точно знати, який є найефективнішим у вашому випадку використання.
В якості додаткового зауваження, ця презентація від NVidia також є актуальною і дає багато хороших розумінь: Наближення нульових драйверів накладних витрат у OpenGL .