Example #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="newQuality"></param>
        public void SetQuality(RenderingQuality newQuality)
        {
            if (newQuality == Quality)
            {
                return;
            }

            Quality = newQuality;

            if (newQuality == RenderingQuality.Fast)
            {
                RayTracer.MaxOctreeDepth = 0;
            }
            else if (newQuality == RenderingQuality.Best)
            {
                // TODO restore MaxOctreeDepth that was set before
                RayTracer.MaxOctreeDepth = 10;
            }
        }
Example #2
0
        /// <summary>
        /// initialization, shoud be called first (creates jobs, output buffers, ...)
        /// </summary>
        /// <param name="outputSize"></param>
        /// <param name="numberOfJobs"></param>
        /// <param name="numberOfThreads"></param>
        public void Initialize(Vector2i outputSize, Vector2i numberOfJobs, int?numberOfThreads)
        {
            Quality = RenderingQuality.Best;

            renderingJobs       = new List <RenderingJob>();
            frameRedrawnEvent   = new ManualResetEvent(false);
            endOfRenderingEvent = new ManualResetEvent(false);

            OutputBufferSize = outputSize;
            CreateOutputBuffers(outputSize.X, outputSize.Y, sizeof(float));

            Log.Instance.AddMsg(LogLevel.Info, string.Format("OutputWindow [size: {0}x{1} pixels]", outputSize.X, outputSize.Y));

            var jobSize         = new Vector2i(outputSize.X / numberOfJobs.X, outputSize.Y / numberOfJobs.Y);
            var jobBufferLength = (outputSize.X * outputSize.Y * 3 /*RGB*/) / (numberOfJobs.X * numberOfJobs.Y);

            #region create rendering jobs

            frameRenderedEvent = new CountdownEvent(numberOfJobs.X * numberOfJobs.Y);

            for (var y = 0; y < numberOfJobs.Y; y++)
            {
                for (var x = 0; x < numberOfJobs.X; x++)
                {
                    var offset = IntPtr.Zero;
                    unsafe { offset = (IntPtr)((ColorRGB *)outputBuffer + (x * jobSize.X + y * (jobSize.Y * OutputBufferSize.X))); }

                    renderingJobs.Add(new RenderingJob(offset, new Vector2i(x * jobSize.X, y * jobSize.Y), new Vector2i(x, y), jobSize, OutputBufferSize.X - jobSize.X, Scene.Current.Camera, frameRenderedEvent));
                }
            }

            #endregion

            #region set max number of threads in ThreadPool

            int wThreads, cThreads;
            if (numberOfThreads.HasValue)
            {
                // if numberOfThreads is 0, set max number of threads in thread pool to number of cores
                if (numberOfThreads.Value == 0)
                {
                    numberOfThreads = Environment.ProcessorCount;
                }

                if (!ThreadPool.SetMaxThreads(numberOfThreads.Value, numberOfThreads.Value))
                {
                    throw new NotSupportedException();
                }

                wThreads = cThreads = numberOfThreads.Value;
            }
            else
            {
                ThreadPool.GetMaxThreads(out wThreads, out cThreads);
            }

            int availableWThreads, availableCThreads;
            ThreadPool.GetAvailableThreads(out availableWThreads, out availableCThreads);

            #endregion

            Log.Instance.AddMsg(LogLevel.Info, string.Format("ThreadPool [available workerThreads: {0}/{1}; maxCompletionPortThreads: {2}/{3}]", availableWThreads, wThreads, availableCThreads, cThreads));
            Log.Instance.AddMsg(LogLevel.Info, string.Format("RenderingJobs [count: {0}x{1}({2}); size: {3}x{4} pixels]", numberOfJobs.X.ToString(), numberOfJobs.Y, numberOfJobs.X * numberOfJobs.Y, jobSize.X, jobSize.Y));
        }