コード例 #1
0
            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];
            }
コード例 #2
0
        /// <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);
        }