DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: sprblck
今日帖子: 10
在线用户: 13
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 delphibox777 (GyneCologist) ▲▲△△△ -
普通会员
2021/7/17 10:49:35
标题:
有偿咨询游戏内高效率寄售系统的实现方法 浏览:2546
加入我的收藏
楼主: 现在越来越多的游戏都出了寄售系统,但是好像用Delphi写的很少。我能找到的用Delphi 写寄售系统的游戏也就传奇了,很多用的还是delphi7. 但是这些老代码不太好用:
     代码类型1: 用SQL 做数据库,数据库和游戏服务端一直连接互动,但是由于传奇物品数据的复杂性,导致一旦数据库比较大(比如20万行),整个系统就很卡很慢。用ACCESS做数据库的也是半斤八两。

     代码类型2:自制的数据库,游戏在启动时就将数据库的数据存于stringlist, 每次取数据时就从内存里拿数据,优点就是速度快很多(即使是数据库比较大,但是特别大了也是力不从心了),另外个缺点就是stringlist 的排序实在是慢。

目前大部分传奇老代码都是以上类似的逻辑,但是实在不能满足我的要求,我要求的是大量的寄售数据能够在满足快速提取的同时,也能快速地进行各种类型的排序(价格,时间,人名等等),还要CPU和内存的使用率不能高。虽然网上一些C#的代码看起来不错,但是实在不喜欢那个语言, 所以在此有偿求思路,方法。如果你熟悉寄售并有解决想法的请留下联系方式,谢谢!
----------------------------------------------
-
作者:
男 tulater (tulater) ★☆☆☆☆ -
普通会员
2021/7/17 16:53:37
1楼: Sqlite
----------------------------------------------
http://www.cnblogs.com/tulater/
作者:
男 glwang (glwang) ★☆☆☆☆ -
盒子活跃会员
2021/7/17 21:25:58
2楼: 去成都找这位大佬:PassByYou888 
https://github.com/PassByYou888/ZDB2.0
https://github.com/PassByYou888/zGameWare
----------------------------------------------
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2021/7/17 23:01:09
3楼: 1、可以试试 sqlite 或者 firebird,delphi 支持都非常原生,特别 firebird 对 sql 标准支持的不错
2、具体慢在哪了?用 aqtime 之类的排查一下性能瓶颈;对于 db 不能满足的部分,自己 protocol buffers 流化对象到一个 blob 二进制字段中
----------------------------------------------
-
作者:
男 scarlette (Scarlette) ★☆☆☆☆ -
普通会员
2021/7/18 1:37:07
4楼: 呃……这种系统哪里会用数据库实时查询的方案啊,都是直接扔到内存里面。

实际系统怎么可能用StringList这种破玩意儿,东西的数据都是一大堆结构体,扔在一个池里面,容器内只保存指向结构体的指针,排序时Sort这堆指针就行了。

而且如果是用户请求非常频繁的系统,通常还采用影子预排序的做法,就是用户最高频的几种查询,系统每隔一段时间(比如半秒)生成一个排好序的指针容器副本,用户来查询的时候直接把副本扔给用户就可以了。
----------------------------------------------
-
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2021/7/18 3:30:21
5楼: 陈天桥啥也不会,为啥轻轻松松就成了首富呢?都说“没有人可以随随便便成功”,本来我是信的,可是一想到陈天桥就觉得也有反例,而且还是当时全中国的首富,而且只有31岁。
----------------------------------------------
只有偏执狂才能生存!
作者:
男 kadin_lee (一路岁运) ▲▲▲▲▲ -
普通会员
2021/7/18 11:59:46
6楼: 我自己多年开发这种游戏业务,比较熟悉。 很多项目都是直接数据库sql语句返回的,有很多人说sqlite ,请一定放弃使用sqlite。 因为游戏 不单单只是功能实现 还包括数据分析以及运营管理。(这些人员一般会使用python java 或者 php 来做 且分布部署在多台机器上)所以数据库 一般都是 mysql 或者 sqlserver 这些网络数据库 而不是单机数据库。 最理想的做法是 host(delphi 或者 C++ ) 导出数据库操作接口。在lua中去写这个业务功能。方便热重载,提高开发效率 可以随时应对策划的变更需求。如果写在 delphi 或者 C++ 层 测试以及部署 更新都很麻烦。
----------------------------------------------
用DELPHI 开发游戏!
作者:
男 delphibox777 (GyneCologist) ▲▲△△△ -
普通会员
2021/7/18 15:01:04
7楼: @scarlette
   一般的预排序可以做到,可是现在的玩家买东西用的最多的就是模糊搜索的功能了-通过输入关键字找到自己想要的东西。 物品的名称这么多,关键字也是五花八门,根本无法实现预排序。说白了,我想要实现的就是在大量玩家频繁使用模糊搜索时系统也能保持快速和有效,CPU和内存使用率也要控制在低水平。
