Итак, давайте же разберемся что и как эмулируется, на примере PSX.
Железо PSX состоит из процессора R3000A(MIPS) работающего на частоте ~40Mhz, сопроцессора GTE(специальный сопроцессор для 3D-преобразований), GPU(собственно видео-сопроцессор), декодер mpeg и SPU(звуковой сопроцессор).
Можно начать с того, что в нашей динге всё эмулируется одним процессором, хотя бы поэтому нужно более мощное железо чем эмулируемое (ну это и коню понятно).
Ну, начнем пожалуй разбор полетов:
1. Допустим, откинем SPU и mpeg-декодер, т.к. можно жить и без них (производительность mpeg можно пережить)
2. Процессор - тут что-то сложно сказать, т.к. и так используется хорошая оптимизация, хотя по идее на динге можно попробовать сделать трансляцию кода на проц, т.к. и в динге и в PSX процессоры в принципе совместимы.
3. GTE - ну, это тоже уже оптимизировано до максимума, и сильно большой прибавки производительности здесь не добиться.
4. GPU - вот тут как раз из-за эмуляции этого элемента идут все тормоза.
Вся проблема в том, что вся отрисовка делается бедным процессором. А если разобраться в том, как устроен и работает GPU, станет ужасно жалко бедную дингу.
Итак, GPU имеет 1 мегабайта видеопамяти. Видеопамять разделена на страницы. Самое веселье в том, что текстуры хранящиеся в видеопамяти могут быть в 24-битном виде, 16-битном виде, 8-ми и 4-х битном виде, при чем в 8-ми и 4-х битном режиме требуется наличие палитры, там же в видеопамяти. Т.е. для отрисовки таких текстур с палитрой, надо делать множество обращений к памяти, и так каждый кадр. Это отнимает драгоценное процессорное время. Также, для того чтобы отрисовать это всё на экран, необходимо ещё сконвертировать эран для вывода в нужный формат (тоже время).
Поэтому есть теория, как улучшить производительность - использовать кеширование текстур. Т.к. во многих играх, типа final fantasy, на локациях используется один набор текстур, то при первом обращении к нужной странице памяти с указанной палитрой - создавать эту страницу в памяти и копировать туда уже подготовленный кусок в формате экрана, а при следующем обращении к этим данным - подменять и выдавать уже готовое. При изменении данных в этой странице памяти производить удаление таких кэшированных страниц. В теории это должно дать существенный прирост производительности, но на практике, естественно, много подводных камней и сложностей.
Возможно и возьмусь за оптимизацию в будущем, но испытываю гигантский дефицит времени.
Буду надеяться что найдется талантливый программер, который сможет допилить дополнительную возможность к GPU-плагину PSX4ALL.