Представлен выпуск проекта OpenMW 0.50, развивающего свободную реализацию движка для ролевой игры в жанре фэнтези The Elder Scrolls 3: Morrowind. По сравнению с оригинальным движком в OpenMW реализован модернизированный интерфейс пользователя, улучшена графика, добавлен собственный редактор OpenMW-CS для создания новых игр и модов, задействован движок симуляции физических процессов Bullet, добавлена поддержка платформ macOS и Linux, улучшено поведение ботов...Подробнее: https://www.opennet.dev/opennews/art.shtml?num=64206
Ремастер Oblivion вот запилили на UE5:
https://steamcommunity.com/app/2623190/screenshots/
А вот Elder Scrolls VI вроде как делают на Creation Engine 2, на котором сделан Starfield:
https://steamcommunity.com/app/1716740/screenshots/
Я тут баловался с CE и в Darkest Dungeon с помощью CT систему облегчения-усложнения (пропорциональное изменение параметров) придумал с помощью хитрого приемчика. )
Как же ужасно выглядят эти игры. Безотносительно эпохи и совершенства движка. Может они были популярны из-за сюжета, но я с самого их начала не могу решиться на то, чтобы играть в это уродство.А про конкретно эти порты - а где там UE5? Где его мощь? Модели и текстуры как были мерзкими так и остались. Переделать!
>UE5? Где его мощь?Чтобы увидеть всю "мощь" нужна RTX 5090.
И это только fullhd и не слишком сложная сцена. Но, вообще, это единственный движок сейчас, если не злоупотребляли блупринтами и сомнительными шейдерами он весьма приличную производительность показывает даже на древних картах (особенно по сравнению с юнити, если покрутить настройки даже выдаст адекватную производительность, и юнити с годотом никак и никогда её не выдадут).
> показывает даже на древних картахЧего?
https://www.reddit.com/r/kingdomcome/comments/1cjp9kw/dan_v&.../
Вот дядька неплохо поясняет. К слову, его продукт работает на любой лопате и выглядит не хуже.
>на UE5Сразу ффтопку.
Ремастер Unreal Engine 5, мягко говоря, отстой. Моды делать стало намного неудобнее, официального TES Construction Set под ремастер нет. Атмосферу оригинала не сохранили, броню видоизменили и зацензурили. В общем, испортили. Оригинал в разы лучше.
Какие-то скучные обои из нулевых. Не хватает толковых молодых дизайнеров. И звук какой-то блеклый. Во-общем, не впечатлило.
Это жанр Action RPG. Кому какая половинка нравится.
ещё горизонт всегда в мыле и тумане...
Без тумана там ни атмосферы, ни графики. На скринах какой-то стрёмный туман, в оригинале более душевный.
Оригинальный туман это типичная линейная зависимость, резко обрубающая видимость. Нет там художественной задумки, только аппаратные ограничения того времени. На проверку вся "душа" оказывается прозаическими обстоятельствами. Бюджет пишет сценарий.
> Оригинальный туман это типичная линейная зависимость, резко обрубающая видимость. Нет
> там художественной задумки, только аппаратные ограничения того времени. На проверку вся
> "душа" оказывается прозаическими обстоятельствами. Бюджет пишет сценарий.Ну вон можно сравнить. Оверхаул мод позволяет отключить туман, выглядит не очень. Про аппаратные ограничения что-то сомневаюсь, моды появились примерно сразу и самое слабое железо их вполне тянуло. Тут скорее творческое видение у авторов. Многие игры того времени добавляли подобный туман, чтобы было поинтереснее.
>>ещё горизонт всегда в мыле и тумане...Это настраивается, или и дальность прорисовки можно выкрутить на максимум.
Но там, если что, местность с туманом и бурями.Хотя, мы то знаем, что придумали это что бы на железе начала 2000х годов хоть как то оптимизировать. А сейчас можно отключить, если производительность позволит.
С молодыми дизайнерами Геншин получится или Фортнайт, если повезёт.
Геншин довольно хорош в графике и по дизайну мира. Он уже апдейтнулся и увеличил минимальные требования, если вы не знали. Реалистичность - это не обязательно хорошо. А уж в анимэлайк она точно ни к чему. Но я сейчас не о гача-геймплее.
Ребята подскажите, а какой свободный игровой движок оптимально подходит для создания гамесов в стиле Диабло, Alien Shooter 2 ? мне вообщше нравяца больше изометрические гамесы, чем The Elder Scrolls 3. А ещё мне нравится Millennium Soldier: Expendable, жаль никто продолжение не сделал... https://retrofreakreviews.com/2018/04/13/expendable-for-pc-r.../
Бери godot engine
https://github.com/godotengine/godot/issues/84137
И делай на нём ремастеры первых шести Final Fantasy :)
Бери что угодно. Основная проблема — сделать игру.
Всё-таки есть определённая корреляция между опенсорсностью движка и отсутствием игр на нём.
Угадай почему...
> отсутствием игрBattlefield 6 уже можно считать релизнутой, или она всё ещё в альфе? А то чё-то дохрена идиотских багов и недочётов в балансе, плюс весь геймплей сводится к пострелушкам на пукалках и скаканию как маkaka [лол, opennet цензурит это слово] сквозь текстурки кирпичей (что можно было делать ещё в Quake). Плюс про отсутствие игр на годоте - наглая ложь.
flare engine
> изометрические гамесыТы что таблеток объелся? Этот движок сам игру не сделает.
Ты даже не пытался искать.
https://github.com/bobeff/open-source-engines
Долгой жизни и активного развития проекту!
Мне кажется движок не универсальный. Завязан на беседковское. Ресурсы под свою игру должны быть похожи на морровиндовские.
Ресурсы упаковать в такой же контейнер или добавить поддержку ZIP не проблема. В плане самих данных: текстур, мешей, звуков, - хз.
>Представлен выпуск проекта OpenMW 0.50, развивающего свободную реализацию движка для ролевой игры в жанре фэнтези The Elder Scrolls 3: Morrowind.Я извиняюсь за дерзость что процитировал первый абзац темы, но вам правильно кажется.
Без разницы на что должны быть похожи ресурсы, если игр на нём нет и не будет.
Графоний какой-то из первой половины нулевых. Зачем такое делать в 2к25?
я в stoneshard для себя ce-экспериментировал и слегка залип. Разнообразная Система RPG притянула. )
Чел, ты бы для приличия сравнил как выглядила оригинальная морра и запущенная под OpenMW. Ахрененный графоний. Не супер реалистичный, но всё, что нужно для создания красивого открытого мира, есть.
Не понял. При чём тут "графоний половины нулевых", если новость про движок для игры, которая была разработана в 2002 году. Или же ты думаешь, что сменил движок и у тебя 8к?
Игра 2002 года и без OpenMW нормально не поиграешь:
https://youtu.be/fkvMfLJK0Lw?si=XKgkGBIZiw2f8nDA&t=759
Чтобы игра не была размером в терабайт. Прошлая часть была с миром почти бесконечного размера. С миллионами персонажей. Такая современная игра на анреале ни на какой диск не поместится
Дело не в графонии а в геймплее.
У меня вопрос, зачем в 2kkk25 делают вас?
>> Графоний какой-то из первой половины нулевых.Это графика образца начала 2010х. Всё что выжали из древнего движка.
А в начале, в стоке было существенно страшнее.Впрочем, эта игра идет на смартфоне, с дополнениями и модами, и отлично играбельна на сенсорном экране. А в этом классе, та же самая графика уже переходит в разряд фантастической. :)
Воу, кто-то занимается портом скайрима на OpenMW? Это же пушка!
В чём пушка? Скайрим самая скучная часть из всех.
Овливион скучнее был. Самая скучная даггерфол.
Арену не застали?
Редгаод гораздо заунывнее, особенно потому что там угробищное управление.
Пушка в открытости движка, как минимум. А не как сейчас, еле работающая поделка с багами интерфейса ещё с релиза, в последних версиях которой чтобы заставить моды работать нужно качать какую-то малварь под названием "мененджер модов", автообновляющуюся с нексуса.
только к концу 2025 года добавили эффект Доплера, который умели звуковые карточки ещё 90х годах прошлого века... мдя...
Intel HDA тоже умеет?По ощущениям, со времён, когда ESI Julia была топ картой, саундкарты только беспрестанно деградировали.
все звуковые карточки на базе чипа Envy24HT не были игровыми от слова совсем, будь это ESI Juli@ или M-Audio Revo. Они вообще не умеют в эффект Доплера или ЕАХ
Все эти аппаратные ухищрения сейчас не нужны, всё прекрасно делается софтом.
99% звука сейчас — это встройка, если в неё что-то подобное пихать, это будет бессмысленное удорожание. А что касается качества, тут как раз встройки неплохо подтянулись.
я как раз давно поджидал такого комментатора - софтовый 3D-вук полное фуфло!!! Это доказывает то, что в PlayStation 4 был специально добавлен аппаратный DSP. Если делать качественную реверберацию, а не на пресетах, как делают сейчас - то при 100 источниках звука твой core i7-12700 ляжет плашмями, точно также как Geforce 5080 ложится в Mafia 2 без дополнительного аппаратного обработчика PhisX !!! А помимо реверберации в 3D-звуке используются другие ресурсоемкие эффекты и с ростом полигонов растут требования к DSP в геометрической прогресси. Для современных гамесов с 128 источниками звука нужен DSP мощностью не менее 70000 MIPS !!!
>Geforce 5080 ложится в Mafia 2 без дополнительного аппаратного обработчика PhisXСпасибо, шиз. Обожаю твои каменты. И 12-летнего эксперта ещё. Да ладно, вас таких много тут. Просто шведский стол!:)
Ну он прав.
В 5000-й линейке убрали поддержку 32-битного PhysX (Mafia II - 2010 года) и если в настройках включена PhysX в старых играх, то даже 5090 лагает:
https://youtu.be/XNoBsrgoppQ?si=JF1qGRM-I8M4-60k&t=1263
для тех кто в бронепоезде
https://www.ixbt.com/news/2025/03/13/geforce-rtx-5080-gtx-58...
https://habr.com/ru/news/883778
Хорошая шизофрения, отборная. В современный игры с HRTF попробуй поиграть только.
В каких современный гамесах ты играешь с HRTF и как ты его включаешь?
Тоже поджидал этого коммента. Ведь в аппаратных DSP (особенно времён EAX и A3D) удивительно эффективное железо, куда нынешним CPU за ним угнаться.
DSP эффективнее CPU для обработки аудио в играх не просто "немного", а на порядки, в десятки и сотни раз, для специфических задач по ряду причин:1. Гарвардская архитектура
CPU (Фон Неймановская архитектура): И команды (инструкции), и данные хранятся в одной памяти. Шина одна. Это создает "бутылочное горлышко": процессор не может одновременно загружать команду и данные, он делает это по очереди.DSP (Гарвардская архитектура): Есть раздельные памяти и шины для команд и для данных. Это позволяет процессору одновременно загружать инструкцию из одной памяти и данные из другой, что резко увеличивает скорость обработки.
2. Параллелизм на уровне инструкций (ILP)
DSP спроектированы так, чтобы за один такт выполнять несколько операций. Типичная для аудио операция "Умножить и Накопить" (MAC - Multiply–Accumulate), которая является основой для фильтров, преобразований Фурье и т.д., выполняется на DSP за один такт. CPU же на это потратит несколько тактов.3. Специализированные аппаратные блоки
DSP содержат "вшитые" в чип аппаратные ускорители для самых частых аудио-операций:Аппаратные циклы: Позволяют зацикливать кусок кода без затратных проверок условия в конце каждой итерации (это "предсказано" аппаратно).
Бит-реверсивная адресация: Критически важна для быстрого выполнения Быстрого Преобразования Фурье (FFT).
Аппаратные акселераторы для кодеков: Современные аудио-DSP имеют блоки для кодирования/декодирования форматов вроде Opus, AAC, MP3 с минимальными затратами энергии.
4. Предсказуемость и детерминизм
Обработка аудио — это потоковая задача, требующая строгого соблюдения временных интервалов. Если вы не обработаете следующий сэмпл звука за 1/48000 секунды (для 48 кГц), будет слышимый щелчок или искажение.Поэтому даже самые современные процы core i9 не смогут в современных гамесах рассчитывать звук полностью программно на уровне Audigy X-Fi (еах 5) - лагать будет мощно, фпс 1-2, но и мощности X-Fi для современных гамесов катострафически не хватит, потому что это было достаточно для гамесов 20 летней давности, а с тех пор полигонов выросло на порядки. Чем больше полигонов - тем больше отражений нужно вычислить...
В предыдущем комменте я написал в конце "Для современных гамесов с 128 источниками звука нужен DSP мощностью не менее 70 000 MIPS !!!" Для сравнения у Vortex 2 мощность 600 MIPS, а у Audigy X-Fi (EMU20k) 10 000 MIPS!!!
> В предыдущем комменте я написал в конце "Для современных гамесов с 128 источниками звука нужен DSP мощностью не менее 70 000 MIPS !!!" Для сравнения у Vortex 2 мощность 600 MIPS, а у Audigy X-Fi (EMU20k) 10 000 MIPS!!!Ужас! ужас! а сколько у современных CPU GIPS?
Ну вот запусти преобразование Фурье на своём проце и на Audigy и тогда будешь рассказывать сколько там у тебя GIPS... ахахаххх
Наверное разработчики PlayStation получше тебя в этом соображают, если в ПС4 добавили отдельный DSP для 3D-звука !!!
> Ну вот запусти преобразование Фурье на своём проце и на AudigyНа проце, допустим, я его запускал, ещё когда на первопне MP3 кодировал, а вот на Audigy это сделать как? Специально из закромов достану, чтобы сравнить.
> Наверное разработчики PlayStation получше тебя в этом соображают, если в ПС4 добавили отдельный DSP для 3D-звука !!!
Наверное, потому, что это устройство для совершенно определённых целей и с совершенно жёсткой конфигурацией? Там это имеет смысл. И да, это придаёт звуку какое-то особое волшебство? Я неоднократно играл, так чёт не заметил по сравнению с ПК.
Для начала можно запустить простенький тест на Audigy:#include <windows.h>
#include <dsound.h>
#include <cmath>
#include <vector>
#include <complex>class FourierTest {
public:
void generateTestSignal(std::vector<float>& signal, int sampleRate) {
// Генерация тестового сигнала (синус + гармоники)
for (int i = 0; i < signal.size(); i++) {
double t = (double)i / sampleRate;
signal[i] = 0.6f * sin(2 * M_PI * 1000 * t) + // 1 kHz основная
0.3f * sin(2 * M_PI * 2000 * t) + // 2 kHz гармоника
0.1f * sin(2 * M_PI * 3000 * t); // 3 kHz гармоника
}
}
void FFT(std::vector<std::complex<float>>& data) {
// Реализация БПФ
const size_t N = data.size();
if (N <= 1) return;
// Разделение на четные и нечетные
std::vector<std::complex<float>> even(N/2), odd(N/2);
for (size_t i = 0; i < N/2; i++) {
even[i] = data[i*2];
odd[i] = data[i*2+1];
}
// Рекурсивный вызов
FFT(even);
FFT(odd);
// Объединение
for (size_t k = 0; k < N/2; k++) {
std::complex<float> t = std::polar(1.0f, -2.0f * M_PI * k / N) * odd[k];
data[k] = even[k] + t;
data[k + N/2] = even[k] - t;
}
}
};если всё ОК, можно уже запустить приблизительно такой с профилированием и загрузкой ЦП, для измерения:
- Задержки ввода-вывода (latency)
- Способности обрабатывать данные без разрывов (glitches)
- Максимальную нагрузку, которую выдерживает звуковая карта:
#include <windows.h>
#include <dsound.h>
#include <cmath>
#include <vector>
#include <complex>
#include <chrono>
#include <thread>
#include <pdh.h>
#include <pdhmsg.h>
#include <iostream>
#include <iomanip>
#include <psapi.h>#pragma comment(lib, "dsound.lib")
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "pdh.lib")class CPUUsageMonitor {
private:
PDH_HQUERY cpuQuery;
PDH_HCOUNTER cpuTotalCounter;
FILETIME prevSysKernel, prevSysUser, prevProcKernel, prevProcUser;public:
CPUUsageMonitor() : cpuQuery(NULL), cpuTotalCounter(NULL) {
PdhOpenQuery(NULL, NULL, &cpuQuery);
PdhAddEnglishCounter(cpuQuery, "\\Processor(_Total)\\% Processor Time", NULL, &cpuTotalCounter);
PdhCollectQueryData(cpuQuery);
SYSTEM_INFO sysInfo;
FILETIME ftime, fsys, fuser;
GetSystemInfo(&sysInfo);
GetSystemTimeAsFileTime(&ftime);
memcpy(&prevSysKernel, &fsys, sizeof(FILETIME));
memcpy(&prevSysUser, &fuser, sizeof(FILETIME));
}
~CPUUsageMonitor() {
if (cpuQuery) PdhCloseQuery(cpuQuery);
}
double getCurrentCPUUsage() {
PDH_FMT_COUNTERVALUE counterVal;
PdhCollectQueryData(cpuQuery);
PdhGetFormattedCounterValue(cpuTotalCounter, PDH_FMT_DOUBLE, NULL, &counterVal);
return counterVal.doubleValue;
}
double getProcessCPUUsage(HANDLE processHandle) {
FILETIME ftime, fsys, fuser;
FILETIME fcreate, fexit, fkernel, fuserproc;
GetSystemTimeAsFileTime(&ftime);
GetProcessTimes(processHandle, &fcreate, &fexit, &fkernel, &fuserproc);
ULARGE_INTEGER now, sys, user, procKernel, procUser;
memcpy(&now, &ftime, sizeof(FILETIME));
memcpy(&sys, &prevSysKernel, sizeof(FILETIME));
memcpy(&user, &prevSysUser, sizeof(FILETIME));
memcpy(&procKernel, &prevProcKernel, sizeof(FILETIME));
memcpy(&procUser, &prevProcUser, sizeof(FILETIME));
ULARGE_INTEGER newSys, newUser, newProcKernel, newProcUser;
memcpy(&newSys, &fsys, sizeof(FILETIME));
memcpy(&newUser, &fuser, sizeof(FILETIME));
memcpy(&newProcKernel, &fkernel, sizeof(FILETIME));
memcpy(&newProcUser, &fuserproc, sizeof(FILETIME));
double percent = 0.0;
ULONGLONG totalSys = (newSys.QuadPart - sys.QuadPart) + (newUser.QuadPart - user.QuadPart);
ULONGLONG totalProc = (newProcKernel.QuadPart - procKernel.QuadPart) +
(newProcUser.QuadPart - procUser.QuadPart);
if (totalSys > 0) {
percent = (double)totalProc / totalSys * 100.0;
}
memcpy(&prevSysKernel, &fsys, sizeof(FILETIME));
memcpy(&prevSysUser, &fuser, sizeof(FILETIME));
memcpy(&prevProcKernel, &fkernel, sizeof(FILETIME));
memcpy(&prevProcUser, &fuserproc, sizeof(FILETIME));
return percent;
}
};class MemoryMonitor {
public:
static SIZE_T getProcessMemoryUsage() {
PROCESS_MEMORY_COUNTERS pmc;
if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc))) {
return pmc.WorkingSetSize / 1024; // KB
}
return 0;
}
static SIZE_T getPeakMemoryUsage() {
PROCESS_MEMORY_COUNTERS pmc;
if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc))) {
return pmc.PeakWorkingSetSize / 1024; // KB
}
return 0;
}
};class HighPrecisionTimer {
private:
LARGE_INTEGER frequency;
bool supported;
public:
HighPrecisionTimer() {
supported = QueryPerformanceFrequency(&frequency);
}
double getTime() {
if (supported) {
LARGE_INTEGER current;
QueryPerformanceCounter(¤t);
return (double)current.QuadPart / frequency.QuadPart;
}
return (double)GetTickCount() / 1000.0;
}
};class FourierTest {
private:
CPUUsageMonitor cpuMonitor;
HighPrecisionTimer timer;
public:
struct PerformanceMetrics {
double totalTime;
double fftTime;
double iOTime;
double cpuUsage;
double memoryUsage;
double peakMemory;
int bufferSize;
std::string testType;
};
void generateTestSignal(std::vector<float>& signal, int sampleRate, float frequency = 1000.0f) {
for (size_t i = 0; i < signal.size(); i++) {
double t = (double)i / sampleRate;
// Сложный сигнал с несколькими гармониками
signal[i] = 0.6f * sin(2 * M_PI * frequency * t) +
0.3f * sin(2 * M_PI * frequency * 2 * t) +
0.1f * sin(2 * M_PI * frequency * 3 * t) +
0.05f * sin(2 * M_PI * frequency * 5 * t);
}
}
void FFT(std::vector<std::complex<float>>& data) {
const size_t N = data.size();
if (N <= 1) return;
// Разделение на четные и нечетные
std::vector<std::complex<float>> even(N/2), odd(N/2);
for (size_t i = 0; i < N/2; i++) {
even[i] = data[i*2];
odd[i] = data[i*2+1];
}
// Рекурсивный вызов
FFT(even);
FFT(odd);
// Объединение
for (size_t k = 0; k < N/2; k++) {
std::complex<float> t = std::polar(1.0f, -2.0f * M_PI * k / N) * odd[k];
data[k] = even[k] + t;
data[k + N/2] = even[k] - t;
}
}
void optimizedFFT(std::vector<std::complex<float>>& data) {
const size_t N = data.size();
size_t k = N, n;
float thetaT = M_PI / N;
std::complex<float> phiT = std::complex<float>(cos(thetaT), -sin(thetaT));
std::complex<float> T;
while (k > 1) {
n = k;
k >>= 1;
phiT = phiT * phiT;
T = 1.0f;
for (size_t l = 0; l < k; l++) {
for (size_t a = l; a < N; a += n) {
size_t b = a + k;
std::complex<float> t = data[a] - data[b];
data[a] += data[b];
data[b] = t * T;
}
T *= phiT;
}
}
// Бит-реверс перестановка
size_t j = 0;
for (size_t i = 0; i < N - 1; i++) {
if (i < j) std::swap(data[i], data[j]);
size_t k = N >> 1;
while (k <= j) {
j -= k;
k >>= 1;
}
j += k;
}
}
PerformanceMetrics testCPUFFT(int bufferSize, int sampleRate, bool useOptimized = false) {
PerformanceMetrics metrics;
metrics.bufferSize = bufferSize;
metrics.testType = useOptimized ? "CPU Optimized FFT" : "CPU Standard FFT";
std::vector<float> testSignal(bufferSize);
generateTestSignal(testSignal, sampleRate);
double startMemory = MemoryMonitor::getProcessMemoryUsage();
double startCPU = cpuMonitor.getCurrentCPUUsage();
double startTime = timer.getTime();
// Выполнение БПФ
std::vector<std::complex<float>> fftData(bufferSize);
for (size_t i = 0; i < bufferSize; i++) {
fftData[i] = std::complex<float>(testSignal[i], 0.0f);
}
double fftStartTime = timer.getTime();
if (useOptimized) {
optimizedFFT(fttData);
} else {
FFT(fttData);
}
double fftEndTime = timer.getTime();
double endTime = timer.getTime();
double endCPU = cpuMonitor.getCurrentCPUUsage();
double endMemory = MemoryMonitor::getProcessMemoryUsage();
metrics.totalTime = (endTime - startTime) * 1000; // мс
metrics.fftTime = (fftEndTime - fftStartTime) * 1000; // мс
metrics.cpuUsage = (startCPU + endCPU) / 2.0;
metrics.memoryUsage = (startMemory + endMemory) / 2.0;
metrics.peakMemory = MemoryMonitor::getPeakMemoryUsage();
return metrics;
}
PerformanceMetrics testSoundCardFFT(int bufferSize, int sampleRate) {
PerformanceMetrics metrics;
metrics.bufferSize = bufferSize;
metrics.testType = "Sound Card FFT";
std::vector<float> testSignal(bufferSize);
generateTestSignal(testSignal, sampleRate);
double startMemory = MemoryMonitor::getProcessMemoryUsage();
double startCPU = cpuMonitor.getCurrentCPUUsage();
double startTime = timer.getTime();
// Эмуляция работы со звуковой картой
// В реальном приложении здесь будет DirectSound код
double ioStartTime = timer.getTime();
// Эмуляция задержки звуковой карты
std::this_thread::sleep_for(std::chrono::microseconds(500));
// Эмуляция аппаратного БПФ
std::vector<std::complex<float>> fftData(bufferSize);
for (size_t i = 0; i < bufferSize; i++) {
fftData[i] = std::complex<float>(testSignal[i], 0.0f);
}
optimizedFFT(fttData); // Аппаратное ускорение
double ioEndTime = timer.getTime();
double endTime = timer.getTime();
double endCPU = cpuMonitor.getCurrentCPUUsage();
double endMemory = MemoryMonitor::getProcessMemoryUsage();
metrics.totalTime = (endTime - startTime) * 1000; // мс
metrics.iOTime = (ioEndTime - ioStartTime) * 1000; // мс
metrics.cpuUsage = (startCPU + endCPU) / 2.0;
metrics.memoryUsage = (startMemory + endMemory) / 2.0;
metrics.peakMemory = MemoryMonitor::getPeakMemoryUsage();
return metrics;
}
void runComparativeAnalysis() {
const int sizes[] = {256, 512, 1024, 2048, 4096, 8192, 16384};
const int sampleRate = 44100;
const int iterations = 5;
std::cout << "==================================================================================" << std::endl;
std::cout << " СРАВНИТЕЛЬНЫЙ АНАЛИЗ ПРОИЗВОДИТЕЛЬНОСТИ" << std::endl;
std::cout << "==================================================================================" << std::endl;
std::cout << std::setw(8) << "Размер" << " | "
<< std::setw(18) << "Тип теста" << " | "
<< std::setw(10) << "Время(мс)" << " | "
<< std::setw(12) << "БПФ время(мс)" << " | "
<< std::setw(10) << "ЦПУ(%)" << " | "
<< std::setw(10) << "Память(МБ)" << " | "
<< std::setw(12) << "Пик память(МБ)" << std::endl;
std::cout << "----------------------------------------------------------------------------------" << std::endl;
for (int size : sizes) {
// Тест стандартного БПФ на ЦПУ
PerformanceMetrics cpuStd = testCPUFFT(size, sampleRate, false);
printMetrics(cpuStd);
// Тест оптимизированного БПФ на ЦПУ
PerformanceMetrics cpuOpt = testCPUFFT(size, sampleRate, true);
printMetrics(cpuOpt);
// Тест звуковой карты
PerformanceMetrics soundCard = testSoundCardFFT(size, sampleRate);
printMetrics(soundCard);
std::cout << "----------------------------------------------------------------------------------" << std::endl;
// Небольшая пауза между тестами
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
void printMetrics(const PerformanceMetrics& metrics) {
std::cout << std::setw(8) << metrics.bufferSize << " | "
<< std::setw(18) << metrics.testType << " | "
<< std::setw(10) << std::fixed << std::setprecision(3) << metrics.totalTime << " | "
<< std::setw(12) << std::fixed << std::setprecision(3) << metrics.fftTime << " | "
<< std::setw(10) << std::fixed << std::setprecision(1) << metrics.cpuUsage << " | "
<< std::setw(10) << std::fixed << std::setprecision(1) << (metrics.memoryUsage / 1024) << " | "
<< std::setw(12) << std::fixed << std::setprecision(1) << (metrics.peakMemory / 1024) << std::endl;
}
void runStressTest() {
std::cout << "\n==================================================================================" << std::endl;
std::cout << " ТЕСТ ПОД НАГРУЗКОЙ" << std::endl;
std::cout << "==================================================================================" << std::endl;
const int bufferSize = 4096;
const int sampleRate = 44100;
const int stressIterations = 100;
double totalCPUTime = 0;
double totalSoundCardTime = 0;
double maxCPUUsage = 0;
double maxMemoryUsage = 0;
for (int i = 0; i < stressIterations; i++) {
PerformanceMetrics cpu = testCPUFFT(bufferSize, sampleRate, true);
PerformanceMetrics sound = testSoundCardFFT(bufferSize, sampleRate);
totalCPUTime += cpu.totalTime;
totalSoundCardTime += sound.totalTime;
maxCPUUsage = std::max(maxCPUUsage, cpu.cpuUsage);
maxMemoryUsage = std::max(maxMemoryUsage, cpu.memoryUsage);
if (i % 10 == 0) {
std::cout << "Итерация " << i << "/" << stressIterations
<< " - ЦПУ: " << std::fixed << std::setprecision(2) << cpu.totalTime << "мс"
<< ", Зв.карта: " << sound.totalTime << "мс" << std::endl;
}
}
std::cout << "\nРЕЗУЛЬТАТЫ ТЕСТА ПОД НАГРУЗКОЙ:" << std::endl;
std::cout << "Среднее время ЦПУ: " << std::fixed << std::setprecision(3)
<< (totalCPUTime / stressIterations) << " мс" << std::endl;
std::cout << "Среднее время звуковой карты: " << (totalSoundCardTime / stressIterations) << " мс" << std::endl;
std::cout << "Максимальная загрузка ЦПУ: " << std::fixed << std::setprecision(1)
<< maxCPUUsage << "%" << std::endl;
std::cout << "Максимальное использование памяти: " << std::fixed << std::setprecision(1)
<< (maxMemoryUsage / 1024) << " МБ" << std::endl;
double speedup = totalCPUTime / totalSoundCardTime;
std::cout << "Ускорение звуковой карты: " << std::fixed << std::setprecision(2)
<< speedup << "x" << std::endl;
}
};int main() {
SetConsoleOutputCP(CP_UTF8);
std::cout << "Запуск теста производительности БПФ..." << std::endl;
std::cout << "Аудиокарта: Audigy X-Fi" << std::endl;
std::cout << "Инициализация мониторов производительности..." << std::endl;
FourierTest tester;
// Запуск сравнительного анализа
tester.runComparativeAnalysis();
// Запуск теста под нагрузкой
tester.runStressTest();
std::cout << "\nТестирование завершено. Нажмите Enter для выхода...";
std::cin.get();
return 0;
}
> В-третьих, а не дешевые ли у тебя наушники?Во-первых, на консолях на бытовых ТВ играют. Как правило, на их же динамиках.
Вышеприведённые тесты вообще не понял, что должны показать, по-человечески можно?
> Во-первых, на консолях на бытовых ТВ играют. Как правило, на их же динамиках.чтобы на ТВ получить 3д-звук без наушников нужно подключать минимум 4 колонки (2 сзади)
> Вышеприведённые тесты вообще не понял, что должны показать, по-человечески можно?измеряет мипсы и гипсы на аудиджи и проце через преобразование Фурье
> Наверное, потому, что это устройство для совершенно определённых целей и с совершенно жёсткой конфигурацией? Там это имеет смысл. И да, это придаёт звуку какое-то особое волшебство? Я неоднократно играл, так чёт не заметил по сравнению с ПК.Во-первых, какая у тебя ПС4 - не на всех есть DSP (Базовая PS4 (Slim, Fat) - Отсутствует, PS4 Pro - Присутствует)
Во-вторых, далеко не все игры используют этот DSP
В-третьих, а не дешевые ли у тебя наушники?
> Во-первых, какая у тебя ПС4 - не на всех есть DSP (Базовая PS4 (Slim, Fat) - Отсутствует, PS4 Pro - Присутствует)Ой, как всё сложно-то. Я было подумал, куплю божественную плойку и получу неземной звук (на своём телевизоре за тридцать тыщ, да), а тут сложнее с подбором конфигурации, чем на ПК.
Хер знает. Я сейчас играю на PS5 Pro и наушники гарнитура Elite. Всё как-бы зашибись. Я не тот аноним. PS4 и PS4 Pro в коробках лежат. Наследники задорого продадут :D
а у PS5 есть не просто чип, а целый кастомный блок на основе GPU - Tempest Engine, способный обрабатывать сотни immersivных 3D-звуков с высочайшей детализацией, так сказать современная версия Wavetracing на Vortex... А ПК-бояре благодаря Микрософту как минимум ближайшие десятилетие будут отставать в области звука лет на 20 от PS... ахаахахх
Ты сейчас бред несеш. Слышал звон, да не знаешь где он.
>Все эти аппаратные ухищрения сейчас не нужныМожет быть, но разница есть даже с простыми картами:
- https://www.asus.com/ru/motherboards-components/sound-cards/.../
- https://www.asus.com/ru/motherboards-components/sound-cards/.../
благодаря таким как ты звук на ПК откатился на 20 лет назад - до появления ЕАХ и A3D
ты просто из этой категории людей
https://rutube.ru/video/851ea75ace0deba9eb197255dfec4a3d/
нужно чтото с этим делать...
EAX и A3D были вынужденной мерой, причём оба не без недостатков. Сейчас 3D-звук запросто реализуется программно. Не знаю, как ещё это донести. Ну хоть API FMOD бегло просмотрите, например.
Ну я не вижу в FMOD многих API, какие есть в EAX и A3D. А ещё я вижу FMOD любит жульничать с источниками звука, экономя на ресурсах ПЦ, мдя... Наверное инженеры PlayStation 5 получше тебя в этом соображают и не просто так выделили для звука мощнейший аппаратный блок ??? Качественный 3D-звук - это такая же сложная технология, как RTX, которая требует мощный, многопоточный асик
> Ну я не вижу в FMOD многих API, какие есть в EAX и A3D.Стыд и позор разработчикам, которые не стали слепо копировать древние API.
> А ещё я вижу FMOD любит жульничать с источниками звука, экономя на ресурсах ПЦ, мдя...
То-то A3D и EAX не жульничали.
> Наверное инженеры PlayStation 5 получше тебя в этом соображают и не просто так выделили для звука мощнейший аппаратный блок ???
Насчёт «мощнейший» это маректологическая шелуха, а зачем они так сделали — а потому что могут. У них унифицированная архитектура, которая клепается многомиллионными тиражами по 10 лет, при довольно слабом CPU. Там это выгодно. А вот 90% пользователей ПК 3D-звук на встройке нафиг не сдался, а нишевые устройства всегда будут по оверпрайсу.
> Качественный 3D-звук - это такая же сложная технология, как RTX, которая требует мощный, многопоточный асик
Ага, и типа у саундбластеров и вортексов он был.
> Стыд и позор разработчикам, которые не стали слепо копировать древние API.ну я сужу не по названиям API, а по описаниям функций
> То-то A3D и EAX не жульничали.
аргументы? у тебя их нет, потому что ты даже не читал документацию по A3D...
> Качественный 3D-звук - это такая же сложная технология, как RTX, которая требует мощный, многопоточный асик
> Ага, и типа у саундбластеров и вортексов он был.Достаточно сравнить, как звучит реверберация в пещерах в оригинальной Diablo 2(с включенным ЕАХ) и Diablo 2 Resurrected, чтобы понять - какой фуфлыжный современный, программный 3D-звук... А вот большинство пользователей не смогут этого сделать, потому что они не смогут запустить на своих пк ХР... Я вот недавно перепрошел оригинальную Diablo 2 наслаждаясь реверберацией в пещерах и дворцах...
P.S. я вот не понимаю твоего противодействия качественному 3D-звуку, словно у тебя кусок хлеба забирают. Даже у той бабки, которой интернет не нужон, и то есть больше логичных аргументов... А может это такой генетический код русских людей - препятствовать развитию, японцы они не такие - они в отличие от русских много создали передовых технологий, а не только PlayStation...
Можно пожалуйста то же видео на других площадках? Рутьюб не люблю.
https://www.youtube.com/watch?v=SRARPdrTUp0
> Intel HDA тоже умеет?Что такое "доплер"? Это изменение частоты... Т.е. скорости выборки из буфера. Меняется всего лишь сэмплинг.
https://en.wikipedia.org/wiki/Doppler_effect
Чел, что ты хотел показать этой ссылкой?... is the change in the frequency ...
Погоди, ща он тебе ссылку на "разницу" звучания 16 бит и 24 бит ещё скинет, плюс статья о том как "жизненно необходимо" дома иметь карточку с дискретизацией в 96kHz.
Ну ты же не помогал проекту, поэтому все получилось медленнее.
Мне нравятся только первые две части Старинных свитков, те что двухмерные. Все что позже, трехмерные скатились в попсу.
Арена и Багерфол - попса, ибо двухмерка тоже в моде была. Настоящий тру это настолки по DnD :)
Настолки по DnD это буквально коммерческие поделки создаваемая корпорацией ради денег, а Computer RPG это настоящее искусство.
DnD крутая система. Класс брони, спасброски. Но вроде, как закопирайчена. Иначе было бы больше игр с ней.
набросок или идея не может быль лучше законченного произведения.
Например в отличии от фильма, сценарий это фильма обычного человека вообще не заинтересует, это только для знатоков, что бы узнать, что было задумано, что вырезали, что испортили..
Тот скрин с зелёными холмами - чисто Зельда с первого Свича. Или те Зельды всё же покрасивее будут. Сейчас смартфоны в лучшую графику могут.
Ассеты уж такие какие есть. Сколько движок не наворачивай а ассеты оригинала - такие какие есть.
> Тот скрин с зелёными холмами - чисто Зельда с первого Свича. Или
> те Зельды всё же покрасивее будут. Сейчас смартфоны в лучшую графику
> могут.Это недоигры с недоконсолей. Зельда с гейкуба (и другие более ранние игры) сегодня очень неплохо смотрится в эмуляторе, современным консолям это недостижимо. А спеки посмотри сам, в оригинале, конечно, не очень выглядит. Примерно такая же история с играми на glide api -- сегодня они нормально выглядят по сравнению с другими играми того времени. Игры с soundblaster eax намного лучше современных, и это всего лишь примитивный звук. Так что, если игры выглядят плохо, это только заслуга разработчиков.
> чисто ЗельдаВ Morrowind мир не выхлоп ИИ генератора, а вручную сделан, со всеми мелочами, и сам по себе уже произведение.
А в Зельде мир однообразен, но это не плохо прикрыто его интерактивностью.
Карочь, ты не играл ни в "Зов Природы", ни в "Слёзы Королевства".
Я коллекционирую игровые приставки и знаковые игры на них, если что.
После того как они создав шедерв Twilight Princess скатились в соло раст эта серия для меня мертва, имхо.
Лучше бы картографировали всю землю в открытый мир. Хоть польза была бы от этих движков.
> Лучше бы картографировали всю землю в открытый мир. Хоть польза была бы от этих движков.Скачай себе OSM planet file, вон те геопаркеты из новости и SRTM сканы - и занимайся себе натяжкой совы^W геоданных на глобус. Хотя геоданные то как таковые уже есть, в ломовом объеме - остается только визуализацию придумать.
Просто как вы понимаете, даже в больших и относительно подробных данных типа osm - допустим как выглядит дом разрисовано очень базово. Указан его полигон. В лучшем случае число этажей. Больше там никаких деталей визуализации ессно нет. А если их сделать более подробными - вы наверное не представляете себе объем этих данных...
В MS Fly симуляторе можно пролететь над собственной дачей, а там даже сортир нанесен.
Они свой движок при этом пилят? Проще же взять Godot. Можно даже будет логику подгрузки локаций повторить на GDScript.
Проекту, наверное, больше 10 лет и в то время не было понятно, что godot сильно разовьётся со временем, а не сгниёт как куча других отрытых игровых движков. OpenMW уже использовал готовый игровой движок первое время, вроде тот из которого Urho3D вырос, но была низкая производительность и в конце концов решили взять готовый 3D-движок OpenSceneGraph и некоторые другие сторонние модули и писать остальное самим. Сейчас уже появился VulkanSceneGraph и кто-то делает экспериментальный и не официальный порт на него, но официальных планов по переходу, на сколько я знаю, нет.
> и в то время не было понятно, что godot сильно разовьётся со временем, а не сгниёт как куча других отрытых игровых движков.Зато теперь это наконец стало понятно.
Когда начиналась рзаработка OpenMW, в 2008 году, никакого Godot ещё не релизном виде не было. В качестве рендера они взяли Ogre3D (это именно 3д движок, отвечающий только за отрисовку графики).Позднее из-за проблем с производительностью рендеринг перевели на OpenSceneGraph, который используется и сейчас.
огр это ппц, Kenshi подтверждает)
Просто для Morrowind не нужно тонкое ковыряние в движке. Бег, прыжок, фонарик, усталость, камера делаются за 2 часа в Godot по урокам. Была бы у меня неделя-две свободного времени...
В морре нет фонарика