Estoy trabajando en un fragmento de código donde tengo que tratar con uvs (coordenadas de textura 2D) que no están necesariamente en el rango de 0 a 1. Como ejemplo, a veces obtendré un uv con un componente u que es 1.2. Para manejar esto yo estoy poniendo en práctica un envoltorio que hace que el embaldosado de la siguiente manera:Evitar llamadas a floor()
u -= floor(u)
v -= floor(v)
Hacer esto provoca 1,2 a 0,2, que es convertido en el resultado deseado. También maneja casos negativos, como -0.4 convirtiéndose en 0.6.
Sin embargo, estas llamadas al piso son bastante lentas. He perfilado mi aplicación con Intel VTune y estoy gastando una gran cantidad de ciclos simplemente haciendo esta operación en el piso.
Después de haber leído algunos antecedentes sobre el tema, se me ocurrió la siguiente función, que es un poco más rápida pero aún deja mucho que desear (todavía estoy incurriendo en penalizaciones por conversión de tipo, etc.).
int inline fasterfloor(const float x) { return x > 0 ? (int) x : (int) x - 1; }
he visto algunos trucos que se realizan con ensamblador en línea, pero nada de lo que parece funcionar exactamente correcto o tiene alguna mejora significativa de velocidad.
¿Alguien sabe algún truco para manejar este tipo de situaciones?
¿Podría corregir lo que le está dando valores no válidos? – Bill
Usar * reinterpret_cast (& u) y algún tipo de magia (asumiendo un formato de flotación IEEE) probablemente sea lo más rápido que puedas hacer en C++, pero eso pierde cierta portabilidad. –
Tronic
¿Pueden las coordenadas ser alguna vez negativas? Además, cuando no ha encontrado nada que tenga "alguna mejora de velocidad significativa", ¿le ha pasado por la mente que podría ser porque si existiera un método significativamente más rápido, entonces el compilador lo usaría para empezar? ;) – jalf