Files
SergObsidian/PERSONAL PROJECTS/PS1 DOCS/PS1 Vblank.md
2025-04-18 23:10:56 +05:00

124 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### **VBlank (Vertical Blanking) в PlayStation 1**
**VBlank** (вертикальное гашение) — это критически важный механизм синхронизации в PS1, связанный с выводом изображения на экран. Он используется для корректного обновления кадров, предотвращения артефактов рендеринга и эффективного управления ресурсами системы.
---
## **1. Что такое VBlank?**
### **Физическая основа**
- ЭЛТ-мониторы (как и TV, для которых создавалась PS1) рисуют изображение **построчно**, сверху вниз.
- **VBlank** — это промежуток времени между окончанием вывода последней строки кадра и началом вывода первой строки следующего кадра.
- В PS1 длительность VBlank:
- **NTSC**: ~1.23 мс (каждые 16.68 мс при 60 Гц).
- **PAL**: ~1.25 мс (каждые 20 мс при 50 Гц).
---
## **2. Как VBlank используется в PS1?**
### **2.1. Синхронизация вывода изображения**
- GPU PS1 рисует кадр в **кадровый буфер** (часть VRAM).
- Во время VBlank видеоконтроллер **переключается на готовый кадр**, избегая "разрывов" (tearing).
### **2.2. Безопасное обновление графики**
- Любые изменения VRAM (загрузка текстур, обновление спрайтов) должны выполняться **только во время VBlank**, иначе:
- Возникают артефакты (мелькание, частичное обновление).
- Возможны конфликты доступа к VRAM между GPU и CPU.
### **2.3. Оптимизация работы CPU**
- Игры используют VBlank как **метку времени** для:
- Обновления игровой логики (физика, AI).
- Загрузки данных с CD-ROM.
- Подготовки следующего кадра.
---
## **3. Техническая реализация VBlank**
### **3.1. Прерывание VBlank**
- При наступлении VBlank генерируется **прерывание (IRQ0)**.
- CPU может обработать его, выполнив критически важные задачи.
#### **Пример кода (обработка прерывания):**
```asm
; Установка обработчика VBlank
la t0, vblank_handler ; Адрес обработчика
sw t0, 0x10000080 ; Запись в вектор прерываний
; Включение прерываний
mfc0 t1, $12 ; Статусный регир COP0
ori t1, 0x01 ; Разрешить IRQ0
mtc0 t1, $12
```
### **3.2. Регистры, связанные с VBlank**
| Адрес | Назначение |
|---------------|----------------------------------------------------------------------------|
| **0x1F801070** | **I_STAT** — Флаги прерываний (бит 0 = VBlank). |
| **0x1F801100** | **GPU STATUS** — Содержит флаг `VRAM_READY` (можно ли обновлять VRAM). |
### **3.3. Ожидание VBlank в коде**
```c
#include <libgte.h>
#include <libgpu.h>
void wait_vblank() {
VSync(0); // Ожидание следующего VBlank
}
```
---
## **4. Практическое применение в играх**
### **4.1. Двойная буферизация**
1. **Буфер A** выводится на экран.
2. **Буфер B** рисуется GPU во время кадра.
3. Во время VBlank буферы **меняются местами** (через `DrawSync(0)`).
### **4.2. Загрузка данных**
- CD-ROM и DMA активны преимущественно во время VBlank, чтобы не мешать рендерингу.
### **4.3. Лимит FPS**
- Большинство игр PS1 работают на **50/60 FPS** (частота VBlank), так как:
- Новый кадр начинается только после VBlank.
- Попытка рендерить быстрее бессмысленна (ЭЛТ не успеет отобразить).
---
## **5. Пример: Цикл рендеринга с VBlank**
```c
while (1) {
// 1. Ожидаем VBlank
VSync(0);
// 2. Обновляем игровую логику
update_game();
// 3. Готовим кадр в заднем буфере
render_frame();
// 4. Меняем буферы
SwapBuffers();
}
```
---
## **6. Интересные нюансы**
- **Режимы видео**:
- NTSC (60 Гц) даёт более плавный геймплей, но меньше времени на VBlank.
- PAL (50 Гц) имеет более длинный VBlank, но ниже FPS.
- **Overclocking**: Некоторые домашние разработчики нарушают синхронизацию для экспериментов (рискуя артефактами).
---
## **7. Итог**
- **VBlank** — это "пауза" между кадрами, используемая для:
- Синхронизации вывода изображения.
- Обновления графики без артефактов.
- Оптимизации загрузки данных.
- **Без VBlank** игры PS1 выглядели бы с глюками (как на многих эмуляторах без корректной синхронизации).
Для глубокого понимания изучите:
- [PSX SPX Technical Reference](http://problemkaputt.de/psx-spx.htm)
- **LibGPU Documentation** (PsyQ SDK).
Это ключ к плавной графике в играх вроде *Crash Bandicoot* или *Tekken 3*! 🎮