|
New V10 Charting Features for .NET, WPF, MFC, VCL, ActiveXI. Improvements Overview:Version 10's most significant improvements relate to its' Low Level Memory handling and the addition of ComputeShader Direct3D rendering.
Version 10 is now the world's fastest available rendering solution for 3D Surfaces, 2D Contours, and 2D Line Charts. And we're working on being the fastest in other use-cases. If new to ProEssentials and evaluating, plug any other chart into our new minimal-ish WPF GigaPrime3D and Winform GigaPrime2D examples and compare the speed, rendering quality, and quantity of code necessary to replicate. As always your feedback is greatly appreciated. If you have a specific use-case needing faster performance, let us know. If you need a current feature fixed/tweaked, let us know. If you need a new feature, let us know.
Below sections JaggedData, ComputeShaders, and CircularBuffers are just 3 new properties, yet the scope and quantity of code changes related to these properties was huge and will continue to evolve.
Historically, ProEssentials had a limitation that Subsets needed to be the same quantity for all Points. Thus memory was always one contiguous block of memory for all Subsets and Points. For 98% of charts this is fine and ideal. And GraphAnnotations and/or null data was used in cases to work around this limitation. With the addition of the v10s JaggedData property, ProEssentials can optionally work with Subsets as individual blocks of memory per Subset. One does not need to set the Points property. When the chart is told to initialize via PEreinitialize, Points will be set to the maximum of any one Subset. JaggedData is a new feature and data handling is a very large scope topic, so JaggedData does have limitations in the types of charts, PlottingMethods, and RenderEngines. For now, JaggedData is limited to RenderEngine = Direct2D and the Scientific Graph and PolarSmith controls. As ProEssentials evolves, JaggedData will support more use-cases. The demo examples 142, 143, and 144 show implementations of JaggedData via spoon feeding, passed by a CopyFrom method, and not passed but identified by pointer to local memory. As ProEssentials evolves we plan on using the low level JaggedData property array capability to expand other properties; such as adding a two dimensional interface to GraphAnnotations where the first dimension would represent a grouping index. Grouping similar annotation types would also facilitate implementing computeshaders for rendering annotations on the gpu.
Continuing the evolution of the RenderEngine = Direct3D rendering technology. v10 compounds the complexity of Direct3D rendering by adding the option to fully construct the scene on the GPU versus constructing on the CPU. The performance gains provided by GPU ComputeShader construction is dramatic. The potential of 3000+ cores working in parallel to construct a scene versus a single CPU is quite literally no comparison. ProEssentials' expands its use-case to plot 3D surfaces, 2D contours, and 2D Line charts with huge data sets. Given ProEssentials' low level native C/C++ core, we're fairly confident that ProEssentials will plot 3D Surfaces, 2D Contours and 2D Line charts faster than anything available.
Version 10 adds 2 new demo projects in the GigaPrime3D and GigaPrime2D folders where ProEssentials is installed. Existing demos 400, 401, 402, 408, 409, and 410 have been updated to enable the ComputeShader property. One should see a signficant performance boost when switching between these examples as compared to v9. Though the quantity of data in these examples is not enough to demo the full power of GPU construction. Example 413 demonstrates the full power of GPU construction with real-time updating 720,000 vertices of data per update. One can comment out the ComputerShader code lines within this demo to experience legacy v9 performance.
The new v10 demo GigaPrime3D will demonstrate the full power of GPU construction as it renders 4000x4000 3D surfaces combined with 4000x4000 2D contour and line chart for a real-world use-case of handling 3D data. This demo also shows an example of a 3D zooming interface via zooming a 2D Contour to control the zoom state of a 3D Contour.
The new v10 demo GigaPrime2D will demonstrate GPU construction real-time rendering 100 million data points fully passed and updated each 15ms while simultaneously supporting zooming, panning, scaling, and more. GigaPrime2D along with demo example 145 introduce a new property Filter2D3D that enables a ComputeShader and parallelism to pre-filter 2D line data prior to sending to the final ComputeShader that uses parallelism to construct the scene. Filter2D3D will loss-less filter sequential data to reduce the demand on the final ComputeShader. The combination of this two tier ComputeShader logic renders 2D line data dramatically fast to maximize your potential for real-time charting.
v10's new CircularBuffer features relate to both 1) v10's new low level memory management improvements and 2) ComputeShader features. CircularBuffers are used with ProEssentials' AppendYData and similar features used in partial-data updating real-time use-cases. CircularBuffers is a feature within the property array memory storage logic. Instead of having to physically shift data within memory (CircularBuffers = false), CircularBuffers=true enables a pointer to keep track of the newest data position within memory. Traditional non-jagged data as well as jagged data is supported. CircularBuffers are most beneficial for RenderEngine = Direct3D combined with ComputeShaders = true. CircularBuffers improve data shifting performance, but harm incrementally accessing data. ComputeShader logic works with blocks of memory and avoids incrementally handling data, thus the combination of CircularBuffers and ComputeShaders is where the true value of CircularBuffers shines.
Related to ComputeShader and CircularBuffers are properties: StagingBufferX, StagingBufferY, StagingBufferZ, ReuseDataX, ReuseDataY, ReuseDataZ, The staging buffer features enable an efficient pipeline for updating data from the cpu-side to gpu-side. ReuseDataX=true, would tell ProEssentials that XData has not changed and no buffer changes need processing. All these features work in concert, combined with DuplicateDataX and or DuplicateDataZ to provide an efficient path towards appending data to a chart. Legacy example 410 and new examples 145, 148 and 413 implement all of the above features providing your best information for studying this use-case.
New LabVIEW instrumentation Examples: Our v10 setup now optionally installs a NI LabVIEW Q3 2024 example project compatible with the LabVIEW Community Edition, that replicates our example 400 via our .Net Winforms interface and via our ActiveX interface for those who prefer a pure native implementation.
New Demo Examples: Our legacy demo projects found in the folders C#.NET, C#.NET80, WPF-C#.NET, WPF-C#.NET80, VB.NET, VC, and Delphi have been updated with additional examples and additions to existing examples.
Highlights within new Demo examples: Example 413: New 3D Surface Real-Time with large data implementing new ComputeShader, StagingBuffers, and CircularBuffers. Example 414: Delaunay3D Triangulation of a point cloud to create a 3D Height Map / Surface Example 415: 3D Surface with addition of WData to produce a 4D Surface. Also shows new property ContourLegendTitle. Example 416: Demo of new complex GraphAnnotationType of Sphere, Cone, Cylinder, Box, Ellipse, that are based of unit vectors to describe orientation and size. Rect, InnerRect, Cube/Cuboid are other new options and implemented similarly. Example 417: New Contour Colored Wireframe surface. WireFrameContourColored, WireFrameIsoSubsetPoint
Example 141: New secondary ContourLegend for help with displaying a legend for a 4th dimension shown via graph annotations or PointColors. Example 142: JaggedData, simple example 4 subsets with varying amounts of data. Example 143: JaggedData and data being passed via C# arrays. An alternate to using PEvset. Example 144: JaggedData where data is not passed, but only shared by reference via XDataPtr YDataPtr. Example 145: 2D Real-Time with ComputeShader, CircularBuffer storing data inside chart. Example 146: 2D Real-Time with ComputeShader, CircularBuffer using project memory via XDataPtr YDataPtr. Example 147: Delaunay Triangulation for a point cloud to create a 2D contour. New PlottingMethod of type ContourDelaunay. Example 148: 2D Contour Real-Time with ComputeShader and CircularBuffer. 1 million vertices redrawn per 15ms. Example 149: New approach to GraphAnnotationType angled text with justification, types 241-244. Angle does not follow data but is absolute. As compared to example 015 that also shows new angled text with justification where text follows slope of data.
Tweaks to legacy examples implementing new features: Example 000: New property AllowLargerLegendWidth. Useful for charts of smaller size. Size the demo window below 250 pixels to compare the legend construction. Example 013: Simple addition of SubsetAxes showing how to alter the location of Subset indices to MultiAxesSubsets. Example 015: Shows new angled text with Justification that follows data. New TextBoundingBox(245) GraphAnnotationType type also applies to HorzLineAnnotationType. Example 023: Adding GraphBmpOpacity bitmap opacity option. Also DeskBmpOpacity, TableBmpOpacity, ZoomWindowBmpOpacity Example 030: Updated with current financial data, improved annotations based study including TextBoundingBox(245) graph annotations.
Example 122: Simply enables ComputerShader and example renders noticeably faster. Example 139: Simply enables ComputerShader and example renders noticeably faster.
Example 401: Enables ComputeShader. Example 402: Enables ComputeShader, shows new feature GridBrighten to brighten the grid instead of shading it to be more subtle. Example 405: Adds Box type GraphAnnotations ontop of bars. Example 408: Enables ComputeShader. Example 409: Enables ComputeShader. Example 410: Enables ComputeShader, CircularBuffers, StagingBuffers, DuplicateDataX, DuplicateDataZ, and ReuseDataZ
Demo Export Feature The new TestBed demo export feature eases experimenting with individual demos. All demo projects support a demo export menu or button to launch a Demo Export Dialog. This dialog will create a separate testbed project within a folder inside the ProEssentials10/TestBeds folder.
In Summary We’ve been grinding hard on revamping this help system for over a month, but it’ll still take a few more weeks to fully sync with all the properties and methods and wrap up a final read-through of 1500+ topics. Pro tip: Our example projects are your ultimate guide to mastering our interfaces. If you’ve dived into our demos, you’re basically a ProEssentials guru. Huge thanks for your patience as we roll out v10, and for your support of our one-of-a-kind, high-performance charting, built native and managed and without the worry of sketchy open-source dependencies. We thank you for reading this far. You're the boss.
II. Functional Improvements / Additions:
Related to JaggedData, DLL properties to get/set the size of a jagged array #define PEP_naJAGGEDPOINTSX
When used with PEvgetcell: Returns the size (number of Points) of jagged array in lpvDestination for subset index passed in as nCell. .NET: use PeData.GetJaggedPointsX and similar functions to get size of jagged array.
When used with PEvsetcell: Sets the size (number of Points) of jagged array in lpvDestination for subset index passed in as nCell. .NET: use PeData.SetJaggedPointsX and similar functions to set size of jagged array. It is not necessary to set the size of a array as the array will grow automatically, but setting the size may help with memory reallocations if spoon-setting large amounts of data. The new .NET property array jagged functions will set/get the size as needed when copying arrays.
#define PEP_bLEFTBUTTONPAN3D Scope: Pe3do .Net: Pe3do.PeUserInterface.Scrollbar.LeftButtonPan OCX,VCL: LeftButtonPan3D DLL: set with PEnset
False, Default, the user must hold the shift key combined with left button to drag the 3d scene. Set to True to enable dragging scene without having to hold the shift key down. We mostly added this due to the WPF event mechanism being bogged down anytime a key is held down within a WPF app. Where on low end systems this was causing the WPF event mechanism to spool events. Though this feature may be generally preferred.
#define PEP_bSKIPRANGING Scope: Pe3do .NET: Pe3do.PeData.SkipRanging OCX: SkipRanging DLL: Set with PEnset
This property tells ProEssentials to avoid overall Min Max data range determination. Set true prior to calling PEreinitialize/ReinitializeResetImage as part of data or property updating logic.
Now that ProEssentials v10 can handle huge 3D surface charting, we needed to add this property to avoid legacy code flow that required range testing as a default behavior. Range testing huge amounts of data is obviously slow and we needed a way to avoid range testing to provide a path to maximum update speed for certain UI needs. See our GigaPrime3D example project's use of this feature.
#define PEP_nZOOMTHRESHOLD Scope: Pesgo .NET: Pesgo.PeUserInterface.Allow.ZoomThreshold OCX: ZoomThreshold DLL: Set with PEnset
Gets or Sets the zoom-box dragging size threshold to enable zoom (1 - 100 pixels) Default is the user must drag 20 pixels to enable zoom.
#define PEP_bWIREFRAMEISOSUBSETPOINT Scope: Pe3do .Net: Pe3do.PePlot.Option.WireFrameIsoSubsetPoint DLL: set with PEnset
Setting True shows PlottingMethod = WireFrame as the IsoSubsetPoint grid (similar to ShowWirefame feature, potentially a reduced data set). If False PlottingMethod = Wireframe shows the scene with RasterState set to Wireframe (viewing raw triangle data as non filled triangles). Default = False. For large data sets, showing the raw triangle wireframe can be slow and not visually ideal. Related: PEP_bWIREFRAMEISOLINEBORDERS to form border lines around iso line grid
#define PEP_bWIREFRAMECONTOURCOLORED Scope: Pe3do .Net: Pe3do.PePlot.Option.WireFrameContourColored DLL: set with PEnset
Setting True shows wireframe as contour colors based on ydata height. Else if False, wireframe is solid color defined by PeColor.SubsetColors[(int)(SurfaceColors.WireFrame)]. Default = False.
#define PEP_bOVERLAPBARS Scope: Pego .Net: PePlot.Option.OverlapBars DLL: set with PEnset
Default False, Set to true to force bars from multiple subsets to overlap vs offset side by side. This allows a special case when developer prefers bars to overlap for various reasons.
#define PEP_bOVERLAPMULTIAXESOFFSETBARS Scope: Pego .Net: PePlot.Option.OverlapMultiAxesOffsetBars DLL: set with PEnset
Set True to enable logic to offset bars across multiple axes within an overlapped multi axes group. Only applicable when used with PeGrid.OverlapMultiAxes to group multiple axes, and when PePlot.Methods[] is used to define Bar plotting methods on multiple axes. This should normally be set True when using Bar plotting methods on multiple axis regions and overlapping multi axes, though it defaults False to not break existing customer code that expects the bars to overlap.
#define PEP_nALLOWLARGERLEGENDWIDTH Scope: All controls .Net: PeLegend.AllowLargerLegendWidth DLL: set with PEnset
Set to a pixel width where if control width is below this threshold the top/bottom legend uses full width of control instead of limited to width of grid area.
#define PEP_nPOINTCOLORPOINTS Scope: Pesgo, Pego, Pepso .Net: PeColor.PointColorPoints DLL: set with PEnset 0 = Color the Points and the Line segments 1 = Color the Points, default legacy behavior
#define PEP_bGRIDBANDSPATCHING Scope: Pe3do .Net: Pe3do.PeColor.GridBandsPatching DLL: set with PEnset to FALSE (0) to show grid bands as strips instead of patches.
Default True, GridBands color will be alternated between major grid lines forming a patching effect. Set False to form strips of GridBands color. The new Log scale will patch on ticks so the patching may be considered too complex when viewing many cycles. Developers may also prefer strips on normal linear scales.
#define PEP_bGRIDBRIGHTEN Scope: Pe3do .Net: Pe3do.PeColor.GridBrighten DLL: set with PEnset to TRUE (1) to brighten the grid.
Default False, Set True to brighten the grid / GraphForeColor instead of shading it to be more subtle.
#define PEP_szaPOINTLABELSII .Net: Pego.PeString.PointLabelsII OCX: PointLabelsII DLL: Set with PEvsetcellEx
This property provides a 2 dimensional table of labels below the x axis. The number columns should match the Points property. The number of rows should be 1 to 50. All rows have the same number of cells. The chart's logic will search for identical labels and form larger boxes with one label in place of multiple smaller boxes with identical labels. The table can be further formatted with vertical and horizontal grid lines via the properties PointLabelsIIBoxed and PointLabelsIISeparators. Grid lines within the charting area normally draw vertical grid lines at data point locations. GridLineSeparators set to True will draw grid lines at the mid point between data points. This aligns with how the 2 dimensional point labels are separated making the chart grid lines and 2D PointLabels grid lines synchronize.
Related to Ellipses, Rects: New annotation types MajorMinorRadii, MajorDirection, MinorDirection, AxisDirection, AxisAngles. All these types can construct an ellipse or rect so there is logic that chooses which feature is used. If unit vectors MajorDirection and MinorDirection are anything but all zeros, then these unit vectors will control ellipse/rect construction. If MajorDirection and MinorDirection are all zero, the we next test if AxisDirection is all zero, in which case AxisAngle is used to construct a circle or square. Note that AxisAngles and AxisDirection only represent a direction of axis and there is no way to control the shape (major minor radii orientation.) If AxisDirection is non zero and MajorDirection and MinorDirection are zero, then AxisDirection is used. After setting these annotations to non-zero, it may be best to set these annotations back to zero after the ellipse/rect annotation type.
New GraphAnnotationType constants:
#define PEGAT_MAJORMINOR_RADII 219 see example 416 #define PEGAT_AXIS_DIRECTION 222 #define PEGAT_TEXT_AT_PIXEL 228 #define PEGAT_MAJORMINOR_INSIDERADII 229 #define PEGAT_INSIDERECT_THIN 230
#define PEP_naSUBSETAXES PeGrid.SubsetAxes Default = Empty, when empty this feature is avoided
Allows per subset control of axis index. When using this property array, the subset order is no longer related to setting MultiAxesSubsets.
One must still set MultiAxesSubsets though you only needs to make sure that the total subsets allocated within the MultiAxesSubsets items equals or matches the value of Subsets. There is a test within the chart construction that verifies that allocation of MultiAxesSubsets uses all subsets. So this test must still pass.
When setting SubsetAxes, be sure to reference all axes at least once, the chart will alter MultiAxesSubset items for you to reflect the state of SubsetAxes. This allows changing the numbers of subsets per axis without having to change MultiAxesSubsets.
In the future we may expand this logic to allow SubsetAxes to be the overall controlling factor and it may auto resize MultiAxesSubsets and auto establish RandomSubsetsToGraph / SubsetsToShow. This feature is new and hopefully we will evolve it into an easier and more flexible way to handle multi axes. See example 013 that uses SubsetAxes to change the order relationship of Subsets to MultiAxes.
#define PEP_fDXZOOMMAX Pe3do .NET PePlot.Option.DxZoomMax OCX / VCL DxZoomMax DLL: Set with PEvset Sets a maximum zoom and thus prevents the user from zooming too far past the focal point (camera is past the looking-at location.) Set DegreePrompting to true to help determine a best value for your scene as GridAspectX GridAspectZ DxFOV will impact the range of DxZoomMax.
#define PEP_fDXZOOMMIN Pe3do .NET PePlot.Option.DxZoomMin OCX / VCL DxZoomMin DLL: Set with PEvset Sets a minimum zoom and thus prevents the user from zooming too far. Set DegreePrompting to true to help determine a best value for your scene as GridAspectX GridAspectZ DxFOV will impact the range of DxZoomMin.
#define PEP_fDXVIEWPORTPANFACTOR Pe3do .NET PePlot.Option.DxViewportPanFactor OCX / VCL DxViewportPanFactor DLL: Set with PEvset This property controls the responsiveness / sensitivity of dragging the 3D scene while holding Shift-Key and Left-Button-Dragging. Responsiveness may need adjusting as it is dependent on GridAspectX, GridAspectY, and DxFOV. For example, setting to 1.5 will increase responsiveness 50%.
Note MouseWheelZoomFactor3D allows for a higher max responsiveness value.
v10 improves existing properties below DxPsManualCullY and DxPsManualCullXZ. These features allow for polished 3D zooming by setting ManualMinY ManualMaxY and related properties. See the new v10 demo GigaPrime3D for an example of 3D zooming via zooming a 2D Contour of same data.
#define PEP_bDXPSMANUALCULLY Pe3do BOOLEAN Default = False PeGrid.Configure.DxPsManualCullY Set to True when manually scaling a 3D chart and want the highest quality culling to your manual extents. This culls both the ManualMinY and ManualMaxY settings. ManualScaleCullMinY and ManualScaleCullMaxY might also be recommended as these will cull at the vertex shader level and reduce the overhead of the pixel shader. #define PEP_bDXPSMANUALCULLXZ Pe3do BOOLEAN Default = False PeGrid.Configure.DxPsManualCullXZ Set this property to True when you want the highest quality culling of the image to your manual extents. Setting this True will test and cull for the ManualMinX, ManualMaxX, ManualMinZ, and ManualMaxZ settings.
|
|
©2026 Gigasoft, Inc. | All rights reserved.
Gigasoft is a registered trademark, and ProEssentials a trademark of Gigasoft, Inc. |
|