vault backup: 2025-04-18 23:00:55
This commit is contained in:
@@ -190,4 +190,180 @@ ccpsx MAIN.C -o MAIN.EXE
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Теперь модули могут **полноценно взаимодействовать** с основной программой, проверяя и изменяя глобальное состояние игры! 🎮
|
Теперь модули могут **полноценно взаимодействовать** с основной программой, проверяя и изменяя глобальное состояние игры! 🎮
|
||||||
|
|
||||||
|
|
||||||
|
-------
|
||||||
|
|
||||||
|
Да, вы правильно поняли! В этой архитектуре **основная программа** и **модули** компилируются по-разному:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **1. Основная программа (MAIN.EXE)**
|
||||||
|
- **Не требует** явного указания библиотек PsyQ (если не использует их напрямую).
|
||||||
|
- Её задача — только **загружать модули** и **управлять общим состоянием** (`GameState`).
|
||||||
|
- Пример компиляции:
|
||||||
|
```bash
|
||||||
|
ccpsx MAIN.C -o MAIN.EXE # Без -lpsxetc, -lpsxgpu и т.д.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **2. Дополнительные модули (MODULE_*.BIN)**
|
||||||
|
- **Должны включать** нужные библиотеки PsyQ, так как:
|
||||||
|
- Каждый модуль — **самодостаточный** исполняемый код.
|
||||||
|
- PsyQ не загружается глобально для модулей (они работают в изолированном контексте).
|
||||||
|
- Пример компиляции:
|
||||||
|
```bash
|
||||||
|
# Модуль для GPU
|
||||||
|
ccpsx MODULE_GPU.C -o MODULE_GPU.BIN -lpsxgpu -lpsxgte
|
||||||
|
|
||||||
|
# Модуль для MDEC
|
||||||
|
ccpsx MODULE_MDEC.C -o MODULE_MDEC.BIN -lpsxmdec
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **3. Почему такая разница?**
|
||||||
|
| Компонент | Библиотеки PsyQ | Причина |
|
||||||
|
|--------------------|----------------|-------------------------------------------------------------------------|
|
||||||
|
| **Основная программа** | Не нужны | Только загружает модули и передаёт `GameState`. Не использует GPU/MDEC. |
|
||||||
|
| **Модули** | Обязательны | Каждый модуль — независимый код, требующий свои библиотеки. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **4. Как это работает в памяти?**
|
||||||
|
1. Основная программа:
|
||||||
|
- Занимает **нижнюю часть RAM** (например, `0x80010000`).
|
||||||
|
- Не знает о существовании PsyQ-функций.
|
||||||
|
|
||||||
|
2. Модули:
|
||||||
|
- Загружаются в **фиксированный адрес** (`0x80030000`).
|
||||||
|
- Содержат **свои копии библиотек** (например, `libgpu`).
|
||||||
|
- Получают доступ к `GameState` через указатель.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **5. Пример: вызов функций**
|
||||||
|
- В модуле `MODULE_GPU.C`:
|
||||||
|
```c
|
||||||
|
#include <libgpu.h> // Библиотека внутри модуля
|
||||||
|
|
||||||
|
void module_entry(GameState *state) {
|
||||||
|
// Использует свою копию LoadImage
|
||||||
|
RECT rect = {0, 0, 256, 256};
|
||||||
|
LoadImage(&rect, (uint32_t*)texture); // Функция из libgpu
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- В основной программе (`MAIN.C`):
|
||||||
|
```c
|
||||||
|
// Нет #include <libgpu.h>!
|
||||||
|
void load_module() {
|
||||||
|
// Только загрузка бинарника
|
||||||
|
CdRead(sector, (uint32_t*)0x80030000, size);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **6. Ограничения**
|
||||||
|
- **Дублирование кода**: Каждый модуль содержит свои библиотеки → увеличивает размер.
|
||||||
|
- **Нет глобального состояния**: Если `libgpu` хранит внутренние переменные, они будут разными для каждого модуля.
|
||||||
|
- **Только последовательное выполнение**: Модули не могут работать одновременно (перезаписывают один регион памяти).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **7. Оптимизация**
|
||||||
|
Если модули используют **одни и те же библиотеки**, можно:
|
||||||
|
1. Вынести общие библиотеки в **отдельный загружаемый модуль**.
|
||||||
|
2. Передавать **указатели на функции** (как в предыдущих примерах).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **8. Итог**
|
||||||
|
- **Основная программа** — минималистична, без зависимостей.
|
||||||
|
- **Модули** — самодостаточные бинарники со своими библиотеками.
|
||||||
|
- **Общение** через общую структуру `GameState`.
|
||||||
|
|
||||||
|
Это архитектурно напоминает **плагины в современных движках**, где каждый плагин собирается со своими зависимостями.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
------------------
|
||||||
|
|
||||||
|
|
||||||
|
Да, вы абсолютно правы! Моя ошибка — **основная программа действительно использует `libcd.h` (и другие библиотеки PsyQ для базовых операций)**, но **ключевое различие** в следующем:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **1. Уточнение архитектуры**
|
||||||
|
| Компонент | Библиотеки PsyQ | Почему? |
|
||||||
|
|--------------------|------------------------------------|-------------------------------------------------------------------------|
|
||||||
|
| **Основная программа** | `libcd.h`, `libetc.h`, `libgte.h` | Только для **загрузки модулей**, управления памятью и отладки (FntPrint). Не использует GPU/MDEC/SPU. |
|
||||||
|
| **Модули** | Свои специфичные библиотеки (`libgpu`, `libmdec`) | Каждый модуль — самостоятельный код, требующий **все свои зависимости**. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **2. Исправленный пример компиляции**
|
||||||
|
#### **Основная программа (MAIN.C)**
|
||||||
|
```bash
|
||||||
|
# Нужны только базовые библиотеки для загрузки модулей
|
||||||
|
ccpsx MAIN.C -o MAIN.EXE -lpsxcd -lpsxetc -lpsxgte
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Модули**
|
||||||
|
```bash
|
||||||
|
# GPU-модуль (со своим libgpu)
|
||||||
|
ccpsx MODULE_GPU.C -o MODULE_GPU.BIN -lpsxgpu -lpsxgte
|
||||||
|
|
||||||
|
# MDEC-модуль (со своим libmdec)
|
||||||
|
ccpsx MODULE_MDEC.C -o MODULE_MDEC.BIN -lpsxmdec
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **3. Почему основная программа не включает `libgpu`/`libmdec`?**
|
||||||
|
- Она **не вызывает** функции вроде `LoadImage()` или `MDEC_Decode()`.
|
||||||
|
- Её задача — лишь:
|
||||||
|
- Чтение секторов с диска (`libcd`).
|
||||||
|
- Вывод текста (`libetc`).
|
||||||
|
- Передача управления модулям.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **4. Аналогия с операционной системой**
|
||||||
|
- **Основная программа** — как **ядро ОС**, которое:
|
||||||
|
- Умеет загружать драйверы (модули).
|
||||||
|
- Не содержит код для работы с графикой/звуком.
|
||||||
|
- **Модули** — как **драйверы**, которые:
|
||||||
|
- Содержат весь специфичный код (например, для GPU).
|
||||||
|
- Получают доступ к «ядру» через общие структуры (`GameState`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **5. Полный список зависимостей**
|
||||||
|
#### Для **MAIN.C**:
|
||||||
|
```c
|
||||||
|
#include <libcd.h> // CdRead(), CdInit()
|
||||||
|
#include <libetc.h> // FntPrint(), VSync()
|
||||||
|
#include <libgte.h> // Базовая математика (если используется)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Для **MODULE_GPU.C**:
|
||||||
|
```c
|
||||||
|
#include <libgpu.h> // LoadImage(), DrawPrim()
|
||||||
|
#include <libetc.h> // FntPrint() (если нужно)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **6. Итог**
|
||||||
|
- **Основная программа** использует **минимальный набор PsyQ** (`libcd`, `libetc`).
|
||||||
|
- **Модули** включают **все необходимые им библиотеки** (`libgpu`, `libmdec` и т.д.).
|
||||||
|
- **Общение** между ними происходит через **общую структуру** `GameState`.
|
||||||
|
|
||||||
|
Спасибо за замечание! Теперь архитектура стала ещё понятнее 😊.
|
||||||
Reference in New Issue
Block a user