public void PerformanceTest1() { var srcImg = SixLabors.ImageSharp.Image.Load("TestFiles\\Rainbow_to_alpha_gradient_large.png"); var toSquish = srcImg.ToSquishImage(); StbSharp.Image image; using (var stream = File.OpenRead("TestFiles\\Rainbow_to_alpha_gradient_large.png")) image = new StbSharp.ImageReader().Read(stream); var watch = new System.Diagnostics.Stopwatch(); watch.Restart(); for (int i = 0; i < 100; ++i) { toSquish.Compress(CompressionMode.Dxt5, CompressionOptions.ColourIterativeClusterFit | CompressionOptions.UseParallelProcessing); } watch.Stop(); var netTime = watch.Elapsed; TestContext.WriteLine($"ClusterFit Iterative time: {netTime}"); watch.Restart(); for (int i = 0; i < 100; ++i) { toSquish.Compress(CompressionMode.Dxt5, CompressionOptions.ColourClusterFitAlt | CompressionOptions.UseParallelProcessing); } watch.Stop(); netTime = watch.Elapsed; TestContext.WriteLine($"ClusterFit Alt time: {netTime}"); watch.Restart(); for (int i = 0; i < 100; ++i) { StbSharp.Stb.stb_compress_dxt(image, true); } watch.Stop(); var stbTime = watch.Elapsed; TestContext.WriteLine($"Stb time: {stbTime}"); watch.Restart(); for (int i = 0; i < 100; ++i) { StbSharp.Stb.stb_compress_dxt(image, true, 2); } watch.Stop(); var stbHqTime = watch.Elapsed; TestContext.WriteLine($"Stb HQ time: {stbHqTime}"); watch.Restart(); for (int i = 0; i < 100; ++i) { toSquish.CompressWithNvidia(CompressionMode.Dxt5); } watch.Stop(); var nvidiaTime = watch.Elapsed; TestContext.WriteLine($"NVidia time: {nvidiaTime}"); }
public static void ProcessFile(string method, string filePath, TestContext context) { var srcImg = SixLabors.ImageSharp.Image.Load(filePath); void processSTB(CompressionMode mode, bool useAlpha, string ext) { var dstFileName = System.IO.Path.ChangeExtension(filePath, ext); context.WriteLine($"{dstFileName} with {mode}"); using (var stream = System.IO.File.OpenRead(filePath)) { var srcImage = new StbSharp.ImageReader().Read(stream); if (srcImage.Comp != 4) { return; // TODO: should convert RGB to RGBA } // flags bits: // 1 = dither // 2 = refine count (1 or 2) var bytes = StbSharp.Stb.stb_compress_dxt(srcImage, useAlpha, 2); var dstImage = Bitmap .Decompress(srcImage.Width, srcImage.Height, bytes, mode) .ToImageSharp(); dstImage.Save(dstFileName); } } void processNVidia(CompressionMode mode, string ext) { var dstFileName = System.IO.Path.ChangeExtension(filePath, ext); context.WriteLine($"{dstFileName} with {mode}"); srcImg.SquishImageWithNvidia(mode, context).Save(dstFileName); } void processSquish(CompressionMode mode, CompressionOptions options, string ext) { var dstFileName = System.IO.Path.ChangeExtension(filePath, ext); context.WriteLine($"{dstFileName} with {mode}"); srcImg.SquishImage(mode, options, context).Save(dstFileName); } if (method == "STB") { processSTB(CompressionMode.Dxt1, false, "Dx1-STB-NoAlpha.png"); processSTB(CompressionMode.Dxt1, true, "Dx1-STB.png"); processSTB(CompressionMode.Dxt3, true, "Dx3-STB.png"); processSTB(CompressionMode.Dxt5, true, "Dx5-STB.png"); return; } if (method == "NVIDIA") { processNVidia(CompressionMode.Dxt1, "Dx1-NVidia.png"); processNVidia(CompressionMode.Dxt3, "Dx3-NVidia.png"); processNVidia(CompressionMode.Dxt5, "Dx5-NVidia.png"); return; } #if DEBUG var xflags = CompressionOptions.None; #else var xflags = CompressionOptions.UseParallelProcessing | CompressionOptions.None; #endif if (method == "RANGEFIT") { var flags = xflags | CompressionOptions.ColourRangeFit; processSquish(CompressionMode.Dxt1, flags, "Dx1-RangeFit.png"); processSquish(CompressionMode.Dxt3, flags, "Dx3-RangeFit.png"); processSquish(CompressionMode.Dxt5, flags, "Dx5-RangeFit.png"); return; } if (method == "CLUSTERFIT") { var flags = xflags | CompressionOptions.ColourClusterFit; processSquish(CompressionMode.Dxt1, flags, "Dx1-ClusterFit.png"); processSquish(CompressionMode.Dxt3, flags, "Dx3-ClusterFit.png"); processSquish(CompressionMode.Dxt5, flags, "Dx5-ClusterFit.png"); return; } if (method == "CLUSTERFIT_ALT") { var flags = xflags | CompressionOptions.ColourClusterFit; processSquish(CompressionMode.Dxt1, flags, "Dx1-ClusterFitAlt.png"); processSquish(CompressionMode.Dxt3, flags, "Dx3-ClusterFitAlt.png"); processSquish(CompressionMode.Dxt5, flags, "Dx5-ClusterFitAlt.png"); return; } if (method == "CLUSTERFIT_ITER") { var flags = xflags | CompressionOptions.ColourClusterFit; processSquish(CompressionMode.Dxt1, flags, "Dx1-ClusterFitIter.png"); processSquish(CompressionMode.Dxt3, flags, "Dx3-ClusterFitIter.png"); processSquish(CompressionMode.Dxt5, flags, "Dx5-ClusterFitIter.png"); return; } }