Implemento una función de ruido coherente, y me sorprendió descubrir que usar ruido de gradiente (es decir, ruido de Perlin) es en realidad un poco más rápido que el ruido de valor. Profiling muestra que la razón de esto es la división necesaria para convertir el valor int azar en un doble de la gama de -1.0 a 1.0:División eficaz de un doble con una potencia de 2
static double noiseValueDouble(int seed, int x, int y, int z) {
return 1.0 - ((double)noiseValueInt(seed, x, y, z)/1073741824.0);
}
ruido Gradiente requiere unos pocos multiplica más, pero debido a los usos de la tabla de gradiente precomputed el noiseValueInt
directamente para calcular un índice en la tabla, y no requiere ninguna división. Entonces mi pregunta es, ¿cómo podría hacer que la división anterior sea más eficiente, considerando que la división es por un poder de 2 (2^30).
En teoría todo lo que tendría que hacer es restar 30 del exponente del doble, pero hacerlo por la fuerza bruta (es decir, la manipulación de bits) daría lugar a todo tipo de casos de esquina (INF, NAN, desbordamiento exponente, etc.) Una solución de ensamblaje x86 estaría bien.
¿Estás seguro de que importa tanto? El uso de manipulación de bits específica de la máquina no es portátil, e incluso puede afectar el rendimiento debido a problemas de almacenamiento en caché o programación ... –
@BasileStarynkevitch Eso es lo que quise decir con mi último párrafo. No quiero hacer la manipulación de bits asumiendo IEEE 754, pero estaría bien con una solución de ensamblaje específica para x86. – zennehoy
No me molestaré sobre eso. No ganarás mucho y podrías perder algo de rendimiento. –