2017-02-02 11 views
1

Я работаю над алгоритмом сжатия текстурных координат 3D-сетки. Я забочусь о хорошей степени сжатия и максимальной декомпрессии скорости.Эффективность депрессии сжимания

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

Теперь я хочу выполнить какое-то энтропийное кодирование этих интегральных значений. Я думал, что если я подаю этот вектор целых чисел в какое-то общее сжатие кодировщика (я попробовал ZStd), он позаботится об эффективном кодировании. Однако это , похоже, не имеет места :) Является ли эта идея подачи вектора целых чисел, представляющих квантованные дельта, в общее сжатие даже действительными? Или это нет работа так как? Что вы предлагаете эффективно сжимать такую ​​последовательность?

Спасибо за любые советы!

+0

В какой форме вы кодируете дельта? –

+1

Я пробовал два подхода. В первом подходе я просто передал std :: vector в компрессор ZStd. Во втором подходе я кодировал остаточные целые значения в битовый поток, используя «переменную внутреннюю кодировку» и передавал результирующий поток битов в компрессор. В некоторых случаях первый метод получил лучшее сжатие, но в некоторых случаях выиграл второй метод. – born49

ответ

1

Вы делаете то, что я буду делать. Кодирование дельт в последовательность байтов с использованием целочисленного кодирования переменной длины. Надеемся, ваши данные достаточно гладки, и ваш предиктор достаточно хорош, чтобы подавляющее большинство ваших дельт вписывалось в один байт. Затем я бы подал это стандартным компрессорам, например zstd или lz4, чтобы получить быструю декомпрессию.

Что вы подразумеваете под «Однако, похоже, это не так»? Вы вообще не получаете сжатия от дельта-кодированного представления?

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

+1

Спасибо, Марк! «Тем не менее, это, похоже, не так». Я имел в виду, что ZStd-компрессор уменьшил размер данных до примерно 75% от размера входных данных, и я надеялся на лучший результат. По правде говоря, эта переменная int encoding уже уменьшила размер исходных данных, так что, может быть, я просто не был достаточно реалистичен с ожиданиями :) – born49

+0

Вы можете попробовать сжатие только для Хаффмана zlib, так как я не думаю, что ожидали бы шаблонов в дельтах. Это может дать немного лучшее сжатие, поскольку бит может быть потрачен впустую, пытаясь получить выигрыш от случайных совпадений строк. –

+0

Или режимы zlib filter или run-length-encoded, которые были бы полезны, если ваш предиктор настолько хорош, что у вас длинные очереди нулей. –

1

Вы можете попробовать транспонирование перед вызовом zstd или другого компрессора. См. Например TurboTranspose