Bueno, pues estoy aprendiendo Unity desde hace tiempo.
El caso es que bueno, como gamer que soy, he jugado a Minecraft y se lo que son las Farlands (para el que no lo sepa, una zona muy alejada del spawn donde las cosas se generan parcial o incorrectamente debido a la gran cantidad de digitos que dicha posición tiene (esto causa que las aproximaciones matemáticas no selleven acabo correctamente causando bugs y demás)).
Estas "Farlands" están en todos los juegos que sean de mundo abierto.
Con Unity puedes probar a alcanzar dichos limites donde todo comienza a ser extraño y un poco escalofriante. Para poner un ejemplo, cuando mueves un objeto a posiciones mayores de 100,000 unidades el editor de la IDE te avisa de que pueden haber problemas referentes a punto flotante. He probado a mover un jugador a más de 1 millón de unidades de (0, 0, 0) en los ejes X y Z y la verdad es que es bastante curioso, todo comienza a vibrar y apenas si puedes moverte y saltar correctaente sin que el personaje no te vaya a tirones.
Estoy intentando entender el concepto sobre estos errores de precisión, para ello he leido los limites de los siguientes tipos: floats, doubles y decimal; con este enlace: http://www.blackwasp.co.uk/CSharpNumericDataTypes.aspx
He estado leyendo página en inglés, pero no me he enterado de mucho (refente a Unity).
En este post: http://answers.unity3d.com/questions/240456/strange-shaking-or-mystery-far-lands.html el usuario que respondió dijo lo siguiente:
Citar
The further you are from 0.0 the worse it gets where over 10 000 you'll start to see anomalies where the floating point imprecision will be about 0.1.
No entiendo porque la imprecisión es de 0.1, es decir, la cantidad máxima de digitos que tiene el tipo float (el que usa Unity por defecto), este según la página de arriba tiene 7 digitos decimales de precisión es decir, que 10 000 o 10^4 tendría que mover 4 digitos nada más, haciendo que por ejemplo:
1/ 9 = 0.1111112 + 10 000 = 10000.112, y luego tomando solo la parte decimal 0.112 - 0.111 = 0.001 no??
Necesito que alguien me aclare esa duda...
EDITO: La duda ya la tengo resuelta Más abajo dejé un link, por si alguien quiere revisar un sitio donde se explica de forma muy sencilla
Tengo otra consulta, y la pregunta es la siguiente, Unity usa floats (32 bits) por defecto y Java doubles (64 bits), mi pregunta es, porque no usa Unity doubles también, tienen más precisión, y es mejor, tengo tres posibles candidatos como posibles razón:
- Floats son más rápidos de procesar
- Unity solo está dedicado a una plataforma (Windows), mientras que java es multiplataforma, Unity en principio también lo es, pero al usar .NET tiene sus limitaciones...
- Las GPUs operan en single foating-points según este post: http://answers.unity3d.com/questions/667069/oculus-rift-camera-shaking-when-far-away-from-000.html (pero no creo que sea la razón)
Cual creéis que pueda ser la posible razón?
Un saludo.