public TileRenderState(TiledRenderer renderer) { var n = renderer.TileSize + renderer.Margin; SetTileSize(new Size(n, n)); var k = (n + 2 * renderer.Margin) * 4; TensorRow = new byte[k]; OutputRow = new byte[k]; BufferRow = new byte[k]; }
/// <summary> /// Return the recommended tile size based on the available RAM /// </summary> /// <param name="size">Size of the input in pixels</param> /// <param name="margin">Tile margin in percent [0, 1.0]</param> /// <returns>Maximum tile size that can be processed safely</returns> public static Size GetRecommendedTileSize(Size size, float margin) { // the .NET heap *will* allocate much more than 33% of the available RAM // though the algorithm performs better with less (i.e. bigger) tiles in // terms of output quality, this will come at the expense of much longer // calculation time const int THRESHOLD_PERCENT = 33; var threshold = (AvailableMemory * THRESHOLD_PERCENT) / 100; var required = GetEstimatedRequiredMemory(size); if (required > threshold) { var factor = new RangedValue <float>(margin, 0.0f, 1.0f).Value; var pixels = GetMaximumPixelCount(threshold); var tileSize = (int)Math.Floor(Math.Sqrt(pixels)); var n = (int)(tileSize / (1.0f + factor)); if (TiledRenderer.GetTiles(size, n).Count > 1) { return(new Size(n, n)); } } return(size); }