----------------------------------------------
-
作者:
男 delphibox777 (GyneCologist) ▲▲△△△ -
普通会员
2021/7/18 15:12:52
8楼: 我想说的是楼上几位说用SQLLITE这些实时对接数据库的都是在数据库小的时候才算好的解决方法,数据库一大那就是灾难。现在市面上就有几个引擎用的SQLLITE的数据库,我特地去测试了一下,当数据达到几十万行之后,每翻个页CPU和内存要暴涨一下,每次暴涨都会引起游戏的卡顿。现在用DELPHI做游戏寄售最好的估计还是盛大了,四十来万的数据我看它的服务器都不设定搜索间隔的,模糊搜索时也是几十毫秒内就能摘出4、5万行的搜索结果,而且是及时刷新更新信息的。它家的机器难道是特制的?实在想不通啊。
----------------------------------------------
-
作者:
男 glwang (glwang) ★☆☆☆☆ -
盒子活跃会员
2021/7/19 7:23:10
9楼: 盛大的机器不是特制的,但是国内顶级的Delphi高手大多都在盛大
----------------------------------------------
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2021/7/19 10:12:39
10楼: 不可能用StringList的,这种一定是自定义数据结构和算法的。
持久化是使用数据库的,而游戏加载的时候从数据库读到内存的自定义数据结构,平时都从内存访问,当有改动的时候自动同步到数据库。
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 delphibox777 (GyneCologist) ▲▲△△△ -
普通会员
2021/7/19 11:13:25
11楼: @wr960204
   你说的我都明白,不过我在上面重点提到了搜索这个功能,难道DELPHI现在有法子能直接读取搜索结果了? TLIST等都不需要过渡一下?
----------------------------------------------
-
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2021/7/19 12:58:12
12楼: 虽然不熟悉,但个人觉得:正确理解数据库(索引)和SQL特点,能满足绝大多数需求。。偶是DBA
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 xmcccc (xmcccc) ★☆☆☆☆ -
盒子活跃会员
2021/7/19 13:07:45
13楼: 1 种使用数据库,然后全部内存加载,排序,模糊查找自己写算法,因为全在内存,速度是非常快的。还有就是做好物品分类。数据添加,删除等操作,可以不急于落地,关闭程序时落地或者间隔一定时间落地。
2 使用redis缓存
----------------------------------------------
-
作者:
男 delphibox777 (GyneCologist) ▲▲△△△ -
普通会员
2021/7/19 18:07:31
14楼: 我突然觉得我的帖子应该改成 “有偿求DELPHI快速模糊搜索靠谱方法”,如果是类似于使用遍历外加'AnsiContainText'功能的就算了,这种方法是我见过效率和速度都很不理想的方法。
----------------------------------------------
-
作者:
男 cgzcgb (cgzcgb) ★☆☆☆☆ -
普通会员
2021/7/20 8:56:35
15楼: 楼主不要再研究怎么造轮子才能让车跑的快,直接引进跑车(Elasticsearch)岂不更好,高效安全便捷。
----------------------------------------------
-
作者:
男 siow (siow) ★☆☆☆☆ -
盒子活跃会员
2021/7/20 12:41:41
16楼: 数据库的话,考虑下redis,或是直接用HashMap或HashTable这跟据需求来就行了,几百万数据都不是事
----------------------------------------------
-
作者:
男 siow (siow) ★☆☆☆☆ -
盒子活跃会员
2021/7/20 12:43:24
17楼: 关系数据库做好索引优化,问题应该也不大,主要还是得花点时间优化
----------------------------------------------
-
作者:
男 sspeak (sspeak) ★☆☆☆☆ -
盒子活跃会员
2021/7/26 17:04:22
18楼: 模糊搜索很简单啊 sql不是有个like吗? xx like 'ab' and xx like 'cd',只要做了索引 很快的
----------------------------------------------
-
作者:
男 sspeak (sspeak) ★☆☆☆☆ -
盒子活跃会员
2021/7/26 17:06:29
19楼: 不需要再自己做内存缓冲 这部分应该是数据库的事 数据库引擎自己就有内存缓存 做2级缓存有必要吗?
----------------------------------------------
-
作者:
男 ddrfan (若苗瞬) ▲▲▲▲▲ -
普通会员
2021/7/29 11:21:56
20楼: 楼主最开始没有提模糊搜索,所以我想只是数据库各个字段设置索引就OK了。
当然加载入内存也可以,可以用多个hashmap嘛,需要查的内容做key。
楼主提到stringlist就离谱了,肯定不能用来做搜索。

后来楼主提到了模糊搜索,我试了下笔记本上的Oracle数据库,大概50万条记录,选了一个没有索引的字段“指令内容”,选出的是类似某个电话号码的指令。
具体SQL类似:select * from xxxtable where command like '%13966668888%';
大概1秒就可以出结果,我想如果更新频率不是很高的话,仅用数据库完全可以支撑的。

如果一定要放到内存中,那么所谓模糊搜索,一定是针对特定业务优化的,不是通用的。因为通用的字符串模糊匹配,就不能用hashmap类型了。
所谓业务优化嘛,就是多定义一些数据结构,比如关键字带“防具”就在防具里面搜,关键字带“史诗”就在史诗里面搜,根据业务过滤,减少了数据量,应该也会比较快。当然上面只是个基本的思路。。。

另外如果数据量特别大,比如几千万,上亿了,Oracle也不行了,就只能用大数据,我试过HBASE如果按主键查,就算上亿也是毫秒级别查出来。这个级别模糊查有点点困难,可以变相用前缀一类的查。如果很大数据量一定要类似“%关键字%”的模糊,额,我还不知道怎么办。。。
----------------------------------------------
Bye bye DDRFAN...
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行58.59375毫秒 RSS