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. Jagged Data: 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. ComputeShader: 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. CircularBuffers: 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 140: Custom Bitmaps as Symbols, adding flexibility in symbols with bonus of bitmaps as symbols plotting faster in Direct2D.
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. Example 036: New 2D PointLabelsII feature. With related new properties PointLabelsIIBoxed, PointLabelsIISeparators, GridLineSeparators producing a table of labels below the x axis.
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 115: Enables ComputeShader and uses StagingBufferX and StagingBufferY
Example 122: Simply enables ComputerShader and example renders noticeably faster. Example 139: Simply enables ComputerShader and example renders noticeably faster. Example 400: Enables ComputeShader. New feature DxZoomMax DxZoomMin to limit mousewheel zooming. New feature DxViewportPanFactor to allow for more responsive shift drag. MouseWheelZoomFactor allows for higher maximum responsiveness. These 4 properties allow for a more polished user experience with our Pe3do controls.
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 v10 Updates the Excel ActiveX Walkthrough to latest Excel Office 365. And all the walkthroughs were tweaked to reference v10. 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. |