14. Suma lotes de valores con SIMD desde C++ (opcional)
Construye este ejemplo en tu proyecto de Unreal y comprueba el resultado en cada paso.
Este ejercicio es para proyectos con C++. Si trabajas exclusivamente en Blueprint, puedes terminar aquí: los nodos de arrays del apartado 8 siguen siendo tu recorrido. Esta API por lotes no aparece como un conjunto equivalente de nodos Blueprint.
Vas a sumar cinco saldos con cinco incrementos, conservando un resultado por posición. No es una suma de todos los elementos en un solo total.
A. Prepara un Actor de prueba
- Crea una clase C++ derivada de Actor llamada MiLoteNumeros mediante el asistente de Unreal. Usa el módulo de tu juego, no el del plugin.
- En el archivo NombreDeTuModulo.Build.cs, añade
"ScientificNumberTools"a la lista de dependencias privadas existente. Conserva las demás dependencias del proyecto. - En MiLoteNumeros.cpp, añade estos includes después del include de su propia cabecera:
#include "ScientificNumber.h"
#include "ScientificNumberSIMD.h"
- Localiza
AMiLoteNumeros::BeginPlay(). ConservaSuper::BeginPlay();y añade debajo el siguiente bloque, dentro de la función:
TArray<FScientificNumber> Saldos;
TArray<FScientificNumber> Incrementos;
for (int32 Indice = 1; Indice <= 5; ++Indice)
{
Saldos.Add(FScientificNumber(Indice * 10.0, 0));
Incrementos.Add(FScientificNumber(Indice, 0));
}
TArray<FScientificNumber> Resultados;
Resultados.SetNum(Saldos.Num());
FScientificNumberSIMD::BatchAdd(
Saldos.GetData(), Incrementos.GetData(),
Resultados.GetData(), Saldos.Num());
for (int32 Indice = 0; Indice < Resultados.Num(); ++Indice)
{
const FScientificNumber Esperado((Indice + 1) * 11.0, 0);
const bool Correcto = Resultados[Indice].IsSuccess()
&& Resultados[Indice] == Esperado;
UE_LOG(LogTemp, Display, TEXT("Lote[%d]: %s"),
Indice, Correcto ? TEXT("OK") : TEXT("ERROR"));
}
- Compila el proyecto con tu flujo habitual de C++. Coloca una instancia de MiLoteNumeros en el nivel y pulsa Play. Abre Output Log y busca
Lote[.
Qué debes ver: cinco líneas OK, de Lote[0] a Lote[4]. Los resultados correspondientes son 11, 22, 33, 44 y 55. Puedes detenerte con un breakpoint después de BatchAdd e inspeccionar Resultados para ver su mantisa y exponente.
B. Comprueba qué representa cada posición
Cambia Indice * 10.0 por Indice * 100.0 y cambia el valor esperado de 11.0 a 101.0. Recompila y repite: los resultados serán 101, 202, 303, 404 y 505. Cada posición combina el saldo y el incremento de esa misma posición.
Ambas entradas y la salida deben disponer de al menos Count elementos; en el ejemplo se preparan cinco. BatchAdd no devuelve un bool global: comprueba el estado de cada Scientific Number resultante antes de usarlo en el juego.
Este ejercicio enseña a llamar a la API y leer su resultado. Cinco elementos no demuestran una mejora de rendimiento; el beneficio depende del tamaño de los lotes, los datos y el equipo. Úsala cuando tu código ya procese conjuntos de números, sin cambiar por ello la lógica de la cartera Blueprint.