`
fsplove520
  • 浏览: 27825 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
文章列表

Iterable 转 stream

    博客分类:
  • java
     java8 发布好几个月了,在java8中,针对集合,加入了很多新特性,其中就是加入了N多fp接口,但是要是用集合的fp接口,都必须转成Stream,即所谓的集合的流操作。也是API提供的大集合高性能的操作的API。      针对普通的List确是很容易转Stream,因为类本身就提供这么个接口,但是Iterable 这个东东里,确没提供直接转Stream的接口,可是这个玩意再程序中确是输入经常使用的东东,那么如何直接通过Iterable生成Stream供我们使用呢?这确实让我周折了一番。通过翻阅提供的文档。看源代码。原来有一个叫做StreamSupport 东东供我们使用,看到这个 ...

堆排序

    堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。既然是堆排序,自然需要先建立一个堆,而建堆的核心内容是调整堆,使二叉树满足堆的定义(每个节点的值都不大于其父节点的值)。调堆的过程应该从最后一个非叶子节点开始 堆排序包括两个步骤   (a)初始堆(堆的定义:(1)堆是一个完全二叉树(2)根结点的值或者大于左右子树的值或者小于左右子树的值(3)左右子树也是一个堆)   (b)调整堆(当初始小顶堆之后,堆顶元素是 ...

归并排序

    归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。时间复杂度 O(N*logN),下面是实现 /** * * 数组合并 将有二个有序数列a[first...mid]和a[mid...last]合并。 * @param a * @param first * @param mid * @param last * @param temp */ public static void mergerarray(int a[], int first, int mid, int last, int temp[]) { int i = fir ...
排队系统,主要是处理大量玩家涌入游戏世界,导致游戏服务器卡顿,不流畅等问题。在开发期间,我们对服务器做压力测试的时候,会确定一个服务器承载峰值。当我们的游戏世界里玩家达到峰值时,后面的玩家就需要进行排 ...

有限状态机FSM

    博客分类:
  • AI
在很久很久以前,受限于计算机性能和图形效果,游戏往往是以玩家为唯一主动对象的,玩家发出动作,游戏响应结果。除此之外,不需要系统在玩家没有发出动作时产生响应。可以说,玩家的动作与游戏是“同步”的。 随着计算机的处理能力的发展,更绚丽的游戏逐渐产生。玩家就不能只满足盯着屏幕上静态的一张张图片进行游戏。也就是说,游戏应该有自己的方式能够与玩家主动沟通。这样才能使游戏更加生动,虚拟的环境显得更加真实。游戏上非玩家角色(NPC)应该有着自己独立的动作。 像星际争霸这类RTS游戏推动了游戏AI产业的发展。游戏AI的编写方法也逐渐规范。 最早,游戏AI往往是这样写的: switch(自己){ case & ...

选择排序

选择排序和冒泡排序差不多,只是冒泡排序在发现比它小的时候就交换,而选择排序是只有在确定了最小的数据之后,才会发生交换。选择排序的基本思想:第i趟简单选择排序是指通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换。先临时记录其位置,只有在一趟循环完以后确定了最小的数据,才会发生交换。 即进行比较操作的时间复杂度为O(n2) 和冒泡排序交换相连数据不一样的是,选择排序只有在确定了最小的数据之后,才会发生交换。怎么交换呢?我们可以以下面一组数据作为测试:2, 1, 5, 4, 9 第一次排序:1, 2, 5, 4, 9 第二次排序: 1, 2, 5, 4, ...

JVM优化

  在游戏服务器优化中(java语言),JVM参数调优也是一项重要指标,如果VM参数设置不当,很容易造成FGC,导致服务器停顿,暂停工作。这是一个很严重的问题,因为客户端会明显感觉到卡顿。   要对VM参数设置,首先要了解VM中内存模型。在JVM中内存分成三个代,新生代,老年代,永久代。新生代就是那种在系统中各种new产生的全局,临时对象等。在新生代中,正常来说,90%的对象的内存会被回收掉,如果在一次垃圾回收中,对象内存没有被释放,将会移到老年代,等老年代中对象所占内存接近或超过你设置的触发垃圾回收时,就会产生一次FGC。对于永久代内存也会回收,但很少回收,它用于存储已被虚拟机加载的类信息、常 ...
  如果你正在使用mongodb,那么你可能出现下面这种情况。     某公司在项目中添加了新的WEB机器结点后,发现其MongoDB集群的性能开始受到影响,表现在请求的高峰时期,MongoDB的响应时间变得非常长。通过监控发现,在其高峰时间MongoDB的连接数达到了1100~1500左右,由于每个连接需要使用10M(stack size默认为10240)的内存,这导致相当大的内存开销。 解决方案   首先通过优化连接池,将连接数控制在了800个左右,然后通过修改内核的stack size值,从默认的10M修改到1M,使连接占用的内存大大减少 Mongodb 系统参数配置(以下操作都 ...

Mongodb 索引优化

MongoDB 索引数据类型优化,节省60%内存       mongostat 查看mongodb 查询情况(是否有全表查询) 如果有全表查询,表示索引已经超出内存限制了(没有keep all index in RAM)。可以通过始减小索引大小来解决一些问题。通过测试得出了如下的数据,不同的数据类型的索引大小有2到3掊的差距。虽然能够想像得到,但是直观的数据图可能让我们更深刻的认识到。他们的测试再一次告诉我们:给索引定一个好的数据结构是多么重要。 通过测试,int、MongoDB的ObjectID、base64和md5的字符串做索引产生的索引占内存大小如下:  一、索引基础: ...
   目前,我们的游戏逻辑服务器大多是采用多线程单进程的方式设计的。因为我们的游戏是手游,或者页游,在指标要求上,这种架构基本能满足我们的要求,而不需要非得去设计一个很复杂的架构。   最近稍微空闲点下来了 ...

行为树BT

    博客分类:
  • AI
   行为树常被用来实现游戏中的AI。每次执行AI ,都会从根节点遍历整个树,父节点执行子节点,子节点执行完后将结果返回父节点。下面是基本的四个节点: 1 、顺序节点(Sequence):属于组合节点,顺序执行子节点,只要碰到一个子节点返回false,则返回false,否则返回true,类似于程序中的逻辑与。 2 、选择节点(Selector):属于组合节点,顺序执行子节点,只要碰到一个子节点返回true,则返回true,否则返回false,类似于程序中的逻辑或。 3 、条件节点(Condition):属于叶子节点,判断条件是否成立。 4 、执行节点(Action):属于叶子节点,执行动作, ...

快速排序

快速排序的算法思想:选定一个枢纽元素,对待排序序列进行分割,分割之后的序列一个部分小于枢纽元素,一个部分大于枢纽元素,再对这两个分割好的子序列进行上述的过程。平均效率O(nlogn),适用于排序大列表。 此算法的总时间取决于枢纽值的位置;选择第一个元素作为枢纽,可能导致O(n²)的最糟用例效率。若数基本有序,效率反而最差。选项中间值作为枢纽,效率是O(nlogn)。 基于分治法,分而治之的原理 实现代码如下 void swap(int a,int b){int t;t =a ;a =b ;b =t ;} int Partition(int [] arr,int low,i ...
java8已经发布很久了,但是在实际生产应用中,估计很大一部分都还停留在java6和java7上,java8中加入了很多新的特性,其中函数接口就在其中一个很重要的新特性,让我们在Java中也能进行fp模式编程。 1、首先我们要定义函数接口 @FunctionalInterface public interface Function<T, K> { K func(T t); } 我们要注意的是,如果你要定义的是函数接口,那么接口里只能有一个未实现的方法,多余一个,IDE将会给出错误提示。另外@FunctionalInterface这个注解是可以省略的,如果接口中只有 ...
   最近,在为我的游戏服务器进行性能优化,而我在性能优化的过程中,首先是减少程序中锁的使用,一眼过去,发现消息队列是线程之前争锁之常地。虽然我们使用的是并发包里,性能高的并发队列(服务器是用java语言),虽然并发包在锁的设计上到了最优,采用细粒度加速,但是不可否认,在生成线程和消费线程之间的锁争用总是会消耗一定性能,降低效率。    说干就干,动手设计一个更高性能的消息队列。可是该如何动手呢?这时,我想起了N年前工厂上的生产线了,生成某个产品C是由原料进过生产线A和生成线B后生成的。生产线A专门组装C产品的A部分,生产线B专门装配C产品的B部分,同时B生产线的原料是A生成的半成品+其他来料。 ...
众所周知,node.js架构采用的是异步,事件模式机制,来提高服务器性能,那么你了解node.js的事件模式是怎么去设计的吗? 接下来将带你初步了解node.js事件机制和在你的程序中编写事件: 首先应该先了解EventEmitter模型。它可以发 ...
Global site tag (gtag.js) - Google Analytics