Я ещё не щупал, что за зверь, но есть шанс, что Pythran поможет?
Я ещё не щупал, что за зверь, но есть шанс, что Pythran поможет?
Поработал немного над PyZX. За основу взял исходники Q-Master'а c GitHub.
1. Изменил заголовок окна. Теперь там отображается название эмулятора и FPS (можно отключить, изменив значение переменной).
2. Добавил иконку. Странно, но она отображается только в заголовке окна, а в панели задач нет. Победить проблему не смог, хотя на моём другом проекте всё отображается, как положено, в обои местах.
3. Добавил бордюр и его эмуляцию. Пришлось вбить костыль, потому что заготовка под обработку портов, которую сделал Q-Master, не работает должным образом. Обратил внимание на то, что где-то в основном коде эмуляции есть ошибка - при подаче команд BORDER 0...7, нижняя строка основного экрана закрашивается в цвет бордюра только в районе текста, а не целиком.
4. Исправил ошибку с яркими цветами чернил - чернильные цвета всегда отображались с выключенной яркостью.
5. Увеличил на несколько кадров FPS, максимально разгрузив от любых вычислений процедуру преобразования ZX-экрана в поверхность. Все данные берутся из заранее просчитанных табличек, а массив пишется в буфер за раз.
6. Сделал масштабирование экрана 1x, 2x и 3x. Переключать масштаб можно на лету клавишами F1-F3. По умолчанию эмулятор запускается с картинкой в двойном размере (можно изменить, откорректировав соответствующую константу).
С уважением, Станислав.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
А пулл-реквестик зафигачить?
PS: заготовка, да, пока не работает как надо, т.к. основная идея сделать поддержку ленты и загрузки с нее. Я сейчас там сильно.
- - - Добавлено - - -
@CityAceE:
Посмотрел код и не понял зачем костыль если можно было поправить xOutFE?
Заберу твой код в мастер на гитхабе, не возражаешь?
- - - Добавлено - - -
Еще раз посмотрел кусок с видео. Что не понял совсем:
1. Странное копирование скринов и при смене режима один из скринов остается старого размера. Чем тебе не угодила ф-ция init и почему при каждом импорте будет дергаться весь цикл заполнения всех таблиц и пересоздание скринов - неясно.
2. Зачем-то выполняется лишнее копирование в fill_screen_map() которого я, как-раз, старался избежать. Я не понял зачем гонять данные туда-сюда, учитывая что bytearray через + заполняется не просто медленно, а адово медленно. Понятнее было-бы однократное создание массива нужной длины и его уже заполнения.
Выложил эту версию сюда по большей части для тебя, чтобы ты посмотрел и, если что-то приглянулось, перетянул бы к себе на GitHub. Твой опыт в Python существенно больше моего, поэтому скорее всего ты сможешь сделать лучше, чем то, как я сделал. Поэтому я и не стал делать pullrequest. А так, конечно, что нужно забирай!
Это первое, куда я сунулся. Прежде всего я поставил туда print(port, value) и начал из Basic менять цвет бордюра. Но, к сожалению, в эту процедуру доходит только 254, 254. Разбираться что к чему я не стал, поэтому закостылил, чтобы ты потом сделал правильно.
Есть три поверхности:
1. Основной экран - он может масштабироваться, его мы и видим в окне.
2. Второй экран, он же бордюр, его размер всегда 384х256.
3. Экран Спектрума, его размер всегда 256х192.
Вывод происходит следующим образом:
1. Экран Спектрума копируется на центр экран бордюра. На выходе получаем картинку Спектрума с бордюром размером 384х256.
2. Накладываем этот бутерброд на основной экран, предварительно растянув его:
screen.blit(pygame.transform.scale(second_screen, current_mode), (0, 0))
Как раз для того, чтобы исключить include video из spectrum.py я и упразднил её. Хотя, возможно, перед этим я в другие файлы проекта этот include добавил по необходимости. В твоём варианте всё равно все таблицы рассчитывались вне процедур и, соответственно, генерировались каждый раз при include. Я думаю, что генерацию таблиц нужно выносить в отдельную процедуру.
Не совсем понимаю о чём ты. В fill_screen_map() сейчас идёт заполнение zx_array, чтобы потом его разом записать в буфер. Так получилось быстрее по сравнению с тем, что было у тебя. Я когда всё это делал, всё время держал под рукой твою версию и сверял скорость с ней, чтобы не дай бог не получилось медленнее, а вообще я, естественно, старался сделать чуть быстрее и в итоге удалось выиграть несколько FPS.
Да, в какой-то момент после разворачивания циклов перестал работать append. В итоге нарисовались две альтернативы: + и extend. Я провёл замеры и оказалось, что "+" чуть-чуть быстрее, чем extend. И это даже быстрее, чем append в цикле или 8 append'ов подряд. Это место меня, конечно, тоже расстроило.
Так?
Замеры показывают, что скорости эти не добавляет. Скорее всего нужно придумывать что-то другое.Код:def fill_screen_map(): zx_videoram = Z80.memory.mem[16384:16384 + 6912] zx_array = bytearray(49152) mem = 0 for line_numb in range(192): pix_addr = addr_pix[line_numb] attr_addr = addr_attr[line_numb] for i in range(32): zx_array[mem:mem + 8] = pixelmap[zx_videoram[attr_addr + i]][zx_videoram[pix_addr + i]] mem += 8 return bytes(zx_array)
---
Выкачал сейчас твой обновлённый вариант и сравнил по скорости со своим. Например, в Basic мой вариант примерно на 1 FPS показывает больше. Примерно та же ситуация и на титульном экране Exolon'а.
---
Проверил кусок кода, который я привёл вышел. И на моём другом проекте скорость поднялась не просто чуть-чуть, а вдвое! Старый вариант c "+" выдавал 72 FPS, а в новом варианте FPS поднялся до 144!
Последний раз редактировалось CityAceE; 19.02.2019 в 04:23.
С уважением, Станислав.
В панели отображается.
Win7, Python 3.6, pygame 1.9.4
https://i.imgur.com/RhUpPtz.png
Последний раз редактировалось Bedazzle; 19.02.2019 в 08:08.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)