PDA

Просмотр полной версии : Мало памяти



Totem
16.01.2008, 18:04
Вопрос такой.Много графики-анимации в нижнюю не лезет, поэтому решил сделать буфер в который по неообходимости подгружается с других страниц.
Но закавыка в том, что использовать решил 2 экрана
постоянно придется дергать туда обратно, оправдано ли на 7мгц? еще и маски вреале генерить?помогите плиз советом.

Sinus
16.01.2008, 18:20
нет, не оправдано. это будет тормознее в разы, чем просто всё выводить в один экран.

или можно поступить как делал медноногов - валить всё в буфер (кстати там можно ввесли линейную адресацию), а потом перекидывать на экран. но это тоже довольно медленно.

надо более конкретно рассматривати ситуацию.

Totem
16.01.2008, 18:29
зобыл добавить что turn base не реалтайм
однако получается двойное копирование
причем не мало 192бх3=576 и еще это на экран кинуть

Shadow Maker
20.01.2008, 19:13
Ты заманаешься с этим вторым экраном, точно тебе говорю. Буфер - самый нормальный выход в этой ситуации, как уже было сказано. Сделай весь вывод графики в буфер, потом просто кидай на экран побырому и не заморачивайся... Конечно если места на буфер нет, то это уже другой вопрос, но я так понял места у тебя есть куча, плюс опять же можно седьмую страницу использовать полноценно.

Sinus
21.01.2008, 02:13
кстати в случае с буфером лучше тогда использовать не 7ю банку для данных, а наоборот, выводить в 7й экран, а 5ю банку пустить под код.
правда придётся писать в кросс-ассемлере, потому что в нативном спековском заманатся можно ребутаться каждый раз.

Shadow Maker
22.01.2008, 00:47
Sinus, а чем особо лучше-то? :) По моему неудобно, придется каждый раз странички щелкать, пятая банка ж доступна из любой включенной страницы, а седьмая - нет. А выгоды от этого не вижу чот...

CityAceE
22.01.2008, 07:29
Так под непрерывный код места больше получается с #4000 до #BFFFF.

GriV
22.01.2008, 09:10
Из буфера без разницы куда кидать. Зато наличие "свободных" #4000-#BFFF позволит там же разместить и буфер и быструю процедуру заполнения 7го окна. Однозначно так и надо.

psndcj
22.01.2008, 21:01
быструю - тока на пентагонах - на буржуйских машинах код тормозить сильно будет - да и на скорпионах вроде...

GriV
23.01.2008, 13:05
Если 7ое окно активно то тормозить не должно, потому что нет выборки с 5й страницы памяти, где код сам лежит.

Sinus
25.01.2008, 16:26
пофигу какое окно активно, выборка идёт всё равно из медленной памяти.
с другой стороны ЧВ на байте работает довольно шустро, так что не думаю что стоит заострять на медленной памяти сильно много внимания.

psndcj
25.01.2008, 22:43
ну просто Machined фиксил под эмулятором под медленный комп - разница с пентагоном неземная =( вроде на 90% попал, но все равно на пенте смотреть приятнее намного...

Sinus
28.01.2008, 01:08
вспоминая чему меня учили мэтры когда я ещё был маленьким - никогда не ставить ренистр I в медленную память, ибо тормоз на процентов 20 обеспечен ;)


кстати Machined - классная демка.

moroz1999
05.02.2008, 11:10
я был бы очень благодарен тому, кто сможет ответить на следующие вопросы:

1. насколько долго вообще переключаются банки памяти?
2. как быстро можно перебросить буфер на экран при включенных прерываниях? по моему опыту - примерно за 100 000 тактов, но программист из меня не лучший.

за 100 000 тактов можно совершить примерно 3000 раз down hl, чего, по моим представлениям, обычно хватает для полного отстраивания тайлового фона и 4-5 спрайтов.
поправьте меня, если ошибаюсь.

Sinus
05.02.2008, 13:48
> 1. насколько долго вообще переключаются банки памяти?

в зависимости от комманд которые используешь. это ж не PC чтоб что-то тормозило отличное от проца :)

например так

ld a,#17
ld bc,#7ffd
out (c),a

можешь сам посчитать сколько тактов

moroz1999
05.02.2008, 15:28
в зависимости от комманд которые используешь. это ж не PC чтоб что-то тормозило отличное от проца :)

спасибо, именно это и надо было знать :) как-то в литературе этот вопрос не освещается, подразумевая, видимо, что программист помимо асма еще и в железе разбирается.

Добавлено через 2 минуты

Из буфера без разницы куда кидать. Зато наличие "свободных" #4000-#BFFF позволит там же разместить и буфер и быструю процедуру заполнения 7го окна. Однозначно так и надо.есть ли какие-нибудь готовые примеры реализации? я просто над этой задачей бьюсь сейчас, и лишние идеи, честно говоря, не повредили бы.

и еще, если запортить область после #5b00, trdos работать будет?

Evgeny Muchkin
05.02.2008, 17:13
и еще, если запортить область после #5b00, trdos работать будет?
С адреса #5c00 начинаются переменные басика.
С #5cb6 переменные трдоса.

Так что смотри сам ;)

GriV
06.02.2008, 19:34
ну начинается ликбез :-) ладно как модеру мне положено это делать :-)

Если есть область данных неизвестной заранее структуры, тогда используются по простому
1) классика
ld hl,откуда
ld de,куда
ld bc,сколько
ldir
в итоге для больших массивов начальные установки можно считать 0 длительности, около 21 такт на байт, это наиболее очевидная и древняя конструкция, использовалась для переброса во всех первых играх

2) классика 2
ld a,количество_строк
ld hl,откуда
ld de,куда
metka:
ldi
ldi
..
ldi ; заданное количество раз
dec a
jr nz,metka
итого около 16 тактов на 1 байт, использовалось в robocop и многих других программах

3) классика 3
ld sp,откуда
pop hl
pop de
pop bc
pop af
exx
pop hl
pop de
pop bc
; сюда же можно записать и pop ix pop iy, однако это не так эффективно
ld sp,куда+количество_регистро ых_пар*2
push bc
push de
push hl
exx
push af
push bc
push de
push hl
; и заново переустанавливать стек
Эта конструкция использовалась в Satisfaction и часто в других демках. Длина - около 12 тактов на байт, за это приходится расплачиваться тем что такие конструкции не сделаешь в цикле, итого огромный размер перебросчика буфера (около 1,5 байта на 1 байт перебрасываемой области, для одного экрана около 10 кбайт).

Итого 12 тактов * 6912 байт = около 80 тыщ тактов.

Если экран обрезан по краям (например есть рамка, которую нет смысла каждый раз выводить), тогда можно уложиться и в прерывание (опять тот же Satisfaction, где карта Киева), можно даже посчитать - вместо 32*24*8 надо прорисовать 30*20*8 байт, это 4080 байт, около 60 тыщ тактов на прорисовку, даже есть время прорисовать атрибуты и сделать бегущую строчку и проиграть фоновую музыку.

Быстрее можно только если экранная область будет кривая, то есть например расположена внутри кода её выводящего -классическая для мультиколора процедура
ld hl,nn
push hl
ld hl,mm
push hl
и т.д.
nn и mm - те самые данные.
В этом случае около 11 тактов на 1 байт (меньше невозможно).

cyrax inc
07.02.2008, 08:48
ну начинается ликбез

обо всем этом, единственное, что применительно к мультиколору, хорошо (с примерами, подсчетом количества тактов) написано в ZX-Review 4-5'96

Satisfaction, где карта Киева
в Satisfaction, очевидно, нарисована карта Харькова :biggrin: