QQ聊天软件,QQ游戏是cs结构的软件还是bs结构的软件?
c/s是客户端/服务器
b/s是浏览器/服务器
c/s的一般适合于软件开发,对客户端的计算机配置要求比较高
客户端也需要安装软件,典型事例:qq
b/s的一般适合于网站开发,客户端只要安装浏览器就可以完成操作
客户端基本上不需要加载什么,但是对于服务器端的配置要求比较高
典型事例:网站,erp系统。
现在网吧的服务项目主要是这几项:上网(网吧嘛,这是当然的了),游戏(可有很多地方都不让搞),再就是影视欣赏了(对于只能上网的网吧尤为重要)
虽然在网吧看**,每小时要花两块钱(看一部要花个三至四元),但它同影院、录像厅相比还是有很多优势的:
1,即点即播,这是人们长久以来的梦想,今天已经由网吧实现了,它和家庭租几个vcd片子看有着根本的区别。网吧的影视服务器能存储大量的影视剧供随时观赏,而且方便更换影片,实现真正的即点即播。
2,能够掌握最新的影片(当然这都要归功盗版了),而且比去影院要省钱的多(影院的新片一般要10元左右)
3,满足不喜欢被电视剧拖着的人的要求,几十集用个三四天就看完了,过瘾
4,看**的同时还能聊天,一举两得
5,分解窄带的压力,看**的越多,网吧互联网的利用率就越低,所以带宽的压力就越小,网速就越快,这对没有上宽带的网吧尤为重要。
6,这一点就是还有很多其它的优点^!^。
网吧的影视系统的应该达到的要求是:
在电脑的显著位置安放**项目(如在桌面上建立"影视欣赏"的快捷方式),客人打开后能看到所有**的目录,选择后打开**文件,系统自动调出播放系统,开始播放。
当然有人把这个系统做成网页式的,效果象是网上点播,但我不赞成这样做,因为这样作出的系统专业性很强,不易维护,每增加新的**都要在网页上做改动,网页本身和链接也容易出现错误,以至影响实际效果。最简易也是最实用的方式就是把**存储在电脑中,作成共享,所有的客户机安装播放软件通过网上邻居调用观看。
以下是网吧影片服务系统的相关设置(好简单啊)
0首先你的网络已经设置好了,能通过网上邻居实现互访,这是基础(如果你的客户机能上网了,这不是问题吧^!^)
1选择一台电脑(也可能是数台,比一台麻烦一些)做影视服务器,把你的**拷至硬盘,把**文件都设置为共享(通常是共享文件夹, 每个文件夹中放一定数量的**);
2在客户机安装播放软件, 建立影视服务器上**文件的快捷访问方式;
3已经ok了,就是这么简单,(晕,还没完吗?别告诉我你的声卡还没装^!^)
当然其中还有些学问,以让你的影视系统发挥出最佳的性能:
选择合适的播放软件
以下是我用过的几种播放软件:
windows mediapalyer+divx(mpeg的编码解码器),主要用来播放mpeg格式的**,它的优点是启动快速,占用系统资源小,缺点是很多格式不支持(致命)
大多网吧都在用realplayer,因为它是rm格式的专用播放软件,界面简单,容易作,real的 老版本的不支持其它格式的影片 ,新版本因为增加了多个插件,可支持的格式大量增加,包括mpeg格式的,但我使用中发现,某些版本的real播mpeg的时候,不能快进,一拖滚动条就出现假死机, 非要三键结束任务才能解决。
金山影霸iii支持的格式最全(包括音乐文件),而且安装不很占空间(完全安装小于四十兆),占用系统资源也较少。
东方影都支持的格式很多尤其是立体版能看立体**,效果真爽,但缺点不少,如安装比较占空间(完全安装要80兆),而且消耗系统资源比较厉害。
另外超级解霸2003据说不错,我没有用过,不敢妄下结论(但如果没有比2000有质的转变不用也罢),有兴趣的朋友可以试一下,和其它的软件比较比较。
根据我的经验我首推金影iii做网吧的播放软件(本人严正声明:本人绝没有收取金山公司的一分钱广告费^!^)
附:两种流行的压缩影像格式释疑, mpeg(对应文件扩展名为avi)其实是一种影音压缩技术,它是一种通过记录原始影音文件的信息,用一定的算法进行代码替换处理的有损压缩,播放时通过mpeg编码解码器解码。rm是我们最常见的压缩格式,它使用的另一种算法压缩比例更大(文件大小可压至mpeg的二分之一),故失真较大,效果不如mpeg格式。 注意事项
1,影视服务器最好不要和网络服务器作为一台,如果你的网吧够大,建议使用专用的影视服务器(如果不对外营业,配置可以很低,主频300即可;内存64m即可128m最好,多了就是浪费了;支持大硬盘的主板即可,但要稳定;硬盘当然要大,但5400转即可;如果要对外营业配置就要稍高一点的,建议使用赛扬二代的处理器),当然如果你的网吧很小15台以下,那就没有必要专设影视服务器了。
2,尽量安装rm格式的**,优点是占用硬盘空间小,传输速度快,一台影视服务器支持的终端多,缺点的效果没有mpg4和vcd的效果好,但只要光盘做的不是太差一般没有什么影响。
3,一定要为你的所有**共享并创建快捷方式,使其能在任何一台终端能看到所有的影视,如果你的**是分在几台电脑里放置的,应该先建立个文件夹,把其它电脑上**的文件的快捷方式放进来,然后把这个文件夹复制到每台终端的桌面上,换上漂亮的图标,取个类似“影视欣赏”的文件名就ok了。这种方法同样适合各种歌曲的使用,可用类似的方法建立个“音乐欣赏”。
4,网络设置:在微软网络客户中选择快速登录,这样启动过程中将不检测网络驱动器,加快启动速度;登录中选择windows登录,启动过程将不出现登录对话框,可以避免因登录时点取消而未登录网络的情况(这种情况下,客户机可以上网,但不能访问网上邻居)。
5,同一部片子能同时被数台电脑同时调用,一般不影响效果,但应该尽量避免这种情况的发生(对硬盘损耗较大),如果某个片子同时看的人实在太多,应事先多在硬盘中复制几份(尽量选择不同的分区)供调用。
6,一台**服务器可支持多少用户同时观看?中等的网吧(单影视服务器,客户机50台以下,使用10m的网络即可,当然百兆的网络就更好了)一台影视服务器可同时支持二十台左右的电脑同时播放rm**(mpeg或vcd就要少了)。事实上网吧中不可能所有的顾客都一起看**(通常在50%以下),所以这个数目可基本满足五十台以下的网吧了
实际环境举例(我的网吧):依拖一所大学,电脑三十六台,10m网络,单影视服务器(c2600, 128m , 240g/5400转,对外营业);把**按类型(如成龙全集,007全集,美国大片,贺岁片,某某电视剧,某某动画片等等)存放在不同的文件夹中,把这些文件夹共享出来,将影视服务器在各个电脑上建立快捷方式,将共享名改为影视欣赏;四个hub(三个16口,一个8口),采用堆叠; 在全满的时候通常是十五人左右同时看**,最高达到十九人同时观看(还有同时从影视服务器调音乐听的),运转正常,从未出现广播风暴。
建议:
1, 多做广告,有很多人以为“网吧就是上网的”,其实不然,我们可以把**这部分作大,让它成为我们营业的一个重要部分,扩大网吧的市场,达到这样目的的途经只有宣传。
2有条件的可以在宽敞位置的电脑安装双耳机(满足那些经济条件稍差一些顾客和特殊的顾客),经常有情侣上我这渡假的,内容就是一起看**。
3,观注当地影院,及时引进最新,最好的**(至于引进方式吗,如果您的经济条件允许的话,请支持一下正版。晕,我也学会这么说了,遗憾的是**方面我还没支持过^!^,我是那种经济条件不允许的^!^)
失败的例子(请引以为戒)
我到过一个网吧,有四十台电脑,都是20g的硬盘,每个硬盘里都装了不少的影片,但在他的任何电脑上都看不出来它有**在,必须访问网上邻居才知道,而且还不知道哪里有什么**,知道看**的还要问老板哪个**在哪台机器里,真是麻烦,优势一点也出发挥出来,大量的硬盘资源实际上是浪费了。 影片推荐:
有合适的影片是影视服务成功的关键之一,这种影片大概有两种:
好片(观众较多的片子,其实不一定就好):大家都爱看的辣笔小新(说实话,这个小孩玩意儿我也爱看^!^),情深深雨蒙蒙(这部连续剧给我带来很大的收益,虽然我一惯不欣赏琼瑶阿姨的作品,太过煽情,而且一看开头就知道结局,但却能让她设计出那么复杂的过程来,我还真是佩服她老人家的功力,当然因为她帮我拉了不少顾客,我现在对她存在只有感激),这两套片子在我这呈产生的效应用“轰动”两个字形容是一点也不过分的。
新片:另一种是抓住流行的,**院正放的,最好是**院要放还没放的 。如前一段时间的“同居密友,珍珠港,瘦身男女,少林足球,我的兄弟姐妹等”,我的“珍珠港”整比**院早放了一个月,反映不错,有不少人花四块钱看完了还直叫便宜。
影视播放中的故障解决及相关问题:
在网吧中有问题都是正常的,没有问题才不正常了,当然影视系统也不例外,但相比网络的问题,它的问题一般还是好解决的。
realplayer的声道问题,realplayer不能调节声道,这是这个软件的最大bug,升级了n次也没解决,不知道这些做软件的干什么去了,当然我们也有办法处理,就是调用系统的声音属性调节声道(稍麻烦了点)。方法是:调出声音属性(最快捷的方式是双击任务栏中的小喇叭图标)调节两个项目,如果你的菜单是中文的,这两项就是主音量和声波,如果是英文的就是volume和wave。声道主要是由volume控制的,声波则能优化声音性质,实际作一下,反复对比你就会知道这两项都是怎么回事了。补充最重要的一点,你的**必须是双声道的才能调节,如果做盘的把两个声道做到了一起,那怎么调就都白扯了。
播放中出现断续的问题, 放映过程中声音或图像出现断续,如果是网络因素,可能是影视服务器出现问题,局域网中的看**的电脑都会这样,现象会很明显,这时应处理影视服务器,如果只是单机这样请重新播放,最次重新启动就能解决。
声像不一的问题,某部片子看的过程中出现声音和图像不一致的问题,这是系统处理时,放音设备和影像设备未能协调,通常关闭当前播放任务再重新打开就能解决。
播放不出来的问题,任凭怎样双击就是打不开**文件,这是由于当前系统资源已无法调出播放程序,需要重新启动电脑才能解决(如果谁有更简便的解决办法别忘了告诉我啊^!^)
音量小的问题,如果你的声卡没有问题(有的声卡音量小,从软件方面不好解决,只能配有源音箱加大音量了), 除了将耳机音量和声音属性中的主音量放至最大外,调节声波属性也很关键,往往声波(wave)的设置不当可造成音量过小,请左右调节“均衡”,找出最佳效果。
好了,说了不少了,我还真有点累了,这些文字如果能给那些正处于迷茫状态的同仁带去些认识,我就最高兴不过了。如果你做出的影视系统切实的帮你提高了效益我就高兴的没法再更高兴了。当然,由于各人所处的具体环境不同,同时为避免理论与实际脱节,行文中我也尽量从实际出发,但出现些错误或不相容的结果也是不可避免的,欢迎大家指正并和我继续探讨网吧影视服务技术及经营上的问题!希望大家都有应有的收获!
补充两点
1,影视服务器的配置无需太高,我用过三种配置c400/64, c566/128, p3 733/256, 对客户机的观看效果并无太大的影响。
2 一台服务器支持的客户机,10m网,一台可支持20个终端播放rm格式,但如果是mpeg格式只能支持10个左右,这里说的是达到较好的播放效果,如果终端超过这个数目,实际上也能支持,但效果就要下降(会出现偶尔的停顿或声像不一等情况)
很多朋友说要做流媒体服务器,说实话,我不建议网吧这样,这样做,因为,网吧都没有很专业的技术员,而且所有的软件都是D版,所有维护很麻烦,虽然网上有破解版,但是效果都不好,不过大家可以学习一下 大多数人对Realplayerer已经是十分熟悉了,利用Realplayer在线看**、听音乐,你是不是自己也想拥有一个Realplayer服务器呢?利网络流媒体服务器端软件Real Server能轻松实现你的愿望,下面笔者就介绍何利用它在局域网中建一个流媒体服务器。
什么是Real Server
RealNetworks 流服务器端软件,用它可以在网上发布Real格式的Audio、Video文件,以流格式协议进行网上传输播放,不必担心rm文件被下载。 要实现网上流视频的点播与直播,在硬件之上需要安装一个服务器端软件,这个就是Real Server。
一、组建多媒体播放系统的组网环境
多媒体播放系统的组网环境要求由主从结构或者对等结构组网的若干台多媒体电脑,带声卡、音响、耳塞、麦克风等发声设备,并不受有盘网络和无盘网络的限制。而服务器操作系统要求Windows NT、Windows 2000Professional 、Win2000 Server,服务器要求指定有固定 IP 地址或者是 Intranet 的虚拟 IP地址,工作站端要求装Realplayer70以上的版本。
二、下载、安装Real Server90
1 如何下载
目前Real server已经有了90版,我们介绍的Real Server通过在线注册获得注册码可以免费使用一年,但在局域网内只允许25人同时使用。可在 RealNetworks 的网站下载 。 2 如何安装
下载完备以后直接双击下载的文件,就可以自解压安装了。安装 Real Server 的过程和一般的软件安装差不多,在自解压完成后弹出图1的对话框,要你填写授权码。这时打开刚才下载软件时填写的信箱,把信箱中收到的授权码用Winzip解压到一某个目录中,在图1的“License File Location”下面填写上解压后保存的目录与文件名,这步很重要,服务器端能否使用全靠它了。
点击“Next”,选择安装目录、接受协议后,弹出图2对话框。要求填写用户名(Usename)和密码(Password),因为安装的Realserver是一套影音服务器软件,有系统管理者(Administrator)的登录进行管理,在这里我们把username 和 password都设置为“test”。记住它,等一下安装成功启动“Helix Server Administrator”时要用它来登录。 再点“Next”弹出图3的对话框,上面的英文意思是:请键入一个端口号,这个端口将授权给PNA联接,这个联接地址以“PNA://”开头。下面的“7070”是安装默认的PNA联接端口号,不要改它,紧接着在后面的安装中要设置RTSP联接、HTTP联接、MMS联接的端口号,这些都不要改它,以默认的为好。 最后一步会弹出图4的对话框,在“Install Helix Server a NT servce”前面一定要打上勾。
完成安装后,桌面上自动生成两个图标,一个是Helix Server(流媒体服务),另一个是Helix Server Administrator(流媒体服务管理者)。这时系统虽然没有要求重新启动,但是根据本人的使用经验,最好在安装完成后启动一下计算机。
三、启动服务器
启动服务器之前,先确保局域网网络是否接通、每一台工作站是否安装有Realplayer媒体播放软件,最好用70以上的版本。 首先,点击服务器桌面上的Helix Server图标,启动Helix Server,程序是在DOS窗口中运行的,道次运行完成后不能自动关闭程序,要手动关闭,以后再启动运行完成后会自动关闭的。
四、启动管理器
服务器桌面上另一个名为Helix Server Administrator图标,是对整个播放系统进行服务管理的一个系统程序。我们点击它会弹出如图5的“输入网络密码”对话框,其中的“站点:js”中的js实际上是本服务器的计算机名,不同的计算机名有不同的“站点”。“领域:js AdminRealm” 是播放系统自建的网络域,下面就是要输入用户名与密码了。在前面我们进行系统安装时不是把用户名Username和Password都设置为“test”了吗?这时就可以把这个“test”填入用户名与密码中。
在图5中填写好密码点击“确定”后弹出启动IE浏览器如图6,图的左边共有五行黑字,也就是对播放系统进行全部管理的五项基本内容:ServerSetup(建立服务)、Security(安全性) 、Logging & Monitoring(登陆及管理)、Broadcasting(网络广播)、Content Management(内容管理), 这里的每一项的管理细节,大家可以多试试。我们先看看在服务器上对播放系统进行测试。
五、播放系统测试
点击管理项的第一项“ServerSetup”后下拉出一些细项目,点击其中的“Media Samples(媒体实例)”(如图6)
在图6的右边就可以看到一些媒体材料供播放测试用,我们随便选择一个例子来进行测试,例如我们双击“Play SMIL Sample 2 ”弹出Realplayer播放器窗口(如图7),开始时会在播放器的底部看到“正在联接”和“正在缓冲”并且在时间不断的跳动,这说明整个系统安装联接成功。随后Realplayer进行播放。在播放器的“位置”后可看到联接地址为rtsp://js:554/africag2/africasmi。
在这个地址中我们可以看到,播放系统是采用RTSP联接方式进行播放的,js是服务器的计算机名或IP地址,后面的“554”是端口号可省略,“/africag2/africasmi”是媒体文件保存的路径。
六、工作端的连接
在工作站中我们同样启动Realplayer,在播放器的“位置”后输入rtsp://js:554/africag2/africasmi,“回车”,当我们同样在播放器的底部看到“正在联接”和“正在缓冲”并且在时间不断的跳动时,那么整个系统才算大功告成,播放文件默认存入路径在Helix Server安装目录下的Content子目录,你可以将rm格试的影片存放该目录下,然后在客户机Realplayer中播放器的位置输入rtsp://js/影片名rm,你就可以慢慢的欣赏影片了。
聊天室服务器端逻辑
//Debugjava
import javautil;
public class Debug {
public static String p(String s) {
Systemoutprintln(s);
return s;
}
public static Object p(Object O) {
Systemoutprintln(OtoString());
return O;
}
public static Object[] p(Object[] O) {
Systemoutprint("[");
String s = "";
for (Object o : O) {
Systemoutprint(s);
Systemoutprint(otoString());
s = ",";
}
Systemoutprintln("]");
return O;
}
public static int p(int i) {
Systemoutprintln(i);
return i;
}
public static long p(long i) {
Systemoutprintln(i);
return i;
}
public static MapEntry p(MapEntry l) {
Systemoutprintln(l);
return l;
}
public static HashSet p(HashSet l) {
Systemoutprintln(l);
return l;
}
public static HashMap p(HashMap l) {
Systemoutprintln(l);
return l;
}
public static Map p(Map l) {
Systemoutprintln(l);
return l;
}
public static LinkedHashSet p(LinkedHashSet l) {
Systemoutprintln(l);
return l;
}
public static TreeSet p(TreeSet l) {
Systemoutprintln(l);
return l;
}
public static Set p(Set l) {
Systemoutprintln(l);
return l;
}
public static ArrayList p(ArrayList l) {
Systemoutprintln(l);
return l;
}
public static LinkedList p(LinkedList l) {
Systemoutprintln(l);
return l;
}
public static List p(List l) {
Systemoutprintln(l);
return l;
}
}
//Servicejava
import javaio;
import javanet;
import javautil;
public class Service extends Thread{
private Socket client=null;
private Server server=null;
public Service(Server server,Socket client){
thisserver=server;
thisclient=client;
}
public void run(){
try {
BufferedReader br=new BufferedReader(new InputStreamReader(clientgetInputStream()));
while(true){
String str=brreadLine();
List<Socket> li=servergetLi();
for(Socket c:li){
if(!cisClosed() && cisConnected()){
OutputStream os=cgetOutputStream();
oswrite((str+"\n")getBytes());
}else{
clientclose();
servergetLi()remove(client);
break;
}
}
}
}catch (IOException e) {
eprintStackTrace();
}
}
}
//Serverjava
import javautil;
import javaio;
import javanet;
public class Server {
private List<Socket> li=new ArrayList<Socket>();
private ServerSocket ss=null;
public List<Socket> getLi(){
return li;
}
public Server(int port){
try {
ss=new ServerSocket(port);
} catch (IOException e) {
eprintStackTrace();
}
}
public void start(){
while(true){
Socket s;
try {
s = ssaccept();
liadd(s);
new Service(this,s)start();
} catch (IOException e) {
eprintStackTrace();
}
}
}
public static void main(String[] args) {
new Server(8888)start();
}
}
17聊天室客户端逻辑
//Debugjava
import javautil;
public class Debug {
public static String p(String s) {
Systemoutprintln(s);
return s;
}
public static Object p(Object O) {
Systemoutprintln(OtoString());
return O;
}
public static Object[] p(Object[] O) {
Systemoutprint("[");
String s = "";
for (Object o : O) {
Systemoutprint(s);
Systemoutprint(otoString());
s = ",";
}
Systemoutprintln("]");
return O;
}
public static int p(int i) {
Systemoutprintln(i);
return i;
}
public static long p(long i) {
Systemoutprintln(i);
return i;
}
public static MapEntry p(MapEntry l) {
Systemoutprintln(l);
return l;
}
public static HashSet p(HashSet l) {
Systemoutprintln(l);
return l;
}
public static HashMap p(HashMap l) {
Systemoutprintln(l);
return l;
}
public static Map p(Map l) {
Systemoutprintln(l);
return l;
}
public static LinkedHashSet p(LinkedHashSet l) {
Systemoutprintln(l);
return l;
}
public static TreeSet p(TreeSet l) {
Systemoutprintln(l);
return l;
}
public static Set p(Set l) {
Systemoutprintln(l);
return l;
}
public static ArrayList p(ArrayList l) {
Systemoutprintln(l);
return l;
}
public static LinkedList p(LinkedList l) {
Systemoutprintln(l);
return l;
}
public static List p(List l) {
Systemoutprintln(l);
return l;
}
}
//GetMessagejava
import javaxswing;
import javaio;
import javanet;
public class GetMessage extends Thread{
private JTextArea context=null;
private Socket s=null;
public GetMessage(JTextArea context,Socket s){
thiscontext=context;
thiss=s;
}
public void run(){
try {
BufferedReader br=new BufferedReader(new InputStreamReader(sgetInputStream()));
while(true){
String str=brreadLine();
String c=contextgetText();
contextsetText(c+"\n"+str);
}
} catch (IOException e) {
eprintStackTrace();
}
}
}
//Clientjava
import javaxswing;
import javaawt;
import javaawtevent;
import javaio;
import javanet;
public class Client extends JFrame {
private String ip = "";
private int port = 0;
private Socket s = null;
private JTextArea context = new JTextArea(10, 10);
JScrollPane sp = new JScrollPane(context);
private JTextField say = new JTextField(10);
private Container c;
public Client(String ip, int port) {
c = thisgetContentPane();
csetLayout(new BorderLayout());
contextsetEditable(false);
cadd(sp);
JPanel p = new JPanel();
padd(BorderLayoutCENTER, say);
cadd(BorderLayoutSOUTH, p);
try {
s = new Socket(ip, port);
} catch (UnknownHostException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
sayaddActionListener(new ActionListener() {
private void send(String str) {
try {
OutputStream os = sgetOutputStream();
oswrite(strgetBytes());
} catch (IOException e) {
eprintStackTrace();
}
}
public void actionPerformed(ActionEvent arg0) {
String str = saygetText();
send(str + "\n");
saysetText("");
}
});
new GetMessage(context, s)start();
thissetSize(300, 300);
thissetVisible(true);
thissetResizable(false);
}
public static void main(String[] args) {
String strIP = null;
try {
strIP = InetAddressgetLocalHost()getHostAddress()toString();
} catch (UnknownHostException e) {
eprintStackTrace();
}
new Client(strIP, 8888); //"127001"
}
}
首先要知道游戏类型是什么,然后知道承载人数是多少,以及开发周期多少。需要根据这些来决定游戏架构和技术选型。
对于gameplay来说,本身就是个大循环,一定频率进行tick,接收来客户端或者其他服务器的rpc,处理逻辑,然后数据落地以及发送数据给客户端或者其他服务器,一般gameplay来说在同一个进程里都是同步的方式去编写,同步的实现大多数是单线程的,或者使用coroutine来实现actor这种模式。大部分游戏交互都是比较多,所以不论service和service之间的交互还是玩家和玩家之间的交互,如果考虑多线程的同步的问题,会非常复杂以及很容易做错,所以一个service内同一个时刻都是在一个线程中执行的。
针对mmo或者一些竞技类游戏往往有场景管理的概念,就是游戏AOI,比如一个玩家移动,需要告诉周围所有的玩家,复杂度在nn,如果减少这个n,就有了AOI算法,比如九宫格,十字链表等,如果刚开服的时候很多人挤到一个主城中,就算采用九宫格和十字链表等AOI等算法,往往同屏内玩家数量还是很大,客户端渲染的单位数量比服务器少一个数量级的,所以场景管理这里还可以有个分线的做法,玩家多的时候,不同线不可见,玩家少的时候进行合并。
如果做帧同步一些关键点为表现要和逻辑分离,随机算法和随机种子的一致性,数学库浮点换定点,三角函数采用泰勒展开或者查表法,需要保序的容器,timer不能基于钟表时间而需要帧timer,以及防作弊(一般都是投票法,或者服务器跑个验证端)
现在很多游戏在线更新bug甚至不停服更新慢慢变成一种强需求了,实现这种方式主要使用脚本热更新,热重启+逻辑内存以及ab服切换来实现。
0条评论