public void Draw(PrimitivesRenderer2D primitivesRenderer, float depth, Matrix matrix, Color color) { TexturedBatch2D texturedBatch2D = primitivesRenderer.TexturedBatch(m_texture, useAlphaTest: false, 0, DepthStencilState.None, null, null, SamplerState.PointClamp); int count = texturedBatch2D.TriangleVertices.Count; foreach (Particle particle in m_particles) { if (particle.Active) { DrawParticle(texturedBatch2D, particle, depth, color); } } texturedBatch2D.TransformTriangles(matrix, count); }
public void Flush(bool clearAfterFlush = true) { Flush(PrimitivesRenderer2D.ViewportMatrix(), clearAfterFlush); }
public static void Capture(int width, int height, string filename) { if (GameManager.Project != null) { using (RenderTarget2D renderTarget2D = new RenderTarget2D(width, height, 1, ColorFormat.Rgba8888, DepthFormat.Depth24Stencil8)) { RenderTarget2D renderTarget = Display.RenderTarget; Dictionary <ComponentGui, bool> dictionary = new Dictionary <ComponentGui, bool>(); ResolutionMode resolutionMode = ResolutionMode.High; try { if (!SettingsManager.ShowGuiInScreenshots) { foreach (ComponentPlayer componentPlayer in GameManager.Project.FindSubsystem <SubsystemPlayers>(throwOnError: true).ComponentPlayers) { dictionary[componentPlayer.ComponentGui] = componentPlayer.ComponentGui.ControlsContainerWidget.IsVisible; componentPlayer.ComponentGui.ControlsContainerWidget.IsVisible = false; } } resolutionMode = SettingsManager.ResolutionMode; SettingsManager.ResolutionMode = ResolutionMode.High; Display.RenderTarget = renderTarget2D; ScreensManager.Draw(); if (SettingsManager.ShowLogoInScreenshots) { PrimitivesRenderer2D primitivesRenderer2D = new PrimitivesRenderer2D(); Texture2D texture2D = ContentManager.Get <Texture2D>("Textures/Gui/ScreenCaptureOverlay"); Vector2 vector = new Vector2((width - texture2D.Width) / 2, 0f); Vector2 corner = vector + new Vector2(texture2D.Width, texture2D.Height); primitivesRenderer2D.TexturedBatch(texture2D, useAlphaTest: false, 0, DepthStencilState.None).QueueQuad(vector, corner, 0f, new Vector2(0f, 0f), new Vector2(1f, 1f), Engine.Color.White); primitivesRenderer2D.Flush(); } } finally { Display.RenderTarget = renderTarget; foreach (KeyValuePair <ComponentGui, bool> item in dictionary) { item.Key.ControlsContainerWidget.IsVisible = item.Value; } SettingsManager.ResolutionMode = resolutionMode; } if (!Storage.DirectoryExists(ModsManager.baseDir + "/ScreenCapture")) { Storage.CreateDirectory(ModsManager.baseDir + "/ScreenCapture"); } string path = Storage.CombinePaths(Storage.GetSystemPath(ModsManager.baseDir + "/ScreenCapture"), filename); using (FileStream stream = new FileStream(path, FileMode.Create)) { byte[] array = new byte[4 * renderTarget2D.Width * renderTarget2D.Height]; renderTarget2D.GetData(array, 0, new Rectangle(0, 0, renderTarget2D.Width, renderTarget2D.Height)); ByteBuffer src = ByteBuffer.Wrap(array); Bitmap bitmap = Bitmap.CreateBitmap(renderTarget2D.Width, renderTarget2D.Height, Bitmap.Config.Argb8888); bitmap.CopyPixelsFromBuffer(src); bitmap.Compress(Bitmap.CompressFormat.Png, 100, stream); } Intent intent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE"); intent.SetData(Android.Net.Uri.FromFile(new Java.IO.File(path))); Window.Activity.SendBroadcast(intent); } } }
static PerformanceManager() { m_primitivesRenderer = new PrimitivesRenderer2D(); m_averageFrameTime = new RunningAverage(1f); m_averageCpuFrameTime = new RunningAverage(1f); m_stateMachine = new StateMachine(); m_statsString = string.Empty; m_stateMachine.AddState("PreMeasure", delegate { m_totalGameTime = 0.0; }, delegate { if (GameManager.Project != null) { m_totalGameTime += Time.FrameDuration; if (m_totalGameTime > 60.0) { m_stateMachine.TransitionTo("Measuring"); } } }, null); m_stateMachine.AddState("Measuring", delegate { m_totalFrameTime = 0.0; m_totalCpuFrameTime = 0.0; m_frameCount = 0; }, delegate { if (GameManager.Project != null) { if (ScreensManager.CurrentScreen != null && ScreensManager.CurrentScreen.GetType() == typeof(GameScreen)) { float lastFrameTime = Program.LastFrameTime; float lastCpuFrameTime = Program.LastCpuFrameTime; if (lastFrameTime > 0f && lastFrameTime < 1f && lastCpuFrameTime > 0f && lastCpuFrameTime < 1f) { m_totalFrameTime += lastFrameTime; m_totalCpuFrameTime += lastCpuFrameTime; m_frameCount++; } if (m_totalFrameTime > 180.0) { m_stateMachine.TransitionTo("PostMeasure"); } } } else { m_stateMachine.TransitionTo("PreMeasure"); } }, null); m_stateMachine.AddState("PostMeasure", delegate { if (m_frameCount > 0) { m_longTermAverageFrameTime = (float)(m_totalFrameTime / (double)m_frameCount); float num = (int)MathUtils.Round(MathUtils.Round(m_totalFrameTime / (double)m_frameCount / 0.004999999888241291) * 0.004999999888241291 * 1000.0); float num2 = (int)MathUtils.Round(MathUtils.Round(m_totalCpuFrameTime / (double)m_frameCount / 0.004999999888241291) * 0.004999999888241291 * 1000.0); AnalyticsManager.LogEvent("[PerformanceManager] Measurement", new AnalyticsParameter("FrameCount", m_frameCount.ToString()), new AnalyticsParameter("AverageFrameTime", num.ToString() + "ms"), new AnalyticsParameter("AverageFrameCpuTime", num2.ToString() + "ms")); Log.Information($"PerformanceManager Measurement: frames={m_frameCount.ToString()}, avgFrameTime={num.ToString()}ms, avgFrameCpuTime={num2.ToString()}ms"); } }, delegate { if (GameManager.Project == null) { m_stateMachine.TransitionTo("PreMeasure"); } }, null); m_stateMachine.TransitionTo("PreMeasure"); }