zoukankan      html  css  js  c++  java
  • [C++基金会]位计算 游戏开发中的应用

    定义的位操作:通俗点说,,位计算是计算机操作二进制整数。
    无论整数可以用二的方式来表示进度,不同类型的其长度的整数位的是不一样的。INT8要么char靠8个月2
    位表示,INT16或者short是由16个2进度位表示,INT32是由32位状态位表示。

    位运算在游戏中的应用

    往往,在游戏开发中做位运算的时候,我关注的主要是某一位的值是0,还是1。而并非去关注这个整数的值是多少。
    比方:00100010,这个8位的整数从右到左。它的第一位为0,第二位为1。第三位为0。第六位为1。


    //检查state的第pos位是否为1
    int bitCheck(int state, int pos)
    {
        return state & 1<< pos - 1;
    }
     
    //将state的第pos位的值设为1
    int bitAdd(int state, int pos)
    {
        return state | (1 << (pos - 1));
    }
     
    //将state的第pos位的值设为0
    int bitDel(int state, int pos)
    {
        return state & (~(1 << (pos - 1)));
    }

    位运算往往在游戏用来记录一些状态,一个32位的整数,就能记录32种状态。而且仅仅须要一个int就够了。
    样例:

    如果一个NPC有下面几种状态,行走状态。站立状态。普通攻击状态,技能攻击状态,依据这个NPC的不同状态。client须要播放不同的动作。非常多同学立即联想到的是用枚举,然后就開始写代码,非常快就把程序写好了。这个时候。策划又提了一个新的需求,说攻击的时候可能会产生爆击,爆击的时候普通攻击和技能攻击都须要有不同的表现。
    然后这个同学想了想,于是加了一个BOOL来记录这次攻击是否产生爆击,于是非常快又把代码写好了。策划又提一个需求,攻击的时候还有命中。

    于是又加了一个BOOL来记录命中。假设还有BUFF效果,这就坑爹了!


    真的是大部分刚招进来的同学都是这么干的,一个模块万多个BOOL,关键非常气人的是这些BOOL还用一个INT8的方式一个一个地发往client。


    解决方式:

    用状态位来记录NPC的状态。一个8位的整数就可以记录8种状态。16位。32位就能够记录很多其它的状态

    //伪代码
    #define STATE_ATTACK 1 //普通攻击
    #define STATE_SKILL 2 //技能攻击
    #define STATE_DODGE 3  //爆击
    #define STATE_HIT 4  //命中
     
    INT8 state = 0; //默认无不论什么状态
     
    state = bitAdd(state,STATE_ATTACK); //发起普通攻击
    state = bitAdd(state,STATE_HIT);  //命中目标
    state = bitAdd(state,STATE_DODGE); //产生爆击
     
    if(bitCheck(state,STATE_HIT) == 0) //假设未命中目标
    {
    }

    位运算 与 类似枚举 的操作,基本的差别在于位运算能够用一个变量来记录多种状态共同存在的情况。


    位运算在游戏开发领域是用到的非常多的,比方在游戏中的奖励系统,游戏中有非常多种奖励,每日登录。排位赛。竞技场。公会奖励。在线奖励,签到奖励等,策划须要每一种奖励能够领取的时候,client在对应的功能button都须要光效表现来引起玩家注意。让玩家知道某某奖励如今是能够领取的。

    我看到非常多开发者都是client把全部系统的数据都拿到了,然后再依据数据的对应情况来决定是否让这个button开启光效。事实上我们仅仅须要用一个整数,在server端算好每一种奖励能否够被领取,client收到这个数据后,依据每个状态的情况来开启对应的光效,让玩家点击进入对应的系统的时候,才去拿对应的数据。

    位运算经常使用的是状态位、权限位、自己定义加密 

    &位运算符号的应用

    • 清零 
    清零:高速对某一段数据单元的数据清零,即将其所有的二进制位为0。比如整型数a=321对其所有数据清零的操作为a=a&0x0。

    (321=0000 0001 0100 0001) &0=0000 0000 0000 0000= 0000 0000 0000 0000

    • 获取一个数据的指定位 
    比如获得整型数a=321的低八位数据的操作为a=a&0xFF。(321=0000 0001 0100 0001) & (0xFF = 0000 0000 1111 11111)
    = 0000 0000 0100 0001
    获得整型数a=321的高八位数据的操作为a=a&0xFF00。

    (321=0000 0001 0100 0001) & (0XFF00=1111 1111 0000 0000)
    = 0000 0001 0000 0000

    • 保留数据区的特定位  
    比如获得整型数a=321的第7-8位(从0開始)位的数据操作为: a=a&110000000
    (321=0000 0001 0100 0001) & (384=0000 0001 1000 0000)=0000 0001 0000 0000

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    iOS开发>学无止境
    iOS开发>学无止境
    lua学习笔记——逻辑运算符和三目运算符
    lua学习笔记——变量的声明
    lua学习笔记——冒泡排序(if else 和for循环的使用)
    lua学习笔记——表的继承()
    lua学习笔记——面向对象
    lua学习笔记——携程
    lua学习笔记-全局变量与局部变量(require与dofile的区别)
    lua与unity 的交互
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4889186.html
Copyright © 2011-2022 走看看