Все функции графической библиотеки FreeBASIC рисуют в кадровый буфер и в
автоматическом режиме кадровый буфер копируется в фактическую память экрана
в каждом выполнении. Если пользовательская программа много рисует,
автоматическое обновление может занять значительное количество времени.
Функция
ScreenLock блокирует автоматическое обновление,
поэтому несколько операций рисования могут быть сделаны перед обновлением
экрана, тем самым увеличивая скорость исполнения и предотвращая мерцание
экрана.
Память буфера кадра может быть свободно доступна с помощью указателей (см.
ScreenPtr)
ТОЛЬКО тогда, когда экран заблокирован. Операторы примитивной графики (
Line,
PSet,
Draw String, ...)
могут использоваться в любое время.
Обновление экрана остается заблокированным до использования оператора
ScreenUnlock ,
который используется для разблокировки.
Вызовы
ScreenLock должны быть в паре с соответствующим
вызовом
ScreenUnlock.
Графический драйвер сохраняет сколько раз
ScreenLock была
вызвана с помощью счетчика. Только первый вызов
ScreenLock
на самом деле выполняет операцию блокировки. Последующие вызовы
ScreenLock
только увеличивают счетчик блокировки. И наоборот,
ScreenUnlock
только уменьшает счетчик блокировки, пока он не достигнет нуля, в это время
будет выполняться фактическая процедура разблокировки. Использование
Screen
или
ScreenRes обнуляет все
блокировки и устанавливает счетчик блокировки на ноль перед изменением
режимов экрана.
Настоятельно рекомендуется, чтобы блокировка страницы проводилась (как
только можно) за короткое время. Только рисование на экране должно
происходить во время блокировки экрана, ввод и вывод, а так же ожидание с
помощью
Sleep следует избегать. В Win32 и Linux
заблокированный экран, останавливает поток, который обрабатывает также OS
события. Если экран блокируется долгое время , в очереди событий может
произойти переполнение и это сделает систему нестабильной. Если время
блокировки становится слишком длинным, лучше используйте метод двойной
буферизации (с
ScreenCopy).
Автоматическое обновление происходит только в видимой странице фреймбуфера.
ScreenLock
не действует, когда рисунок на странице не виден.
См. также