Improved performance in classic modes when panning the view. This is achieved by parallelizing plotting linedefs and vertices on multiple logical CPU cores. Enabled for linedefs by default. Disabled for vertices by default, since it can cause flickering when vertices are close to each other. Settings can be changed in Preferences -> Appearance

This commit is contained in:
biwa 2022-12-09 15:37:45 +01:00
parent e49c91960b
commit af25e772e3
4 changed files with 144 additions and 37 deletions

View file

@ -98,6 +98,8 @@ namespace CodeImp.DoomBuilder.Config
private bool showfps;
private int[] colordialogcustomcolors;
private bool autolaunchontest;
private bool parallelizedlinedefplotting;
private bool parallelizedvertexplotting;
//mxd. Script editor settings
private string scriptfontname;
@ -214,6 +216,8 @@ namespace CodeImp.DoomBuilder.Config
public bool ShowFPS { get { return showfps; } internal set { showfps = value; } }
public int[] ColorDialogCustomColors { get { return colordialogcustomcolors; } internal set { colordialogcustomcolors = value; } }
public bool AutoLaunchOnTest { get { return autolaunchontest; } internal set { autolaunchontest = value; } }
public bool ParallelizedLinedefPlotting { get { return parallelizedlinedefplotting; } internal set { parallelizedlinedefplotting = value; } }
public bool ParallelizedVertexPlotting { get { return parallelizedvertexplotting; } internal set { parallelizedvertexplotting = value; } }
//mxd. Highlight mode
public bool UseHighlight
@ -369,6 +373,8 @@ namespace CodeImp.DoomBuilder.Config
switchviewmodes = cfg.ReadSetting("switchviewmodes", false); //mxd
showfps = cfg.ReadSetting("showfps", false);
autolaunchontest = cfg.ReadSetting("autolaunchontest", false);
parallelizedlinedefplotting = cfg.ReadSetting("parallelizedlinedefplotting", true);
parallelizedvertexplotting = cfg.ReadSetting("parallelizedvertexplotting", false);
//mxd. Script editor
scriptfontname = cfg.ReadSetting("scriptfontname", "Courier New");

View file

