vault backup: 2025-04-19 01:51:11

This commit is contained in:
sShemet
2025-04-19 01:51:11 +05:00
parent e31580b849
commit b0a9dc5628
3 changed files with 192 additions and 7 deletions

View File

@@ -131,4 +131,117 @@ void DrawFrame() {
- **VRAM** используется только для хранения текстур и кадрового буфера.
- **Оптимизация DMA-передач** критична для производительности.
Это объясняет, почему в демосценах PS1 так важны **оптимизированные DMA-цепочки** и ручное управление памятью. Для глубокого понимания изучите **документацию PsyQ SDK** или исходники open-source движков (например, [PSn00bSDK](https://github.com/Lameguy64/psn00bsdk)).
Это объясняет, почему в демосценах PS1 так важны **оптимизированные DMA-цепочки** и ручное управление памятью. Для глубокого понимания изучите **документацию PsyQ SDK** или исходники open-source движков (например, [PSn00bSDK](https://github.com/Lameguy64/psn00bsdk)).
----------
# Функции `PutDispEnv` и `PutDrawEnv` в библиотеке PsyQ для PlayStation 1
Эти функции управляют графическим окружением (display и drawing environment) и являются ключевыми для работы с двойной буферизацией на PS1.
## `PutDispEnv` - Установка параметров отображения
```c
void PutDispEnv(DISPENV *env);
```
### Назначение:
Устанавливает параметры **области вывода изображения** на экран:
- Позиция и размер выводимой области
- Режимы интерлейсинга
- Цвет фона за пределами игровой области
### Структура DISPENV:
```c
typedef struct {
u_short disp; // Настройки дисплея
u_short screen; // Размер экрана
u_short isrgb24; // RGB24 режим (0/1)
u_short pad; // Выравнивание
} DISPENV;
```
### Пример использования:
```c
DISPENV dispEnv;
SetDefDispEnv(&dispEnv, 0, 0, 320, 240); // Установка параметров по умолчанию
dispEnv.screen.w = 320; // Ширина выводимой области
dispEnv.screen.h = 240; // Высота выводимой области
PutDispEnv(&dispEnv); // Применение настроек
```
## `PutDrawEnv` - Установка параметров рендеринга
```c
void PutDrawEnv(DRAWENV *env);
```
### Назначение:
Конфигурирует параметры **области рисования**:
- Область отсечения (clipping)
- Смещение рисования
- Цвет фона
- Флаги отрисовки
### Структура DRAWENV:
```c
typedef struct {
RECT clip; // Область отсечения
short ofs[2]; // Смещение рисования
RECT tw; // Область текстуры (если используется)
u_short tpage; // Страница текстуры
u_short dtd; // Флаги (dither, draw background)
} DRAWENV;
```
### Пример использования:
```c
DRAWENV drawEnv;
SetDefDrawEnv(&drawEnv, 0, 0, 320, 240);
drawEnv.clip.x = 0; // Область отсечения
drawEnv.clip.y = 0;
drawEnv.clip.w = 320;
drawEnv.clip.h = 240;
drawEnv.isbg = 1; // Включить очистку фона
setRGB0(&drawEnv, 0, 0, 0); // Черный фон
PutDrawEnv(&drawEnv);
```
## Совместное использование в двойной буферизации
Типичный цикл рендеринга с двойной буферизацией:
```c
DB db[2]; // Double buffer структура
int active = 0;
while(1) {
// Очистка и подготовка OT
ClearOTagR(db[active].ot, OT_LENGTH);
// Добавление примитивов
// ... (код рендеринга)
// Отправка команд на отрисовку
DrawOTag(db[active].ot);
// Переключение буферов
PutDispEnv(&db[active].disp);
PutDrawEnv(&db[active].draw);
active ^= 1; // Смена активного буфера
VSync(0); // Ожидание VBlank
}
```
## Ключевые особенности:
1. **Двойная буферизация** - обычно используют два набора DISPENV/DRAWENV
2. **VSync синхронизация** - переключение лучше делать во время VBlank
3. **Размеры областей** - должны соответствовать выбранному разрешению
4. **Производительность** - правильная настройка уменьшает артефакты
Эти функции являются фундаментальными для управления графическим конвейером PS1 и требуют точной настройки для оптимальной работы.