Beispiel #1
0
/**
 * Thread-safe abstract compression routine. Compresses memory from uncompressed buffer and writes it to compressed
 * buffer. Updates CompressedSize with size of compressed data. Compression controlled by the passed in flags.
 *
 * @param	Flags						Flags to control what method to use and optionally control memory vs speed
 * @param	CompressedBuffer			Buffer compressed data is going to be written to
 * @param	CompressedSize	[in/out]	Size of CompressedBuffer, at exit will be size of compressed data
 * @param	UncompressedBuffer			Buffer containing uncompressed data
 * @param	UncompressedSize			Size of uncompressed data in bytes
 * @return true if compression succeeds, false if it fails because CompressedBuffer was too small or other reasons
 */
bool FCompression::CompressMemory( ECompressionFlags Flags, void* CompressedBuffer, int32& CompressedSize, const void* UncompressedBuffer, int32 UncompressedSize )
{
	double CompressorStartTime = FPlatformTime::Seconds();

	// make sure a valid compression scheme was provided
	check(Flags & COMPRESS_ZLIB || Flags & COMPRESS_GZIP);

	bool bCompressSucceeded = false;

	Flags = CheckGlobalCompressionFlags(Flags);

	switch(Flags & COMPRESSION_FLAGS_TYPE_MASK)
	{
		case COMPRESS_ZLIB:
			bCompressSucceeded = appCompressMemoryZLIB(CompressedBuffer, CompressedSize, UncompressedBuffer, UncompressedSize);
			break;
		case COMPRESS_GZIP:
			bCompressSucceeded = appCompressMemoryGZIP(CompressedBuffer, CompressedSize, UncompressedBuffer, UncompressedSize);
			break;
		default:
			UE_LOG(LogCompression, Warning, TEXT("appCompressMemory - This compression type not supported"));
			bCompressSucceeded =  false;
	}

	// Keep track of compression time and stats.
	CompressorTime += FPlatformTime::Seconds() - CompressorStartTime;
	if( bCompressSucceeded )
	{
		CompressorSrcBytes += UncompressedSize;
		CompressorDstBytes += CompressedSize;
	}

	return bCompressSucceeded;
}
/**
 * Thread-safe abstract compression routine. Compresses memory from uncompressed buffer and writes it to compressed
 * buffer. Updates CompressedSize with size of compressed data. Compression controlled by the passed in flags.
 *
 * @param	Flags						Flags to control what method to use and optionally control memory vs speed
 * @param	CompressedBuffer			Buffer compressed data is going to be written to
 * @param	CompressedSize	[in/out]	Size of CompressedBuffer, at exit will be size of compressed data
 * @param	UncompressedBuffer			Buffer containing uncompressed data
 * @param	UncompressedSize			Size of uncompressed data in bytes
 * @return true if compression succeeds, false if it fails because CompressedBuffer was too small or other reasons
 */
bool FCompression::CompressMemory( ECompressionFlags Flags, void* CompressedBuffer, int32& CompressedSize, const void* UncompressedBuffer, int32 UncompressedSize )
{
	double CompressorStartTime = FPlatformTime::Seconds();

	// make sure a valid compression scheme was provided
	check(Flags & COMPRESS_ZLIB);

	bool bCompressSucceeded = false;

	static bool GAlwaysBiasCompressionForSize = false;
	if (FPlatformProperties::HasEditorOnlyData())
	{
		static bool GTestedCmdLine = false;
		if (!GTestedCmdLine && FCommandLine::IsInitialized())
		{
			GTestedCmdLine = true;
			// Override compression settings wrt size.
			GAlwaysBiasCompressionForSize = FParse::Param( FCommandLine::Get(), TEXT("BIASCOMPRESSIONFORSIZE") );
		}
	}

	// Always bias for speed if option is set.
	if( GAlwaysBiasCompressionForSize )
	{
		int32 NewFlags = Flags;
		NewFlags &= ~COMPRESS_BiasSpeed;
		NewFlags |= COMPRESS_BiasMemory;
		Flags = (ECompressionFlags) NewFlags;
	}

	switch(Flags & COMPRESSION_FLAGS_TYPE_MASK)
	{
		case COMPRESS_ZLIB:
			bCompressSucceeded = appCompressMemoryZLIB(CompressedBuffer, CompressedSize, UncompressedBuffer, UncompressedSize);
			break;
		default:
			UE_LOG(LogCompression, Warning, TEXT("appCompressMemory - This compression type not supported"));
			bCompressSucceeded =  false;
	}

	// Keep track of compression time and stats.
	CompressorTime += FPlatformTime::Seconds() - CompressorStartTime;
	if( bCompressSucceeded )
	{
		CompressorSrcBytes += UncompressedSize;
		CompressorDstBytes += CompressedSize;
	}

	return bCompressSucceeded;
}