# EnergyUsage

> A collection of cross-platform per-subsystem energy consumption readings, surfaced through PerformanceMetrics.EnergyUsage.

## Definition

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

```csharp
public struct EnergyUsage
```

## Remarks

Call [EnergyUsage.Get](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusage/get.md) with a [EnergyUsageSubsystem](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagesubsystem.md) value to read one subsystem's energy consumption since energy-usage tracking was started or reset with [IEnergyUsageControl.StartEnergyUsageTracking](/engine/6000.7/script-reference/unityengine/adaptiveperformance/ienergyusagecontrol/startenergyusagetracking.md).

Individual readings can be unavailable independently of each other, so check [EnergyUsageReading.Available](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusagereading/available.md) on every reading you use. Values update at the platform's native cadence, which can be considerably slower than once per frame: on Android, readings refresh roughly every 20 to 30 seconds. Poll the readings periodically rather than expecting a new value each frame.

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

The following example tracks energy usage while a component is enabled and logs the energy that the CPU and GPU subsystems consumed since tracking started.

## Examples

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

public class EnergyUsageExample : 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;
        LogSubsystem(energyUsage, EnergyUsageSubsystem.Cpu);
        LogSubsystem(energyUsage, EnergyUsageSubsystem.Gpu);
    }

    void LogSubsystem(EnergyUsage energyUsage, EnergyUsageSubsystem subsystem)
    {
        EnergyUsageReading reading = energyUsage.Get(subsystem);

        // This device doesn't report energy for this subsystem, so skip it.
        if (!reading.Available)
            return;

        Debug.Log($"{subsystem} used {reading.Energy} microwatt-seconds over {reading.Interval} ms.");
    }

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

## Constructors

| Constructor                                                                                                                                                                                                                         | Description                                                                                                                              |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| [EnergyUsage(System.ValueTuple\{UnityEngine.AdaptivePerformance.EnergyUsageSubsystem,UnityEngine.AdaptivePerformance.EnergyUsageReading}\[\])](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusage/ctor.md) | Initializes a new [EnergyUsage](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusage.md) with the given readings. |

## Methods

| Method                                                                                    | Description                                                                                                |
| ----------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| [Get](/engine/6000.7/script-reference/unityengine/adaptiveperformance/energyusage/get.md) | Returns the reading for the given subsystem, or a default (unavailable) reading if none has been recorded. |
