Да
На основе рисования 65536 случайных линий
1. Во всю ширину экрана (dx=255), x0=0, y0=0, x1=255, y1=случайный от 0 до 255: 91 линия/секунду
2. Во всю высоту экрана (dy=255), x0=0, y0=0, y1=255, x1=случайный от 0 до 255: 100 линий/секунду
Нетрудно заметить, что "крутой" цикл работает несколько быстрее "пологого".
Парни, а DOOM то будет, ну или хотя бы driller в линиях? А то предыдущие эксперименты с 3-мерным лабиринтом так и не закончились игрой, а мы же ждем.
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
Error404, с ходу я могу сделать вращающийся проволочный 3D-кубик, причем максимально тупо, без убирания невидимых ребер. Учитывая, что для вектора уже есть пара (и даже больше) примеров нормальной (с убиранием невидимых ребер) векторной 3D графики, нет желания делать то, что уже есть, только хуже. Или надо почитать, поразбираться, чтобы сделать нормально. Пока такого желания тоже нет.
Насчет doomов и wolfов - счастливым обладателям z80 стоит обратить вниманием на результаты alone codera для спека. wolf48 реально портануть на орион с z80, было бы желание.
Последний раз редактировалось ivagor; 21.12.2017 в 07:49. Причина: исправил грани на ребра
Я кстати не видел для Вектора синглфреймовых, ну или хотя бы даблфреймовых, вращающихся кубиков.
Больше игр нет
Пока оставлю это здесь, всякие dx-dy здесь считаются байтами, но на картинку это вроде не влияет.
Написано в EmuZWin, поэтому про быстродействие на векторе ничего сказать не могу.
Вроде как должно быть шустрее, но есть еще большой резерв для оптимизации.
Код:defs 7&-$ PixMask defb 128,64,32,16,8,4,2,1 SetPix macro xor a,(hl) ld (hl),a endm LineTo:;(hl - x1y1) ld de,$0000 ld (LineTo+1),hl Line:;(hl - x1y1, de - x2y2) ld a,d sub a,h jp nc,LineGm neg ex de,hl ;swap p1,p2 LineGm: ld d,a ;dx ld bc,PixMask ld a,$7 and h add c ld c,a ld a,h srl a srl a srl a add a,$80 ld h,a ld a,(bc) ld b,a LineDy: ld a,e sub a,l jp nc,LineXi neg LineXd: ld e,a ;dy sub a,d jp nc,LineYd neg ld (LineXdd+1),a ;dx-dy ld a,$2D;dec l ld (LineXmm),a jp LineXi1 LineYd: ld (LineYdd+1),a ;dy-dx ld a,$2D;dec l ld (LineYy),a ld (LineYyy),a jp LineYi1 LineXi: ld e,a sub a,d jp nc,LineYi neg ld (LineXdd+1),a ;dx-dy ld a,$2C;inc l ld (LineXmm),a LineXi1:ld c,d ;cnt inc c ld a,d srl a ld d,a ld a,b LineXp:SetPix dec c ret z ld a,d sub a,e ld d,a jp nc,LineXpp LineXmm:dec l ld a,b rrc a ld b,a jp nc,LineXm inc h LineXm:SetPix dec c ret z ld a,d LineXdd:add a,$0 ld d,a jp nc,LineXmm LineXpp:ld a,b rrc a ld b,a jp nc,LineXp inc h jp LineXp LineYi: ld (LineYdd+1),a ;dy-dx ld a,$2C;inc l ld (LineYy),a ld (LineYyy),a LineYi1:ld c,e ;cnt inc c ld a,e srl a ld e,a ld a,b LineYp:SetPix dec c ret z LineYy: inc l ;++y ld a,e sub a,d ld e,a ld a,b jp nc,LineYp rrc a ld b,a jp nc,LineYm inc h ;++x LineYm: SetPix dec c ret z LineYyy:inc l ;++y ld a,e LineYdd:add a,$0 ld e,a ld a,b jp c,LineYp rrc a ld b,a jp nc,LineYm inc h jp LineYm
Сначала я покритиковал, а потом все же проверил.
blackmirror, респект, это просто супер - 313 линий/секунду и еще видны возможности для ускорения.
- - - Добавлено - - -
Убрал про несимметричность - см. ниже.
Последний раз редактировалось ivagor; 21.12.2017 в 12:51. Причина: после проверки заменил критику на восхваление
Просто для истории. Мой вариант 1BPP линии от 2015 года. С тех пор ничего не трогал, просто рекомпильнул. Там в среднем 205 линий в секунду, если заполнять экран радиально от центра без смены цвета и 195 линий в секунду, если менять цвет каждой выводимой линии. Может просто будет интересен алгоритм. Сырки и демка прилагаются. Демку запускать из МикроДОСа. Когда отрисовка остановится, нажать [АР2] для 2й части.
blackmirror, отбой тревоги - при переводе z80->8080 я допустил механическую ошибку. После ее исправления рисует замечательно - симметрично и правильно.
Еще раз респект, снимаю шляпу.
Последний раз редактировалось ivagor; 21.12.2017 в 12:51. Причина: обнаружил у себя ошибку при переводе z80->8080
Немного безумия: данный код не является полноценным кодом рисования линии, а только проверкой, что может дать один из вариантов разворота цикла. Цикл развёрнут на 8 точек, чтобы не вычислять маски, кроме того делается поочерёдно по 4 приращения ошибки, потом рисуются 4 точки, чтобы не перезагружать лишний раз аккумулятор. Для практического применения данный код пока мало пригоден: занимает 512 байт, не вычисляет нужные ему числа из координат, не обрабатывает хвосты, рисует по 8 точек и только в сторону увеличения Y, но позволяет оценить какие у нас есть резервы в плане рисования линий. В EmuZWin данный код рисует 256 линий из точки 0,0 до правого края экрана за 32 кадра, предыдущий код рисует 256 линий от левого края до правого за 72 кадра, сверху вниз за 64 кадра. То есть потенциально, если кому-то не жалко пары килобайт для рисования линии, раза в полтора линию точно сможет ускорить.
Код:Test3:;(x1=0, y1=0, x2=255, y2=0..255) ld de,$FF00 ;dx-dy=255 dy=0 Test3_0: ld hl,$8000 ;x1=0, y1=0 ld bc,$7F20 ;err=dx/2=127 cnt=256/8=32 push de ld a,b call LineX01 pop de dec d ;--(dx-dy) inc e ;++dy jp nz,Test3_0 ret SubPos macro lab sub a,e ;err-=dy jp c, lab endm SubNeg macro lab sub a,e ;err-=dy jp nc, lab endm AddNeg macro lab add a,d ;err+=dx-dy jp c, lab endm AddPos macro lab add a,d ;err+=dx-dy jp nc, lab endm Ymove macro inc l endm SetPix1 macro m1 ld a,m1 xor a,(hl) ld (hl),a endm SetPix2 macro m1,m2 SetPix1 m1 Ymove SetPix1 m2 endm SetPix3 macro m1,m2,m3 SetPix2 m1,m2 Ymove SetPix1 m3 endm SetPix4 macro m1,m2,m3,m4 SetPix2 m1,m2 Ymove SetPix2 m3,m4 endm DecRetZ macro inc h ;inc x dec c ;dec cnt ret z endm ;+0+1-4+2-3-5-7-6+ ;+1-4+2-3-5-7-6+0+ LineX00:SubPos LineX71 LineX01:SubPos LineX72 LineX02:SubPos LineX33 LineX03:SubPos LineX14 LineX04:ld b,a SetPix1 $F0 ld a,b LineX15:SubPos LineX76 LineX16:SubPos LineX77 LineX17:SubPos LineX38 LineX18:SubNeg LineX09 LineX19:ld b,a SetPix2 $0E,$01 ld a,b DecRetZ LineX40:AddNeg LineX01 LineX41:Ymove AddNeg LineX02 LineX42:AddPos LineX73 LineX43:SubPos LineX54 LineX44:ld b,a SetPix2 $80,$70 ld a,b LineX25:SubPos LineX76 LineX26:SubPos LineX77 LineX27:SubNeg LineX08 LineX28:AddPos LineX39 LineX29:ld b,a SetPix2 $0C,$03 ld a,b DecRetZ LineX30:SubPos LineX71 LineX31:SubPos LineX72 LineX32:SubNeg LineX03 LineX33:AddNeg LineX24 LineX34:ld b,a SetPix3 $C0,$20,$10 ld a,b LineX55:AddNeg LineX06 LineX56:Ymove AddNeg LineX07 LineX57:AddPos LineX78 LineX58:SubNeg LineX49 LineX59:ld b,a SetPix3 $08,$06,$01 ld a,b DecRetZ LineX70:AddNeg LineX01 LineX71:Ymove AddNeg LineX02 LineX72:AddNeg LineX43 LineX73:AddNeg LineX64 LineX74:ld b,a SetPix4 $80,$40,$20,$10 ld a,b LineX65:AddNeg LineX06 LineX66:Ymove AddNeg LineX07 LineX67:AddNeg LineX48 LineX68:AddPos LineX79 LineX69:ld b,a SetPix3 $08,$04,$03 ld a,b DecRetZ LineX10:SubPos LineX71 LineX11:SubPos LineX72 LineX12:SubPos LineX33 LineX13:SubNeg LineX04 LineX14:ld b,a SetPix2 $E0,$10 ld a,b LineX45:AddNeg LineX06 LineX46:Ymove AddNeg LineX07 LineX47:AddPos LineX78 LineX48:SubPos LineX59 LineX49:ld b,a SetPix2 $08,$07 ld a,b DecRetZ LineX20:SubPos LineX71 LineX21:SubPos LineX72 LineX22:SubNeg LineX03 LineX23:AddPos LineX34 LineX24:ld b,a SetPix2 $C0,$30 ld a,b LineX35:SubPos LineX76 LineX36:SubPos LineX77 LineX37:SubNeg LineX08 LineX38:AddNeg LineX29 LineX39:ld b,a SetPix3 $0C,$02,$01 ld a,b DecRetZ LineX50:AddNeg LineX01 LineX51:Ymove AddNeg LineX02 LineX52:AddPos LineX73 LineX53:SubNeg LineX44 LineX54:ld b,a SetPix3 $80,$60,$10 ld a,b LineX75:AddNeg LineX06 LineX76:Ymove AddNeg LineX07 LineX77:AddNeg LineX48 LineX78:AddNeg LineX69 LineX79:ld b,a SetPix4 $08,$04,$02,$01 ld a,b DecRetZ LineX60:AddNeg LineX01 LineX61:Ymove AddNeg LineX02 LineX62:AddNeg LineX43 LineX63:AddPos LineX74 LineX64:ld b,a SetPix3 $80,$40,$30 ld a,b LineX05:SubPos LineX76 LineX06:SubPos LineX77 LineX07:SubPos LineX38 LineX08:SubPos LineX19 LineX09:ld b,a SetPix1 $0F ld a,b inc h dec c jp nz,LineX00 ret
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)