# EnergyUsageReading

> The energy consumed by a single device subsystem since energy-usage tracking was started or reset, together with the time interval over which it was measured.

## Definition

* **Type:** Struct
* **Namespace:** [UnityEngine.AdaptivePerformance](/engine/6000.7/script-reference/unityengine/adaptiveperformance.md)
* **Assembly:** UnityEngine.AdaptivePerformanceModule

```csharp
public readonly struct EnergyUsageReading
```

## Remarks

Get a reading for a subsystem with [EnergyUsage.Get](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusage/get.md). Readings are cumulative rather than absolute: [EnergyUsageReading.Energy](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/energy.md) covers the period that starts when tracking was started or reset with [IEnergyUsageControl.StartEnergyUsageTracking](/engine/6000.7/script-reference/unityengine/adaptiveperformance/ienergyusagecontrol/startenergyusagetracking.md) and ends when the system last updated the reading, and [EnergyUsageReading.Interval](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/interval.md) is the length of that same period.

Check [EnergyUsageReading.Available](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/available.md) first, because it gates the other two values: when it's false, the device didn't report this subsystem and [EnergyUsageReading.Energy](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/energy.md) and [EnergyUsageReading.Interval](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/interval.md) are meaningless. Divide [EnergyUsageReading.Energy](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/energy.md) by [EnergyUsageReading.Interval](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/interval.md) to get the average power the subsystem drew over the period, in milliwatts.

Additional Resources: [EnergyUsage](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusage.md), [EnergyUsageSubsystem](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagesubsystem.md), [IEnergyUsageControl](/engine/6000.7/script-reference/unityengine/adaptiveperformance/ienergyusagecontrol.md)

The following example tracks energy usage while a component is enabled and logs the average power the GPU subsystem drew since tracking started.

## Examples

```csharp
using UnityEngine;
using UnityEngine.AdaptivePerformance;

public class GpuEnergyReadingExample : MonoBehaviour
{
    IAdaptivePerformance adaptivePerformance;
    IEnergyUsageControl energyUsageControl;

    void OnEnable()
    {
        adaptivePerformance = Holder.Instance;
        if (adaptivePerformance == null || !adaptivePerformance.Initialized)
            return;

        energyUsageControl = adaptivePerformance.EnergyUsageControl();
        if (energyUsageControl == null || !energyUsageControl.StartEnergyUsageTracking())
            Debug.Log("Energy-usage tracking isn't available on this device.");
    }

    void Update()
    {
        if (energyUsageControl == null || !energyUsageControl.EnergyUsageTrackingActive)
            return;

        EnergyUsage energyUsage = adaptivePerformance.PerformanceStatus.PerformanceMetrics.EnergyUsage;
        EnergyUsageReading reading = energyUsage.Get(EnergyUsageSubsystem.Gpu);

        // Energy and Interval are only meaningful when the device reported this subsystem.
        if (!reading.Available)
            return;

        // Microwatt-seconds divided by milliseconds gives average power in milliwatts.
        float averagePower = (float)reading.Energy / reading.Interval;
        Debug.Log($"The GPU averaged {averagePower} mW since tracking started.");
    }

    void OnDisable()
    {
        energyUsageControl?.StopEnergyUsageTracking();
    }
}
```

## Constructors

| Constructor                                                                                                                                                | Description                                                                                                                    |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| [EnergyUsageReading(System.Boolean,System.Int64,System.Int64)](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/ctor.md) | Initializes a new [EnergyUsageReading](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading.md). |

## Properties

| Property                                                                                                     | Description                                                                                                                                                                                                                                                                                                                                                                             |
| ------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [Available](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/available.md) | True if the device reported data for this subsystem in the current sample, false otherwise. When false, [EnergyUsageReading.Energy](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/energy.md) and [EnergyUsageReading.Interval](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/interval.md) are not meaningful. |
| [Energy](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/energy.md)       | The energy consumed in microwatt-seconds since energy-usage tracking was started or reset.                                                                                                                                                                                                                                                                                              |
| [Interval](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/interval.md)   | The measurement interval in milliseconds that [EnergyUsageReading.Energy](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/energy.md) covers, measured from the start or last reset of energy-usage tracking until the system last updated the reading.                                                                                               |
