前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >优化骚操作!使用二进制模型,仅靠0和1保存数据

优化骚操作!使用二进制模型,仅靠0和1保存数据

原创
作者头像
深雾
修改2020-07-06 10:16:42
5420
修改2020-07-06 10:16:42
举报
文章被收录于专栏:工具类工具类

前言

需要在属性表配置用户环境变量的字段,为了节省内存空间,主管让我用一个字段记录多个数据状态,开始用表结构,但客户端不支持,就想到二进制数值保存数据

测试效果

先简单测试了下使用效果,数据很直观,代码如下图:

活动奖励储存:以前的用法是rewardlist表储存已领取奖励列表也很方便,用数值的话更省空间

示例:奖励列表有7个id。表结构{1,2,4,6},对应二进制数字0101011(43)

打印方法

代码语言:lua
复制
--10进制转二进制。n需要转的数,m几位数,二进制只有8位,改造了下
function byte2bin(n,m)
    local t = {}
    if not m then
        m = 8
    end
    for i=m-1,0,-1 do
        t[#t+1] = math.floor(n / 2^i)
        n = n % 2^i
    end
    return table.concat(t)
end

项目使用

配置表用户设置默认值,现在改成默认0

统一格式使用数值类型,转成二进制数记录修改后格式如下图

代码语言:lua
复制
{ "userset"				,"int(11)"		,0
--0默认开放 是否播放bgm--是否允许好友申请--是否预设聊天内容--是否播放bgm
,"用户个性设置" },

功能接口

代码语言:lua
复制
--用户个性设置修改
function Player:ChangeUserSetting(type)
	if 	self.cache.userset & (1<<(type - 1)) ~= 0 then
		--已设置为1
		self.cache.userset = self.cache.userset &~(1<<type-1)
	else
		self.cache.userset = self.cache.userset | (1<<(type - 1))
	end
	--个性设置
	self.prop.userset = self.cache.userset
	return true
end

因为只有简单的开关设置,所以设置时候1的类型改为0,0的类型改1

测试结果

初始userset属性为0默认打开,调用四次Player:ChangeUserSetting(type=1,2,3,4)方法后为15(1111)四个设置关掉

再调用一次Player:ChangeUserSetting(type = 4)关掉,打印结果7 = 15-8测试开关没有问题

嵌入功能

我们只需获取所需位数的值

代码语言:lua
复制
--获取二进制数据索引值(从1右到左)
function lua_util.getbyte2index(x,index)
	return (x>>index-1) & 1
end

这里是判定好友申请设置,如果不为0则不接受申请好友

代码语言:lua
复制
--申请添加好友
function Friend:ApplyFriend(dbid)
	local target = server.playerCenter:DoGetPlayerByDBID(dbid)
	local targerdata = target.cache.friend_data
	if lua_util.getbyte2index(target.prop.userset,settype) ~= 0 then
		server.chatCenter:sendTipMsg(1712,self.player.cache.dbid)
		return false
	end
    --(……省略)
end

类型控制

代码语言:javascript
复制
UserSetConfig.SettingType = {
    isOpenBgm = 1, --是否播放bgm
    isApplyFriend = 2, --是否允许申请好友
    isdefalutChat = 3,--是否默认聊天框
    test = 4,--
}
local settype = UserSetConfig.SettingType.isApplyFriend

二进制骚操作也很多,学习还是有用的

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 测试效果
  • 项目使用
    • 功能接口
      • 测试结果
        • 嵌入功能
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档