SAM style, эти цифры не зависят от режима - маленькое окно или фуллскрин?
SAM style, эти цифры не зависят от режима - маленькое окно или фуллскрин?
Это x2, поэтому вызовов vid_dot в 2 раза больше, чем vid_dot_full. Чем шире результирующая картинка, тем больше будет vid_dot-ов в vid_dot_full-ах. Строки при увеличении больше x1 просто копируются нужное кол-во раз в конце каждой.
- - - Добавлено - - -
@Dexus вот, к примеру, выхлоп callgrind-а на фуллскрине (у меня небольшой монитор, 1440x900). Еле остановил его. 1968 кадров, 12 мульёнов опкодов...
![]()
Все любят гипножабу
SAM style, понял. Ну вот как раз чтобы не было этого vid_dot на каждый пиксель экрана, и тормоза в фуллскрине не увеличивались — и нужно GPU юзать. Это на самом деле не так сложно. Можешь посмотреть в исходниках openxcom, там sdl+opengl+shaders (шейдеров много всяких, и между прочим ни один эмулятор спека пока не имеет такого количества).
Фух, в тестовом проекте получилось делать текстуру из массива пикселей и натягивать её на окно, даже часть текстуры на часть окна. Без установки режима фильтрации ни в какую не хотела показываться.
Но буфер всё равно надо заполнять не 1:1, а с растяжением в 2 раза по горизонтали для режимов с половинчатыми пикселями
Все любят гипножабу
zebest(06.02.2021)
SAM style, Поздравляю с успехами
Да, современные версии opengl без фильтров, простейших шейдеров, уже не умеют ничего толком показывать.
А что за половинчатые пиксели? Это для dot crawling эффектов? Или для видеорежимов типа 512x240 с профи?
В любом случае, на 4к мониторах с шейдером картинку можно будет выводить такую, что субпиксели от CRT эмулировать, и относительно недорого с точки зрения производительности.
Можно попробовать заимствовать у retroarch - любители консолей наваяли кучу всяких.
Но самое ИМХО важное, что может дать opengl - это относительно равномерный вывод кадров (то чего не хватает хрессу).
Кстати всякие гигаскриновые сглаживания между 2-3 фреймами можно делать не процесся предыдущие пиксели в vid_dot_full. Можно выводить просто следующий кадр в 2-3й буфферизации, а шейдеру для вывода в текстуру скармливать все эти буферы, и шейдер уже будет усреднять, и выводить сглаженно, полусглаженно, через интерлейс (как некоторые LCD выводят) и даже выделяя бегущие строки (чтобы их не сглаживать). (Это возможные перспективы когда/если вывод через opengl+glsl будут частью проекта).
Надеюсь, эксперименты будут плодотворны и для релиза![]()
Последний раз редактировалось Dexus; 31.01.2021 в 05:15.
Да, в том числе для текстовых режимов атм/базеконф/тсконф - там резко увеличивается разрешение по горизонтали. Точки ставятся уже через vid_dot_half
Я уже впиливаю, попутно выправляя костыли. Оказалось, что размер текстуры должен быть кратен 4 пикселям, иначе перекос. Еле присобачил обратно вывод индикаторов и сообщений поверх картинки. Что я пока не понял - в NES в режиме NTSC вдруг и внезапно начинает расти фпс, из-за этого дико тормозя, в предыдущей версии такого не наблюдалось. При этом в развёртке PAL/денди всё работает как надо.
- - - Добавлено - - -
Шейдеры пока вообще не трогал. Натягиваюсову на глобустекстуру на окно, и всё.
Последний раз редактировалось SAM style; 31.01.2021 в 09:17.
Все любят гипножабу
Ну фиг его знает... Существование 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
Последний раз редактировалось Dexus; 31.01.2021 в 19:28.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)