智能预判 (三:布局加强)

线程启动项目 修改 在 AppServer 类中,方便管理。

同时增加心跳,用来同步 数据并 定时批量存储数据库。

        protected override void OnStarted()
        {
            ThreadPoolMain.OnStartThreadPool();
            OnTimeServer();
            base.OnStarted();
        }

        //规定时间 检查一次心跳
        public void theout(object source, System.Timers.ElapsedEventArgs e)
        {
           if(ServerModel.getInstance().queue.Count>0)
           {
               JsonData[] mes = ServerModel.getInstance().queue.Dequeue();
               //拿到数据,批处理 算出 效益,并存放数据库
              // Console.WriteLine("检测有没有发送过来 目前用户" + this.SessionCount);
           }
        } 

        //定时器 作用, 同步 存储数据库 计算收益
        void OnTimeServer()
        {
            System.Timers.Timer t = new System.Timers.Timer(2000);//实例化Timer类,设置间隔时间为10000毫秒;
            t.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到达时间的时候执行事件;
            t.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
            t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
        } 

线程管理类 负责 推送给 定时器,同时定义数组JsonData[] obj

负责临时存放 事物,分配给各类线程处理。

        public bool QueueWorkItem(ManualResetEvent eventX, int task)
        {
            //   Console.WriteLine("线程池开始分配任务");
            //定义数组
            JsonData[] obj = new JsonData[task];

            ThreadProcClass t = new ThreadProcClass(task, eventX, obj);
            for (int i = 0; i < task; i++)
            {
                DataTable dt = ServerModel.getInstance().dt;
                // Console.WriteLine(dt.Rows[i]["id"].ToString() + " == 第1种写法 " + dt.Rows[i]["time"].ToString());//行集合.行【号】列【名】 

                JsonData json = new JsonData();
                json["task"] = i.ToString();
                json["id"] = dt.Rows[i]["id"].ToString();
                json["time"] = dt.Rows[i]["time"].ToString();
                json["attack"] = dt.Rows[i]["attack"].ToString();
                json["beaten"] = dt.Rows[i]["beaten"].ToString();
                json["soldier"] = dt.Rows[i]["soldier"].ToString();

                ThreadPool.QueueUserWorkItem(new WaitCallback(t.ThreadProc), new SomeState(json));
            }
            //等待事件的完成,即线程调用ManualResetEvent.Set()方法
            //eventX.WaitOne  阻止当前线程,直到当前 WaitHandle 收到信号为止。
            eventX.WaitOne(Timeout.Infinite, true);
            Console.WriteLine("任务结束,数据存放到 list中");
            Console.WriteLine("通知 定时器");
            // 存放到 queue 中
            ServerModel.getInstance().queue.Enqueue(obj);

            return true;
        }

线程中,负责 物理模拟,同时把数据放到传参过来的objs[]中

objs[task] = json;//保持数组

本周就先到这里。

时间: 2024-10-11 17:36:21

智能预判 (三:布局加强)的相关文章

智能预判 (五 客户端战斗 模拟)

用 LICEcap 录制 ,发现 帧数 好低啊..其实 demo运行 都在100帧以上的. 好了,不纠结上面的 帧数问题. 这个战斗系统,模拟了 对战的过程,其中包含,打人和被打. 打人,可以让对方 少血,同时打人的前提是 蓄力.蓝色部分.打中人物 还可以让他 速度有影响,这里暂时没做. 被打,被打 就 很 精彩了,不仅后退,死亡也能后退. 射程,不解释. 速度,也不需要解释,这里注意的一点就是,速度是 慢慢加起来的,可以做 蓄力冲刺的 视觉效果. 就这样吧,搞了5天. 但是,最最精彩的,绝对不

智能预判 (二:最初的布局)

不太会画图,先简单看下 程序流程,他比 其他 服务器 多了 一个 单独的 线程 内部数据库 物理运算,也就是  他的运算 不需要 客户端  时时给信息. 下面是 片段代码. var bootstrap = BootstrapFactory.CreateBootstrap(); if (!bootstrap.Initialize()) { Console.WriteLine("无法初始化"); Console.ReadKey(); return; } var result = boots

智能预判 (一:线程的开启)

单线程模式,在大数据量 运算下,肯定效率 没有  多线程快,所以,在设计初期,我就定下了 多线程方案. 下面是 计划 多线程方案的  几个备选方式. 一:单人 多线程 异步并发方案. 己方人物碰撞检测 敌方 一条线程. 敌方人物碰撞检测 己方 一条线程. 己方 子弹 碰撞检测 敌方 一条线程. 敌方 子弹 碰撞检测 己方 一条线程. 人物移动 一条线程. 人物血量增减一条线程. 优点:碰撞检测效率快. 缺点:刷新不同步. 二:单人单线程 同步并发方案. 优点:速度相对快. 缺点:数据检索比较麻烦

智能预判 (六: 服务端战斗 模拟)

服务端 模拟,是指,和 客户端 做法一样,给出人物属性,按照序列帧,开始执行计算.但服务端 运行速度 远远大于客户端. 这里的最关键做法,要注意2点!!! 1: 战斗过程,必须是同步计算,千万不能有 一个 异步处理!!!! 好多u3d的朋友,喜欢用 事件,喜欢用协成.这里注意了,别用哦,虽然处理流程 起来会 比较麻烦. 2:后台 必须设计 一套 和 客户端一样的 程序流程.看下我的 片段代码. 这个是后台,但里面的start update 和 客户端 流程 一模一样!!! 当然 更多细节 还不止

预加载与智能预加载(iOS)

来源:Draveness(@Draveness) 链接:http://www.jianshu.com/p/1519a5302141 前两次的分享分别介绍了 ASDK 对于渲染的优化以及 ASDK 中使用的另一种布局模型:这两个新机制的引入分别解决了 iOS 在主线程渲染视图以及 Auto Layout 的性能问题,而这一次讨论的主要内容是 ASDK 如何预先请求服务器数据,达到看似无限滚动列表的效果的. 这篇文章是 ASDK 系列中的最后一篇,文章会介绍 iOS 中几种预加载的方案,以及 ASD

Android 性能优化 三 布局优化ViewStub标签的使用

小黑与小白的故事,通过虚拟这两个人物进行一问一答的形式来共同学习ViewStub的使用 小白:Hi,小黑,ViewStub是什么?听说可以用来进行布局优化. 小黑:ViewStub 是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件.(更多详细的API等信息可以查看官方文档ViewStub),计算机行业一向是实践里面出真知,下面用一个例子演示下效果. 小黑:说说概念只是为了概括性的了解下,还是用个实例来演示下.先来创建一个Activity中使用的布局文件,文件名是:act

正则表达式的预判

如果要创建一个密码强度为: 6-8位,字母,数字的组合.要求至少包含一个大写字母和一位数字的正则 如下步骤: 1. 预判不全由字母组成: 说明可能包含数字或特殊符号 (?![A-Za-z]+$) 2. 预判不全由小写字母和数字组成: 说明可能包含大写字母或特殊符号 (?![a-z0-9]+$) 3. [A-Za-z0-9]{6,8} 最终结果为: (?![A-Za-z]+$)(?![a-z0-9]+$)[A-Za-z0-9]{6,8}

正则中的预判

预判:在正式匹配正则表达式之前,先预读整个字符串,进行初步匹配,如果预判都未通过,则不再验证! 1)(?=表达式): 先浏览字符串是否满足表达式的要求 何时使用:只要正则中出现类似"而且" 比如:4位数字,但不能包含4和7 (?=[^47]$) 是否由除了4,7之外的字符组成 2)(?!表达式):先检查字符串是否不满足表达式要求 比如:6位以上密码. 字母,数字组成 首字母不能是数字: [a-zA-Z][a-zA-Z0-9]{5,} 必须至少包含1个大写字母 不能都由小写字母和数字组成

支付宝防并发方案之&quot;一锁二判三更新&quot;

每年支付宝在双11和双12的活动中,都展示了绝佳的技术能力.这个能力不但体现在处理高TPS量的访问,更体现在几乎不会出错,不会出现重复支付的情况,那这个是怎么做到的呢? 诚然,为了实现在高并发下仍不会出错的技术目标,支付宝下了很多功夫,比如幂等性的处理,分布式事务的使用等等,但是个人觉得其中最关键的一点就是"一锁二判三更新"这句看似毫不起眼的口诀. 何为"一锁二判三更新"? 简单来说就是当任何一个并发请求过来的时候 1. 我们先锁定关联单据 2. 然后判断关联单据状