SAM style, эти цифры не зависят от режима - маленькое окно или фуллскрин?
Вид для печати
SAM style, эти цифры не зависят от режима - маленькое окно или фуллскрин?
Это x2, поэтому вызовов vid_dot в 2 раза больше, чем vid_dot_full. Чем шире результирующая картинка, тем больше будет vid_dot-ов в vid_dot_full-ах. Строки при увеличении больше x1 просто копируются нужное кол-во раз в конце каждой.
- - - Добавлено - - -
@Dexus вот, к примеру, выхлоп callgrind-а на фуллскрине (у меня небольшой монитор, 1440x900). Еле остановил его. 1968 кадров, 12 мульёнов опкодов...
http://samstyle.narod.ru/addons/xpec...128_194158.png
SAM style, понял. Ну вот как раз чтобы не было этого vid_dot на каждый пиксель экрана, и тормоза в фуллскрине не увеличивались — и нужно GPU юзать. Это на самом деле не так сложно. Можешь посмотреть в исходниках openxcom, там sdl+opengl+shaders (шейдеров много всяких, и между прочим ни один эмулятор спека пока не имеет такого количества).
Фух, в тестовом проекте получилось делать текстуру из массива пикселей и натягивать её на окно, даже часть текстуры на часть окна. Без установки режима фильтрации ни в какую не хотела показываться.
Но буфер всё равно надо заполнять не 1:1, а с растяжением в 2 раза по горизонтали для режимов с половинчатыми пикселями
SAM style, Поздравляю с успехами :)
Да, современные версии opengl без фильтров, простейших шейдеров, уже не умеют ничего толком показывать.
А что за половинчатые пиксели? Это для dot crawling эффектов? Или для видеорежимов типа 512x240 с профи?
В любом случае, на 4к мониторах с шейдером картинку можно будет выводить такую, что субпиксели от CRT эмулировать, и относительно недорого с точки зрения производительности.
Можно попробовать заимствовать у retroarch - любители консолей наваяли кучу всяких.
Но самое ИМХО важное, что может дать opengl - это относительно равномерный вывод кадров (то чего не хватает хрессу).
Кстати всякие гигаскриновые сглаживания между 2-3 фреймами можно делать не процесся предыдущие пиксели в vid_dot_full. Можно выводить просто следующий кадр в 2-3й буфферизации, а шейдеру для вывода в текстуру скармливать все эти буферы, и шейдер уже будет усреднять, и выводить сглаженно, полусглаженно, через интерлейс (как некоторые LCD выводят) и даже выделяя бегущие строки (чтобы их не сглаживать). (Это возможные перспективы когда/если вывод через opengl+glsl будут частью проекта).
Надеюсь, эксперименты будут плодотворны и для релиза :)
Да, в том числе для текстовых режимов атм/базеконф/тсконф - там резко увеличивается разрешение по горизонтали. Точки ставятся уже через vid_dot_half
Я уже впиливаю, попутно выправляя костыли. Оказалось, что размер текстуры должен быть кратен 4 пикселям, иначе перекос. Еле присобачил обратно вывод индикаторов и сообщений поверх картинки. Что я пока не понял - в NES в режиме NTSC вдруг и внезапно начинает расти фпс, из-за этого дико тормозя, в предыдущей версии такого не наблюдалось. При этом в развёртке PAL/денди всё работает как надо.
- - - Добавлено - - -
Шейдеры пока вообще не трогал. Натягиваюсову на глобустекстуру на окно, и всё.
Ну фиг его знает... Существование QPainter-а почему-то вызывает какую-то фигню. Причём у ZX не вызывает, у NES в PAL не вызывает, а у NES в NTSC вызывает. И у специалиста вызывает... По внешним признакам случается какая-то рекурсия, которая замедляет обработку событий в Qt, и чем дальше - тем больше замедляет.
Код:void MainWin::paintEvent(QPaintEvent*) {
// printf("paint event\n");
#ifdef USEOPENGL
makeCurrent();
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glEnable(GL_TEXTURE_2D);
//glEnable(GL_MULTISAMPLE);
glViewport(0, 0, width(), height());
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// generate texture image
glBindTexture(GL_TEXTURE_2D, texid);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bytesPerLine / 3, comp->vid->vsze.y, 0, GL_RGB, GL_UNSIGNED_BYTE, comp->debug ? scrimg : bufimg);
// draw texture
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex2f(1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
glTexCoord2f(0.0, 1.0); glVertex2f(0.0, 1.0);
glEnd();
glDisable(GL_TEXTURE_2D);
//glDisable(GL_MULTISAMPLE);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
// existing of active QPainter is starting a strange things
//QPainter pnt(this);
//drawIcons(pnt);
//pnt.end();
#else
QPainter pnt(this);
pnt.drawImage(0,0, QImage(comp->debug ? scrimg : bufimg, width(), height(), QImage::Format_RGB888));
drawIcons(pnt);
pnt.end();
#endif
}
Хмм.. А не легче ли просто разрешение по-горизонтали удвоить, указав пропорцию 1:2, вместо того чтобы придумывать "полупиксели"?..
Ты вероятно используешь компрессированную текстуру? Это там вроде, несмотря на NPOT (non power of two) имеется требование в кратности 4м (ибо все идет блоками 4х4).
Ты не опечатался, растет FPS? Может ограничение кадров нужно просто впихнуть, включить vsync.
А фильтрацию какую используешь? GL_NEAREST или GL_LINEAR? Надеюсь не вторую :)
- - - Добавлено - - -
А текстуру освобождаешь?
Хотя там в любом случае один и тот же texid используется, главное чтобы этот айдишник оставался одним и тем же (ну или пара, чтобы выводить со сглаживания между кадрами).
- - - Добавлено - - -
Кстати GL_QUADS давно как уже depricated, используй такое:
И glClear() каждый фрейм делать не надо. Его вообще можно не делать если ты не собираешься выводить что-то с черными (или какими-то другими) бордюрами вокруг зоны отрисовки.Код:glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex2f(1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0);
glTexCoord2f(0.0, 1.0); glVertex2f(0.0, 1.0);
glEnd();
Вообще рекомендую глянуть вот сюда: https://github.com/OpenXcom/OpenXcom...penGL.cpp#L151