Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Pogacha en 10 de Junio de 2005, 01:23:05 PM

Título: Resource Packer
Publicado por: Pogacha en 10 de Junio de 2005, 01:23:05 PM
 Estaba haciendome un resource packer para mi motor 2d y me surgieron algunas dudas.

Ya tengo el del Lemmon Team pero no es del todo compatible con lo que tengo ... así que me tiré a hacer el mio.

Antes leia archivos zip pero no estoy seguro de tener licencia para esto y usaba un codigo que me generaba desconfianza (en cuanto a licencia y compatibilidad) ... No importa pues es menos compatible que con lo que tenia.

Las preguntas:

1 - Como funciona el zlib, usando solo compress2 y uncompress puedo trabajar en memoria sin problemas? o hay que configurar algo?

2 - Cual es la ganancia en velocidad ? No seria mejor usar bufferes para dualidad ? Como se hace esto ?

Saludos.
Título: Resource Packer
Publicado por: Astat en 10 de Junio de 2005, 02:15:15 PM
 Te pasteo un trozo de codigo mio en el que utilizo esas funciones:


int cBufferEx::Pack(float &fRatio)
{
 m_nUnpackSize = m_nSize;
 unsigned long nNewSize = ((float)m_nSize) * 1.3f;//1.2 + 12;
 unsigned char *pNewBuff = NULL;
 int res;

 if ((pNewBuff = (unsigned char*)malloc(nNewSize)) == NULL)
   return BUFFEREX_NOK_NOMEM;

 res = compress(pNewBuff, &nNewSize, m_pBuff, m_nSize);

 if ((res != Z_OK) || (nNewSize >= m_nSize))
 {
   fRatio = 0.0f;
   free(pNewBuff);
   return BUFFEREX_NOK_COMPRESS;
 }

 m_nSize = nNewSize;
 m_nOffset = 0;

 m_pBuff = (unsigned char*)realloc(m_pBuff, m_nSize);
 memcpy(m_pBuff, pNewBuff, m_nSize);
 free(pNewBuff);

 fRatio = 100.0f - (m_nSize * 100.0f) / (float)m_nUnpackSize;

 return BUFFEREX_OK;
}


int cBufferEx::Unpack()
{
 unsigned char *pNewBuff = NULL;
 int res;

 if (!m_nUnpackSize)
   return BUFFEREX_NOK_UNCOMPRESS;

 if ((pNewBuff = (unsigned char*)malloc(m_nUnpackSize + ((float)m_nUnpackSize * 1.2f))) == NULL)
   return BUFFEREX_NOK_NOMEM;

 res = uncompress(pNewBuff, &m_nUnpackSize, (const Bytef*)m_pBuff, m_nSize);

 if (res != Z_OK)
 {
   free(pNewBuff);
   return BUFFEREX_NOK_COMPRESS;
 }

 m_nSize = m_nUnpackSize;
 m_nUnpackSize = 0;
 m_nOffset = 0;

 m_pBuff = (unsigned char*)realloc(m_pBuff, m_nSize);
 memcpy(m_pBuff, pNewBuff, m_nSize);
 free(pNewBuff);

 return BUFFEREX_OK;
}


Espero que te sea util
Título: Resource Packer
Publicado por: Pogacha en 10 de Junio de 2005, 04:27:53 PM
 Gracias ... o sea que uso compress y uncompress a pelo ...

Sobre el tema de los bufferes?
Título: Resource Packer
Publicado por: ethernet en 10 de Junio de 2005, 06:05:25 PM
 No entiendo el por qué de reservar 1.2 veces más del tamaño que ocupaba sin comprimir, lo entiendo en la compresión, pero en la descompresión se supone que sabe de antemano el tamaño.