Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Программирование (http://zx-pk.ru/forumdisplay.php?f=14)
-   -   RLE сжатие (покритикуйте) (http://zx-pk.ru/showthread.php?t=7301)

Vladson 11th March 2008 19:42

RLE сжатие (покритикуйте)
 
Собственно сжатие картинки и разжатие
(причём разжатие занимает всего 20 байт)
Code:

        ORG        7E00H
        LD        HL,4000H
        LD        DE,8000H
L4        LD        B,00H
        LD        C,(HL)
L3        INC        HL
        LD        A,H
        CP        5BH
        JR        Z,L5
        INC        B
        LD        A,FFH
        CP        B
        JR        Z,L6
        LD        A,(HL)
        CP        C
        JR        Z,L3
L6        LD        A,B
        LD        (DE),A
        INC        DE
        LD        A,C
        LD        (DE),A
        INC        DE
        JR        L4
L5        LD        A,0
        LD        (DE),A
        RET

Code:

        ORG        7F00H
        LD        HL,8000H
        LD        DE,4000H
L2        LD        A,(HL)
        CP        0
        RET        Z
        LD        B,A
        INC        HL
        LD        A,(HL)
        INC        HL
L1        LD        (DE),A
        INC        DE
        DJNZ        L1
        JR        L2

Собственно критики хочется, мало ли у кого есть советы...

rajdee 11th March 2008 20:14

Для начала, заменить cp 0 на and a

DDp 11th March 2008 20:38

Будет плохо паковаться при большом количестве неповторяющихся байт.
Ввести флажок "последовательность из разных/одинаковых байт".

Пример:
06 - 7й бит=0 - 6 разных байт
01
23
45
67
89
AB
85 - 7й бит=1 - 5 одинаковых байт
CD
83 - 7й бит=1 - 3 одинаковых байта
EF
04 - 7й бит=0 - 4 разных байта
55
AA
33
CC
00 - конец

Vitamin 11th March 2008 20:43

RLE-весьма неэффективная методика. Попробуй хотя бы простейшее словарное сжатие, получишь более существенный эффект.

Vladson 11th March 2008 20:54

Quote:

Originally Posted by rajdee (Post 123965)
Для начала, заменить cp 0 на and a

Огромное спасибо, важное замечание, это я упустил.

Quote:

Originally Posted by DDp (Post 123967)
Будет плохо паковаться

Quote:

Originally Posted by Vitamin (Post 123969)
RLE-весьма неэффективная методика.

Собственно RLE был выбран из простоты. Конечно если сначала прогнать MTF потом RLE а потом ещё и Хаффманом закусить то сожмётся лучше, но смысл сжимать картинку из шести килобайт в один если "extractor" будет занимать ещё десять ?

newart 12th March 2008 01:26

Quote:

Originally Posted by Vladson (Post 123973)
"extractor" будет занимать ещё десять

Распаковщик Laser Compact'a занимает несколько сотен байт.

rajdee 12th March 2008 02:12

Если логика меня не подводит, то компрессор можно переписать так:
Code:

        ld hl,#4000
        ld de,#8000
l4      ld c,1
l1        ld a,h:cp #58:jr z,l2
        ld a,(hl):inc hl
        cp (hl):jr nz,l3
        inc c:jr nz,l1
        dec c
l3        ex de,hl
        ld (hl),c
        inc hl
        ld (hl),a
        inc hl
        ex de,hl
        jr l4
l2        xor a:ld (de),a
        ret

Довольно давно ничего не писал, поэтому не уверен, что будет работать :)

P.S. Такой алгоритм эффективен только для экранов с линейной адресацией, а для спектрумовского нужно учитывать строение экрана.

Vladson 12th March 2008 03:31

Quote:

Originally Posted by rajdee (Post 124004)
Довольно давно ничего не писал, поэтому не уверен, что будет работать

Код работает как часы.

У меня наоборот, пишу часто и мои проги всегда работают, но так как мой код никто почти не видит я не знаю на сколько это правильно с точки зрения как мелочей так и архитектуры в целом. (по этому и прошу критики, как кода так и каких-то подходов)

(На РНР проще, много форумов всегда можно показать код и найти кучу критики и сделать выводы, а на Specy так много не пишут.)

GriV 15th March 2008 09:35

Для начала почитайте http://zx.pk.ru/showthread.php?t=5335
Почему именно RLE? В силу простоты только если? Возьмите Huffman или Lempel-Ziff.
Вообще Lempel-Ziff могут быть очень короткими (как Laser Cpmact) при этом очень эффективными.

Vladson 15th March 2008 13:39

Quote:

Originally Posted by GriV (Post 124471)
В силу простоты только если?

Только, так и есть
Quote:

Originally Posted by GriV (Post 124471)
Huffman

Большой размер кода будет (по сжатию ему равных пожалуй нету)
Quote:

Originally Posted by GriV (Post 124471)
Вообще Lempel-Ziff могут быть очень короткими

Посмотрю.


All times are GMT +4. The time now is 21:50.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.