@ -19,7 +19,7 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Net;
using System.Threading.Tasks;
using CodeImp.DoomBuilder.Map;
using CodeImp.DoomBuilder.Geometry;
using CodeImp.DoomBuilder.Data;
@ -2129,37 +2129,77 @@ namespace CodeImp.DoomBuilder.Rendering
// This renders a set of linedefs
public void PlotLinedefSet(ICollection<Linedef> linedefs)
{
// Go for all linedefs
foreach(Linedef l in linedefs)
// biwa. Code duplication because the performance hit from the overhead of calling PlotLinedef in a loop causes reduced FPS.
// Telling the compiler to agressively inline PlotLinedef seems to mostly alleviate the problem, but I'm not sure how reliable that is
if (General.Settings.ParallelizedLinedefPlotting)
{
// Transform vertex coordinates
Vector2D v1 = l.Start.Position.GetTransformed(translatex, translatey, scale, -scale);
Vector2D v2 = l.End.Position.GetTransformed(translatex, translatey, scale, -scale);
// Go for all linedefs
Parallel.ForEach(linedefs, l =>
{
// Transform vertex coordinates
Vector2D v1 = l.Start.Position.GetTransformed(translatex, translatey, scale, -scale);
Vector2D v2 = l.End.Position.GetTransformed(translatex, translatey, scale, -scale);
//mxd. Should we bother?
double lengthsq = (v2 - v1).GetLengthSq();
if(lengthsq < minlinelength) continue; //mxd
//mxd. Should we bother?
double lengthsq = (v2 - v1).GetLengthSq();
if (lengthsq < minlinelength) return; //mxd
// Determine color
PixelColor c = DetermineLinedefColor(l);
// Determine color
PixelColor c = DetermineLinedefColor(l);
// Draw line. mxd: added 3d-floor indication
if(l.ExtraFloorFlag && General.Settings.GZMarkExtraFloors)
plotter.DrawLine3DFloor((int)v1.x, TransformY((int)v1.y), (int)v2.x, TransformY((int)v2.y), ref c, General.Colors.ThreeDFloor);
else
plotter.DrawLineSolid((int)v1.x, TransformY((int)v1.y), (int)v2.x, TransformY((int)v2.y), ref c);
// Draw line. mxd: added 3d-floor indication
if (l.ExtraFloorFlag && General.Settings.GZMarkExtraFloors)
plotter.DrawLine3DFloor((int)v1.x, TransformY((int)v1.y), (int)v2.x, TransformY((int)v2.y), ref c, General.Colors.ThreeDFloor);
else
plotter.DrawLineSolid((int)v1.x, TransformY((int)v1.y), (int)v2.x, TransformY((int)v2.y), ref c);
//mxd. Should we bother?
if(lengthsq < minlinenormallength) continue; //mxd
//mxd. Should we bother?
if (lengthsq < minlinenormallength) return; //mxd
// Calculate normal indicator
double mx = (v2.x - v1.x) * 0.5f;
double my = (v2.y - v1.y) * 0.5f;
// Calculate normal indicator
double mx = (v2.x - v1.x) * 0.5f;
double my = (v2.y - v1.y) * 0.5f;
// Draw normal indicator
plotter.DrawLineSolid((int)(v1.x + mx), TransformY((int)(v1.y + my)),
(int)((v1.x + mx) - (my * l.LengthInv) * linenormalsize),
TransformY((int)((v1.y + my) + (mx * l.LengthInv) * linenormalsize)), ref c);
// Draw normal indicator
plotter.DrawLineSolid((int)(v1.x + mx), TransformY((int)(v1.y + my)),
(int)((v1.x + mx) - (my * l.LengthInv) * linenormalsize),
TransformY((int)((v1.y + my) + (mx * l.LengthInv) * linenormalsize)), ref c);
});
}
else
{
// Go for all linedefs
foreach (Linedef l in linedefs)
{
// Transform vertex coordinates
Vector2D v1 = l.Start.Position.GetTransformed(translatex, translatey, scale, -scale);
Vector2D v2 = l.End.Position.GetTransformed(translatex, translatey, scale, -scale);
//mxd. Should we bother?
double lengthsq = (v2 - v1).GetLengthSq();
if (lengthsq < minlinelength) continue; //mxd
// Determine color
PixelColor c = DetermineLinedefColor(l);
// Draw line. mxd: added 3d-floor indication
if (l.ExtraFloorFlag && General.Settings.GZMarkExtraFloors)
plotter.DrawLine3DFloor((int)v1.x, TransformY((int)v1.y), (int)v2.x, TransformY((int)v2.y), ref c, General.Colors.ThreeDFloor);
else
plotter.DrawLineSolid((int)v1.x, TransformY((int)v1.y), (int)v2.x, TransformY((int)v2.y), ref c);
//mxd. Should we bother?
if (lengthsq < minlinenormallength) continue; //mxd
// Calculate normal indicator
double mx = (v2.x - v1.x) * 0.5f;
double my = (v2.y - v1.y) * 0.5f;
// Draw normal indicator
plotter.DrawLineSolid((int)(v1.x + mx), TransformY((int)(v1.y + my)),
(int)((v1.x + mx) - (my * l.LengthInv) * linenormalsize),
TransformY((int)((v1.y + my) + (mx * l.LengthInv) * linenormalsize)), ref c);
}
}
}
@ -2200,8 +2240,36 @@ namespace CodeImp.DoomBuilder.Rendering
return;
}
// Go for all vertices
foreach(Vertex v in vertices) PlotVertex(v, DetermineVertexColor(v));
// biwa. Code duplication because the performance hit from the overhead of calling PlotLinedef in a loop causes reduced FPS.
// Telling the compiler to agressively inline PlotLinedef seems to mostly alleviate the problem, but I'm not sure how reliable that is
if (General.Settings.ParallelizedVertexPlotting)
{
// Go for all vertices
Parallel.ForEach(vertices, v =>
{
// Transform vertex coordinates
Vector2D nv = v.Position.GetTransformed(translatex, translatey, scale, -scale);
int colorindex = DetermineVertexColor(v);
// Draw pixel here
plotter.DrawVertexSolid((int)nv.x, TransformY((int)nv.y), vertexsize, ref General.Colors.Colors[colorindex], ref General.Colors.BrightColors[colorindex], ref General.Colors.DarkColors[colorindex]);
});
}
else
{
// Go for all vertices
foreach (Vertex v in vertices)
{
// Transform vertex coordinates
Vector2D nv = v.Position.GetTransformed(translatex, translatey, scale, -scale);
int colorindex = DetermineVertexColor(v);
// Draw pixel here
plotter.DrawVertexSolid((int)nv.x, TransformY((int)nv.y), vertexsize, ref General.Colors.Colors[colorindex], ref General.Colors.BrightColors[colorindex], ref General.Colors.DarkColors[colorindex]);
}
}
}
#endregion

View file

