PDA

Просмотр полной версии : вывод буковочек шириной точечек



fk0
10.01.2006, 11:48
Известно, что их RRA: RRA: RRA: RLCA, сдвигать нужно. И маску
ещё. Потом XOR: AND: XOR. Всё это отнимает кучу тактов.
Некоторые умники сдвигают весь шрифт целиком. 2048*4=8КБайт,
а то и все 16. Жуть.

Имеется решение в 512 байт: таблица, где для каждого возможного
байта из шрифта будет храниться два байта сдвинутых на нужное расстояние. 4 инструкции в примерно 22 такта заменяют несколько
операций сдвига. Экономия. Но, наверное, небольшая.

Sinus
10.01.2006, 12:14
ничего не понял :confused:
что за "вывод символов шириной точек" ???
это как ?

типа "а" - точки одной ширины "б" - другой а "в" - третьей ?

Vitamin
10.01.2006, 14:49
типа "а" - точки одной ширины "б" - другой а "в" - третьей ?
судя по всему, да %) пропорциональный шрифт типа.
я, например, делал по-другому. в 7 регистров считываем данные, потом 7 процедур, скроллирующих сколько надо и насколько надо. примерно так же быстро, как и табличный метод, памяти кушает примерно столько же. проверял на опыте.

Vitamin
10.01.2006, 17:48
А классика жанра просто немного ускоряется и все Т.е. проверяем смещение, которое в А если оно >4 то дергаем такую же печать, но с прокруткой влево. Т.е. если смещение 6-7 то это +1 знакоместо и 2-1 ротации.
угу. плюс если вывод идет строго по границе байта, выводить можно один байт, а не два (хвост). плюс оптимизация вывода двухбайтовых сдвиговых составляющих- первый байт по OR, следующий по PUT.
мне алко както "нафукал" про мой баян из процедур и ветвления. попробовал таблицу- еще хуже стало! как по памяти, так и по быстродействию. так что....

Знахарь
10.01.2006, 18:04
PUT это имеется ввиду просто байтик вывел и всё ?

М-да... Так что, выходит только классика ???

captain cobalt
10.01.2006, 18:12
Если у отрезанных букв много элементов повторяется, то почему бы при отрисовке одной буквы её наиболее частый элемент не положить в регистр и писать из регистра?...

Знахарь
10.01.2006, 18:35
Увы, регистров тут фонарь... Это на амиге 16 штук :( Были попытки делать типа кеширование или умную печать и другие страшно умные слова... Т.е. при после ротации байты сохраняются и сохраняется код полосочки. Дальше все печатается и тп. а при следующем цикле проверяем, не повторяется ли эта полосочка. Для того, чтоб не ротировать, а просто взять сохраненное.

Ну дык тоже в итоге медленнее :(

Vitamin
10.01.2006, 18:39
PUT это имеется ввиду просто байтик вывел и всё ?

М-да... Так что, выходит только классика ???
выходит так (с) Винни Пух %)

ну я так делал у себя в QHTV. довольно шустро летает все. особенно если учесть, что сначала печать идет в буфер, а потом выводится на экран. притом что буфер еще предварительно очищается (не полностью правда)

captain cobalt
10.01.2006, 19:41
Буквы -- это в некотором смысле чанки. :)

В чанковых демах изображение сначала рендерится в чанковый буфер, а потом перерисовывается в пиксели на экран.

Наиболее злые c2p способны отрисовать экран менее чем за 2 инта. Может быть некоторые идеи оттуда будут полезны?

lvd
10.01.2006, 19:54
Увы, регистров тут фонарь... Это на амиге 16 штук :(

Таки у Z80 16 тоже регистров! А если индексы на половинки разбить то и вообще 18 =)

lvd
10.01.2006, 20:06
в буфер.
8 копий фонта, полученных командой RRCA.
8 процедур вывода буковки. Из них 3 выводят в 1 байт, остальные в 2 байта (фонт 6 точек шириной). Маски намертво в процедурах.

Вместо 8 копий фонта можно завести например 1 или 2 таблички. По 'одной' сдвигать на 4 точки, остальное командами, а по 'двум' - на 4 и на 2, остальное 1 раз командой (вшить в процедуры тоже). 1 или 2 таблички - как быстрее выходит.

captain cobalt
10.01.2006, 21:44
8 процедур вывода буковки. Из них 3 выводят в 1 байт, остальные в 2 байта (фонт 6 точек шириной). А правда, что буквы моноширинного шрифта 6 пикс. могут занимать только 4 различных положения относительно знакоместа? ;)

jtn
10.01.2006, 21:47
в #z80-06 76кб текста, музыка, гора таблиц, фонт 4x7 и
пропорциональный Xx7 развернутый 8 раз.
декранчится код на горизонтальную строку - вызывается 8 раз.
вывод экрана push'ми (в push'евом буфере +2 строки - след. верхняя и нижняя, сначала строится весь новый экран потом декранчится в буфер новая строка - чтобы луч не резало).
ускорение фиг знает сильное ли получилось но в турбомоде весь экран без верхних трех знакомест успевает (24 текст строки), без турбо - строк 9 (с вкл. музыкой вроде) - строки 7 пикс выстотой

Vladimir Kladov
10.01.2006, 22:31
если выводить символ за символом, то это будет очень медленно. Но почему-то все идут именно этим путем. Традиционное мышление.
Что есть изменить порядок вывода? Для вывода страницы сначала текст просматривается и помечаются буковки, которые можно вывести без маски, просто "положить" в память, и для каждой буковки считается смещение. Смещение кстати может быть и переменным, если шрифт не моноширинный, например для широких буковок 5, а для поуже 4, а i та вообще 2 занимать может. Таблица сдвигов для максимальной ширины 5 (т.е. 6 с зазором) займет 32х8 = 256 байт. Ее надо разместить по границе блока 256 байт. На втором проходе печатаются оставшиеся буковки, уже с маской. Если делать через буфер, то на одном кадре надо заполнять буфер, а на втором перебрасывать его двигаясь позади луча.

lvd
10.01.2006, 22:38
А правда, что буквы моноширинного шрифта 6 пикс. могут занимать только 4 различных положения относительно знакоместа? ;)

А правда, что ты не знаешь, о чём конкретно я говорил? Выйдет хостагес от 3умф+майхем - узнаешь.

Vitamin
10.01.2006, 23:26
Что есть изменить порядок вывода? Для вывода страницы сначала текст просматривается и помечаются буковки, которые можно вывести без маски, просто "положить" в память, и для каждой буковки считается смещение.
ага. а сколько будет "стоить" первоначальный просмотр строки с подсчетом позиции текущего символа (я про пропорциональный шрифт говорю), потом вывод (обязательно по OR/XOR) оставшихся со сдвигом?