zoukankan      html  css  js  c++  java
  • 浮点数与定点数问题

    在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是定点数

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

  • 相关阅读:
    电力基础知识培训(三)
    VB开发——打开Excel并使特定的worksheet处于激活状态
    电力基础知识培训(二)
    Professionals train themselves
    WINCE6.0 + S3C2443的启动过程nboot篇
    WINCE下如何设置/删除/查询这些环境变量
    WINCE6.0+S3C6410 watchdog重新启动
    在WinCE 6.0系统下实现USB功能定制
    在WINCE5.0开始菜单中添加应用程序
    WINCE内存机制
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/10101412.html
Copyright © 2011-2022 走看看