异或运算XOR的一些相关技巧

异或运算(XOR)特点: X xor X = 0 X xor 0 = X X xor Y = Y xor X (X xor Y) xor Z = X xor (Y xor Z) 利用异或可以巧妙地实现一些玩意,例如: 不用中间临时变量交换两个整数; XOR linked list:只用一个指针实现双向链表  

32位应用程序转64位应用程序

最近在折腾将系统升级成64位。 目前主要碰到两个问题: (1) 指针和整形转换的问题 (2)long,unsigned long在32位下为32位,在64位下为64位。 对于1,应该采用intptr_t或者uintptr_t。 我采用了luajit的声明(呵呵,作者的注释很有趣): #if defined(_MSC_VER) /* MSVC is stuck in the last century and doesn’t have C99’s stdint.h. */ typedef __int8 int8_t; typedef __int16 int16_t; typedef __int32 int32_t; typedef __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #ifdef _WIN64 typedef…

一个线程间同步问题

项目中的跨(区)服国战功能一直不稳定,之前一直没有上线。这段时间在排查这个问题。 其中有一个严重的隐患昨天才发现。抽象一下是这样的:A, B, C 三个线程,在处理网络消息时对一些共享变量根本不作同步。 这个问题在时间一大,压力一大的时候就会引起各种不稳定问题。 早上躺在床上想了想,A,B,C线程已有的一些锁已经把一些设计搞的很复杂了,如果加上线程间嵌套调用,用锁的话,只会把问题搞的很复杂。 根据实际的情况,目前的想法是: (1 )把A,B之间的处理都统一到B中处理,A与B做到完全隔离; (2 )B和C很难完全隔离,用消息队列进行通信。虽然也会用到锁,但是只会锁住队列。 嗯,明天搞起。

__alloc_pages: 0-order allocation failed

最近由于机器原因,服务器开发迁移到了一个新的环境。 然而以前运行很好的服务突然崩溃,出现如下错误: Program terminated with signal SIGKILL, Killed. The program no longer exists. (gdb) bt No stack. 然后, cd /var/log more messages | tail 果然,最后几条显示: Sep 22 10:06:11 localhost kernel: __alloc_pages: 0-order allocation failed (gfp=0x1d2/0) 显然,应该是内存分配引起的问题。查看swap,崩溃阶段为0,更加印证了这一点。 查看程序的相关配置,启动了太多的内容,导致内存分配失败,而程序中又没有捕捉这些错误。去掉一些内容后,程序又恢复好了。

2D渲染引擎中的脏矩形技术

2D游戏技术其实都已经很古老了,主要包括像素运算,Blt,脏矩形等一些技术。 所谓脏矩形技术,就是哪里脏了,就(仅仅)把脏了的那块区域重绘。而不是每次直接性的重绘。 其基本条件是:脏矩形的计算和绘制的代价小于直接性重绘。换句话说,如果一个屏幕每一帧变化的东西太多的话,就不值得用这个古老的算法了。 脏矩形要解决的两个问题是: (1) 什么叫脏,即什么情况下会弄脏 当我们的游戏中的元素(通常是RenderObject)发生位置,大小,方向,动画,添加,删除等操作时,那么该元素原来对应的区域会弄脏,同时,新对应的区域也同样被弄脏。 (2) 弄脏的区域该怎么办 把场景分成一个一个的格子(比如128*64或者64*32,矩形格或菱形格); 每个格子,有一个是否脏的标记,以及其上的RenderObject列表; 每个RenderObject,可以保存一个对应的格子列表(当然,也可以计算,并且,实际上有两个格子列表,变化之前和变化之后分别对应一个格子列表,对于变化前的,对应的格子列表中的每个格子应当删除该物体,对于变化后的,对应的格子列表中的每个格子应当添加该物体) 每次绘制时,按照某种顺序,绘制脏了的格子; 每个脏了的格子,按照某种顺序,将其上的RenderObject裁剪绘制到格子的区域上; 关于脏矩形技术的必要性,cloud在《我的编程感悟》一书中已经有了详细的论证。此外,书中提到的关于Blt的汇编优化,逆向画家算法,图像压缩,精灵优化,滚屏优化,以及限制内存大小的思想,都是2D游戏值得借鉴的。