Use flotadores o dobles al escribir juegos móviles


8

Sé que para los sombreadores, los flotadores deben usarse porque son la opción óptima para el rendimiento. Los dobles son lentos y usan más memoria, lo que no es ideal para sombreadores. Si bien los flotadores son menos precisos y son propensos a sobreflujos de flotadores, la compensación por la velocidad es ideal en el hardware móvil.

Pero, ¿qué pasa con cualquier otro lugar en la base del código que no esté relacionado con la tubería del sombreador? Estoy escribiendo un motor y uso dobles para la marca de actualización delta e intento mantener todas las unidades en relación con ese tipo de datos, por lo que hay muchos lugares que usan dobles. ¿Debo usar flotadores en el móvil también en el motor?

El motor está escrito en lenguaje C ++.


Me imagino que depende en gran medida del idioma que estés usando.
DJ Spicy Deluxe

Se agregó C ++ en la descripción
Dan

Respuestas:


14

Sería difícil encontrar una GPU móvil que pudiera usar dobles incluso si quisieras, por lo que parte de la elección está hecha para ti.

Solo hay unos pocos lugares en los que podrías beneficiarte al cambiar de flotadores de precisión simple en tu juego:

Estos serían los dos ejemplos más comunes de cosas que no deberías intentar almacenar en un flotador de precisión simple, ya que pierden una precisión significativa sobre el rango que necesitas cubrir (en el primer segundo de tu juego, puedes representar el tiempo transcurrido tiempo para dentro 2-24 segundos o decenas de nanosegundos, pero después de 2.5 horas, comienza a perder precisión de milisegundos)

Pero eso no significa que deba usar los dobles necesariamente. Los tipos enteros pueden manejar estos valores muy bien. (Un int de 32 bits puede brindarle una precisión de milisegundos durante 12 días de reproducción continua. Las entradas de 64 bits durarán millones de años)

Un valor de tiempo delta generalmente será del orden de 16 milisegundos, por lo que almacenarlo en un único flotante de precisión le da precisión a aproximadamente2-29s, que todavía está por debajo del nivel de nanosegundos, es decir. probablemente más allá de la precisión con la que puede cronometrar de manera confiable su código, señalar sus hilos o coordinar sus actualizaciones gráficas de todos modos. Agregar más precisión aquí con un doble es poco probable que mejore tu juego de una manera mensurable.

Por lo tanto, puede almacenar el tiempo transcurrido total con alta precisión o con un tipo entero, calcular su delta y convertirlo en flotante de precisión simple una vez por cuadro, luego use flotadores felizmente a partir de ahí.

Del mismo modo para los puestos. Incluso con un mundo enorme, si lo divide en trozos de varios kilómetros de diámetro o menos, los flotadores de precisión individuales pueden ubicar una posición relativa a su trozo principal con una precisión de menos de un milímetro .

Las compensaciones relativas entre objetos (para calcular encabezados y similares) generalmente están bien para almacenar en un flotador incluso a distancias inmensas. Su error relativo, en comparación con la longitud total del vector, permanece en un rango controlado.

Por lo tanto, no hay muchas razones para recurrir a los dobles por defecto. Consideraría que solo si tienes una necesidad muy particular, donde has calculado que la precisión de los flotadores no es suficiente, y mantienes el uso de dobles solo en la parte de tu juego que lo necesita activamente.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.