

ProEssentials is a native C/C++ component that renders directly via Direct2D, Direct3D, and GDI+ to a Windows device context. This low-level architecture means data handling follows classic C/C++ and C# basic array patterns: simple contiguous blocks of memory; reducing the number of such block.
Gigasoft strongly recommends that you maintain your data in standard arrays within your application before passing or (passing Reference) to ProEssentials. This approach provides several benefits:
ProEssentials organizes chart data using two fundamental dimensions: Subsets and Points.
For example, a chart with 4 temperature sensors recording 1000 measurements each would have:Subsets = 4 and Points = 1000.
When using the default Non-Jagged mode (JaggedData = false), always set PeData.Subsets and PeData.Points BEFORE passing any data to the chart, as this defines the single contiguous memory block size.
ProEssentials offers two internal storage modes, controlled by the JaggedData property:
JaggedData = false (Default)
All data is stored in one contiguous block of memory. Every subset has the same number of points.
Best for: Regular datasets where all series have identical sample counts. This covers 98% of charting use cases and is the most efficient mode.
JaggedData = true
Each subset is stored as a separate block of memory. Subsets can have different numbers of points.
Best for: Sensors with different sample rates, datasets with varying lengths, or when combining data from different sources. Currently requires RenderEngine = Direct2D.
ProEssentials provides multiple ways to transfer data from your application to the chart. Each method has specific strengths depending on your data size and use case.
Set individual values one at a time using the indexer syntax.
Performance: Slower than block methods, but ProEssentials is native code so this is still quite efficient
Best for: Datasets up to ~100,000 total points, quick prototyping, or when you need to set sparse values
Block copy entire arrays to the chart. FastCopyFrom internally calls PEvset which uses memcpy for maximum speed.
Performance: Fastest .NET method - uses memcpy internally
Best for: Large datasets (100K to 500K points), performance-critical applications
Note: if data is less than 100K bytes, pin the memory, as is the case for all data methods belowWrapper: FastCopyFrom wraps the PEvsetW DLL function
For JaggedData mode, copy individual subsets from C# jagged arrays (arrays of arrays).
Performance: Fast per-subset copying
Best for: Datasets where subsets have different sample counts
Wrapper: FastCopyFromJagged wraps PEvsetEx DLL function
Instead of copying data to the chart, tell ProEssentials where your data already exists. The chart reads directly from your memory - no copy overhead.
Performance: Zero copy overhead - chart uses your memory directly
Best for: Datasets >500K points, multiple charts sharing same data, real-time updates
Requirement: Arrays must remain in scope and be pinned for the lifetime of the chart
Same zero-copy concept as UseDataAtLocation, but for JaggedData mode. Each subset points to its own application array.
Performance: Zero copy overhead - chart uses your memory directly
Best for: Large jagged datasets, multiple charts sharing same subset arrays
Requirement: Arrays must remain in scope and be pinned for the lifetime of the chart
| Method | .NET Interface | C++ DLL | Speed | Best Use Case |
|---|---|---|---|---|
| Indexer | PeData.Y[s,p] = val | PEvsetcellEx | Good | <100K points, prototyping |
| Block Copy | FastCopyFrom() | PEvset | Fastest | 100K-500K points, production |
| Partial Copy | FastCopyFromJagged() | PEvsetEx | Fast | Jagged data, partial updates |
| Zero-Copy | UseDataAtLocation() | PEP_faYDATAPTR | No Copy | >500K points, shared data |
| Zero-Copy Jagged | UseJaggedDataAtLocation() | PEP_faYDATAPTR | No Copy | >500K jagged, shared subsets |
The .NET interfaces (Gigasoft.ProEssentials.dll) are thin wrappers around the native PEGRP64H.DLL (64-bit) or PEGRP32H.DLL (32-bit). Understanding this helps you optimize:
| .NET Method | Wraps DLL Function | Internal Behavior |
|---|---|---|
FastCopyFrom() | PEvsetW | memcpy entire array |
FastCopyFromJagged() | PEvsetEx | memcpy partial range |
PeData.Y[s,p] = val | PEvsetcellEx | Single value assignment |
UseDataAtLocation() | PEP_faYDATAPTR | Sets pointer, no data copy |
UseJaggedDataAtLocation() | PEP_faYDATAPTR | Sets per-subset pointer, no copy |
Different chart objects use different combinations of X, Y, Z, and W data:
| Chart Object | Description | Data Properties Used |
|---|---|---|
| Pego | Graph Object (bar, line, area) | Y only (X is categorical via PointLabels) |
| Pesgo | Scientific Graph (XY scatter, line) | X, Y (numeric X axis) |
| Pe3do | 3D Scientific Graph (surfaces) | X, Y, Z (optionally W for 4D) |
| Pepso | Polar/Smith Chart | X (angle/real), Y (radius/imaginary) |
| Pepco | Pie Chart | Y only (slice values) |
Explore these examples in the PeDemo application for working implementations:
1. For Non-Jagged mode, set Subsets and Points before passing data
2. For <100K points, simple indexers are fine
3. For <500K points, use FastCopyFrom() or PEvset - simple and fast
4. For >500K points or real-time, consider UseDataAtLocation() for zero-copy efficiency
5. Keep your data in application arrays - maintain clear separation from chart
6. Use JaggedData only when subsets genuinely have different point counts
7. Call ReinitializeResetImage() after setting/changing data
Our engineers are happy to help you determine the best data passing strategy for your specific use case. Describe your data structure and performance requirements.
Contact SupportYour success is our #1 goal by providing the easiest and most professional benefit to your organization and end-users.
ProEssentials was born from professional Electrical Engineers needing their own charting components. Join our large list of top engineering companies using ProEssentials.
Thank you for being a ProEssentials customer, and thank you for researching the ProEssentials charting engine.