@ -74,6 +74,8 @@ namespace CodeImp.DoomBuilder.Windows
this.cbStretchView = new System.Windows.Forms.CheckBox();
this.scriptautoclosebrackets = new System.Windows.Forms.CheckBox();
this.scriptallmanstyle = new System.Windows.Forms.CheckBox();
this.cbParallelizedLinedefPlotting = new System.Windows.Forms.CheckBox();
this.cbParallelizedVertexPlotting = new System.Windows.Forms.CheckBox();
this.browseScreenshotsFolderDialog = new System.Windows.Forms.FolderBrowserDialog();
this.apply = new System.Windows.Forms.Button();
this.cancel = new System.Windows.Forms.Button();
@ -657,7 +659,7 @@ namespace CodeImp.DoomBuilder.Windows
// cbMarkExtraFloors
//
this.cbMarkExtraFloors.AutoSize = true;
this.cbMarkExtraFloors.Location = new System.Drawing.Point(18, 466);
this.cbMarkExtraFloors.Location = new System.Drawing.Point(18, 442);
this.cbMarkExtraFloors.Name = "cbMarkExtraFloors";
this.cbMarkExtraFloors.Size = new System.Drawing.Size(175, 17);
this.cbMarkExtraFloors.TabIndex = 1;
@ -669,7 +671,7 @@ namespace CodeImp.DoomBuilder.Windows
// cbFlatShadeVertices
//
this.cbFlatShadeVertices.AutoSize = true;
this.cbFlatShadeVertices.Location = new System.Drawing.Point(18, 489);
this.cbFlatShadeVertices.Location = new System.Drawing.Point(18, 465);
this.cbFlatShadeVertices.Name = "cbFlatShadeVertices";
this.cbFlatShadeVertices.Size = new System.Drawing.Size(115, 17);
this.cbFlatShadeVertices.TabIndex = 1;
@ -703,7 +705,7 @@ namespace CodeImp.DoomBuilder.Windows
// cbOldHighlightMode
//
this.cbOldHighlightMode.AutoSize = true;
this.cbOldHighlightMode.Location = new System.Drawing.Point(229, 443);
this.cbOldHighlightMode.Location = new System.Drawing.Point(229, 419);
this.cbOldHighlightMode.Name = "cbOldHighlightMode";
this.cbOldHighlightMode.Size = new System.Drawing.Size(207, 17);
this.cbOldHighlightMode.TabIndex = 15;
@ -715,7 +717,7 @@ namespace CodeImp.DoomBuilder.Windows
// cbStretchView
//
this.cbStretchView.AutoSize = true;
this.cbStretchView.Location = new System.Drawing.Point(229, 397);
this.cbStretchView.Location = new System.Drawing.Point(229, 373);
this.cbStretchView.Name = "cbStretchView";
this.cbStretchView.Size = new System.Drawing.Size(172, 17);
this.cbStretchView.TabIndex = 13;
@ -747,6 +749,29 @@ namespace CodeImp.DoomBuilder.Windows
this.toolTip1.SetToolTip(this.scriptallmanstyle, resources.GetString("scriptallmanstyle.ToolTip"));
this.scriptallmanstyle.UseVisualStyleBackColor = true;
//
// cbParallelizedLinedefPlotting
//
this.cbParallelizedLinedefPlotting.AutoSize = true;
this.cbParallelizedLinedefPlotting.Location = new System.Drawing.Point(229, 465);
this.cbParallelizedLinedefPlotting.Name = "cbParallelizedLinedefPlotting";
this.cbParallelizedLinedefPlotting.Size = new System.Drawing.Size(150, 17);
this.cbParallelizedLinedefPlotting.TabIndex = 49;
this.cbParallelizedLinedefPlotting.Text = "Parallelized linedef plotting";
this.toolTip1.SetToolTip(this.cbParallelizedLinedefPlotting, "Parallelizes linedef plotting over all logical CPU cores.");
this.cbParallelizedLinedefPlotting.UseVisualStyleBackColor = true;
//
// cbParallelizedVertexPlotting
//
this.cbParallelizedVertexPlotting.AutoSize = true;
this.cbParallelizedVertexPlotting.Location = new System.Drawing.Point(18, 488);
this.cbParallelizedVertexPlotting.Name = "cbParallelizedVertexPlotting";
this.cbParallelizedVertexPlotting.Size = new System.Drawing.Size(148, 17);
this.cbParallelizedVertexPlotting.TabIndex = 50;
this.cbParallelizedVertexPlotting.Text = "Parallelized vertex plotting";
this.toolTip1.SetToolTip(this.cbParallelizedVertexPlotting, "Parallelizes vertex plotting over all logical CPU cores. Can result in vertices c" +
"lose to each other flickering when panning the view");
this.cbParallelizedVertexPlotting.UseVisualStyleBackColor = true;
//
// browseScreenshotsFolderDialog
//
this.browseScreenshotsFolderDialog.Description = "Select a Folder to Save Screenshots Into";
@ -1468,6 +1493,8 @@ namespace CodeImp.DoomBuilder.Windows
this.appearancegroup1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.appearancegroup1.Controls.Add(this.cbParallelizedVertexPlotting);
this.appearancegroup1.Controls.Add(this.cbParallelizedLinedefPlotting);
this.appearancegroup1.Controls.Add(this.activethingsalphalabel);
this.appearancegroup1.Controls.Add(this.label31);
this.appearancegroup1.Controls.Add(this.cbMarkExtraFloors);
@ -1593,7 +1620,7 @@ namespace CodeImp.DoomBuilder.Windows
// cbShowFPS
//
this.cbShowFPS.AutoSize = true;
this.cbShowFPS.Location = new System.Drawing.Point(229, 466);
this.cbShowFPS.Location = new System.Drawing.Point(229, 442);
this.cbShowFPS.Name = "cbShowFPS";
this.cbShowFPS.Size = new System.Drawing.Size(148, 17);
this.cbShowFPS.TabIndex = 15;
@ -1612,7 +1639,7 @@ namespace CodeImp.DoomBuilder.Windows
// qualitydisplay
//
this.qualitydisplay.AutoSize = true;
this.qualitydisplay.Location = new System.Drawing.Point(18, 397);
this.qualitydisplay.Location = new System.Drawing.Point(18, 373);
this.qualitydisplay.Name = "qualitydisplay";
this.qualitydisplay.Size = new System.Drawing.Size(128, 17);
this.qualitydisplay.TabIndex = 10;
@ -1666,7 +1693,7 @@ namespace CodeImp.DoomBuilder.Windows
// animatevisualselection
//
this.animatevisualselection.AutoSize = true;
this.animatevisualselection.Location = new System.Drawing.Point(229, 420);
this.animatevisualselection.Location = new System.Drawing.Point(229, 396);
this.animatevisualselection.Name = "animatevisualselection";
this.animatevisualselection.Size = new System.Drawing.Size(190, 17);
this.animatevisualselection.TabIndex = 14;
@ -1709,7 +1736,7 @@ namespace CodeImp.DoomBuilder.Windows
// visualbilinear
//
this.visualbilinear.AutoSize = true;
this.visualbilinear.Location = new System.Drawing.Point(18, 443);
this.visualbilinear.Location = new System.Drawing.Point(18, 419);
this.visualbilinear.Name = "visualbilinear";
this.visualbilinear.Size = new System.Drawing.Size(171, 17);
this.visualbilinear.TabIndex = 12;
@ -1719,7 +1746,7 @@ namespace CodeImp.DoomBuilder.Windows
// classicbilinear
//
this.classicbilinear.AutoSize = true;
this.classicbilinear.Location = new System.Drawing.Point(18, 420);
this.classicbilinear.Location = new System.Drawing.Point(18, 396);
this.classicbilinear.Name = "classicbilinear";
this.classicbilinear.Size = new System.Drawing.Size(176, 17);
this.classicbilinear.TabIndex = 11;
@ -2848,5 +2875,7 @@ namespace CodeImp.DoomBuilder.Windows
private System.Windows.Forms.ListView lvToastActions;
private System.Windows.Forms.ColumnHeader title;
private System.Windows.Forms.ColumnHeader description;
private System.Windows.Forms.CheckBox cbParallelizedVertexPlotting;
private System.Windows.Forms.CheckBox cbParallelizedLinedefPlotting;
}
}

View file

@ -99,6 +99,8 @@ namespace CodeImp.DoomBuilder.Windows
cbShowFPS.Checked = General.Settings.ShowFPS;
autolaunchontest.Checked = General.Settings.AutoLaunchOnTest;
cbFlatShadeVertices.Checked = General.Settings.FlatShadeVertices;
cbParallelizedLinedefPlotting.Checked = General.Settings.ParallelizedLinedefPlotting;
cbParallelizedVertexPlotting.Checked = General.Settings.ParallelizedVertexPlotting;
//mxd
locatetexturegroup.Checked = General.Settings.LocateTextureGroup;
@ -360,6 +362,8 @@ namespace CodeImp.DoomBuilder.Windows
General.Settings.ShowFPS = cbShowFPS.Checked;
General.Settings.AutoLaunchOnTest = autolaunchontest.Checked;
General.Settings.FlatShadeVertices = cbFlatShadeVertices.Checked;
General.Settings.ParallelizedLinedefPlotting = cbParallelizedLinedefPlotting.Checked;
General.Settings.ParallelizedVertexPlotting = cbParallelizedVertexPlotting.Checked;
// Script settings
General.Settings.ScriptFontBold = scriptfontbold.Checked;