Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Resource Packer

Iniciado por Pogacha, 10 de Junio de 2005, 01:23:05 PM

« anterior - próximo »

Pogacha

 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.

Astat

 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

Pogacha

 Gracias ... o sea que uso compress y uncompress a pelo ...

Sobre el tema de los bufferes?

ethernet

 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.







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.