• 浮点数与定点数问题


    在MOBA项目开发过程中,LFIXED类中定义了许多浮点转定点的常量。

    这个类用了很久,以往的同步测试中也没有因为这些常量的使用产生过不同步问题。

    然而,总觉得哪里不安全,想了很久,终于把长久以来的疑问想清楚了:帧同步游戏中浮点数为什么不安全,如何做才能安全(同步)?

    对于任何一个浮点数,在不同硬件上可能数值不同,产生不同的原因是什么?

    是不同硬件的算法不同吗?不是。

    所有硬件都是按照浮点数的通用算法存储的,比如 0.1,

    0.1f 转换为二进制的方法是不断乘2取整数部分,直到精度达到要求(并对后面的一位四舍五入)。

    产生不同数值的原因就在精度问题,不同机器的精度不同时就产生了不同的数值。

    由以上原理论知:像0.5,0.25,0.125这样 (1/2)的N次方的数值不会产生精度不同问题,因为它们能在精度范围内存储,

    但超出精度存储范围的(1/2)的N次方的小数也可能会有问题的,如  (1/2)的24次方

    其实帧同步游戏中用到的浮点数常量并不多,可以先一台机器上算出需要用到的浮点常量对应的定点数,存储到文件中,运行加载出来。

    运行其间可能会用到浮点数,比如求两个数值的比例,这时候的解决办法是  A*1.0F/B ,其中A,B是定点数

    至于走路同步问题,游戏启动时,各英雄位置是从文件中读取的定点数,因此保证了英雄初始位置各机器同步。走路过程中,服务器只广播方向(定点数),各端根据定点数速度和转向算出新位置,这样英雄每走一步后,其位置在各机器也是同步的

  • 相关阅读:
    题解:luoguP1070 道路游戏(DP)
    题解:luoguP2577【ZJOI2005】午餐(DP)
    题解:bzoj1801: [Ahoi2009]chess 中国象棋
    题解:bzoj1878: [SDOI2009]HH的项链
    SpringBoot静态资源文件 lion
    简要的Log4Net 应用配置
    Web Service 初级教程
    log4Net 动态改变写入文件
    Ornament 类型资源权限
    JQuery 引发两次$(document).ready事件
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/10101412.html
Copyright © 2020-2023  润新知