Просмотр полной версии : вывод буковочек шириной точечек
Известно, что их RRA: RRA: RRA: RLCA, сдвигать нужно. И маску
ещё. Потом XOR: AND: XOR. Всё это отнимает кучу тактов.
Некоторые умники сдвигают весь шрифт целиком. 2048*4=8КБайт,
а то и все 16. Жуть.
Имеется решение в 512 байт: таблица, где для каждого возможного
байта из шрифта будет храниться два байта сдвинутых на нужное расстояние. 4 инструкции в примерно 22 такта заменяют несколько
операций сдвига. Экономия. Но, наверное, небольшая.
ничего не понял :confused:
что за "вывод символов шириной точек" ???
это как ?
типа "а" - точки одной ширины "б" - другой а "в" - третьей ?
типа "а" - точки одной ширины "б" - другой а "в" - третьей ?
судя по всему, да %) пропорциональный шрифт типа.
я, например, делал по-другому. в 7 регистров считываем данные, потом 7 процедур, скроллирующих сколько надо и насколько надо. примерно так же быстро, как и табличный метод, памяти кушает примерно столько же. проверял на опыте.
А классика жанра просто немного ускоряется и все Т.е. проверяем смещение, которое в А если оно >4 то дергаем такую же печать, но с прокруткой влево. Т.е. если смещение 6-7 то это +1 знакоместо и 2-1 ротации.
угу. плюс если вывод идет строго по границе байта, выводить можно один байт, а не два (хвост). плюс оптимизация вывода двухбайтовых сдвиговых составляющих- первый байт по OR, следующий по PUT.
мне алко както "нафукал" про мой баян из процедур и ветвления. попробовал таблицу- еще хуже стало! как по памяти, так и по быстродействию. так что....
PUT это имеется ввиду просто байтик вывел и всё ?
М-да... Так что, выходит только классика ???
captain cobalt
10.01.2006, 18:12
Если у отрезанных букв много элементов повторяется, то почему бы при отрисовке одной буквы её наиболее частый элемент не положить в регистр и писать из регистра?...
Увы, регистров тут фонарь... Это на амиге 16 штук :( Были попытки делать типа кеширование или умную печать и другие страшно умные слова... Т.е. при после ротации байты сохраняются и сохраняется код полосочки. Дальше все печатается и тп. а при следующем цикле проверяем, не повторяется ли эта полосочка. Для того, чтоб не ротировать, а просто взять сохраненное.
Ну дык тоже в итоге медленнее :(
PUT это имеется ввиду просто байтик вывел и всё ?
М-да... Так что, выходит только классика ???
выходит так (с) Винни Пух %)
ну я так делал у себя в QHTV. довольно шустро летает все. особенно если учесть, что сначала печать идет в буфер, а потом выводится на экран. притом что буфер еще предварительно очищается (не полностью правда)
captain cobalt
10.01.2006, 19:41
Буквы -- это в некотором смысле чанки. :)
В чанковых демах изображение сначала рендерится в чанковый буфер, а потом перерисовывается в пиксели на экран.
Наиболее злые c2p способны отрисовать экран менее чем за 2 инта. Может быть некоторые идеи оттуда будут полезны?
Увы, регистров тут фонарь... Это на амиге 16 штук :(
Таки у Z80 16 тоже регистров! А если индексы на половинки разбить то и вообще 18 =)
в буфер.
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 различных положения относительно знакоместа? ;)
в #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 байт. На втором проходе печатаются оставшиеся буковки, уже с маской. Если делать через буфер, то на одном кадре надо заполнять буфер, а на втором перебрасывать его двигаясь позади луча.
А правда, что буквы моноширинного шрифта 6 пикс. могут занимать только 4 различных положения относительно знакоместа? ;)
А правда, что ты не знаешь, о чём конкретно я говорил? Выйдет хостагес от 3умф+майхем - узнаешь.
Что есть изменить порядок вывода? Для вывода страницы сначала текст просматривается и помечаются буковки, которые можно вывести без маски, просто "положить" в память, и для каждой буковки считается смещение.
ага. а сколько будет "стоить" первоначальный просмотр строки с подсчетом позиции текущего символа (я про пропорциональный шрифт говорю), потом вывод (обязательно по OR/XOR) оставшихся со сдвигом?
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot