vault backup: 2025-04-19 01:51:11
This commit is contained in:
@@ -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 и требуют точной настройки для оптимальной работы.
|
||||
Reference in New Issue
Block a user