使用 GlowFilter实现字体沟边与发光

如果你正在使用 Flash,那么实现下面一个字体效果是一件十分简单的事情:

image

textfield.filters = [ new GlowFilter(0, 1, 2, 2, 10) ];

这样就可以了,接着把字体设置成宋体12号,颜色是0xffff99,就成了。

image

如果要实现上面类似QQ面板的发光效果,也只需要一行:

textfield.filters = [ new GlowFilter(0xffffffff, 1, 6, 6, 0.9) ];

看起来这个 GlowFilter是无所不能呀,那么如果你在使用C++的话,如何用C++来实现一个Glow效果呢?

而且如果你正在使用3D引擎的话,如何用GPU来实现上面的效果呢?详细见下文:

Continue reading

Loading

Posted in 图形编程 | 5 Comments

快速可靠协议-KCP

KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,并以 callback的方式提供给 KCP。连时钟都需要外部传递进来,内部不会有任何一次系统调用。

整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。也许你实现了一个P2P,或者某个基于 UDP的协议,而缺乏一套完善的 ARQ可靠协议实现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。

URL:https://github.com/skywind3000/kcp

Continue reading

Loading

Posted in 编程技术, 网络编程 | Tagged , | 21 Comments

TINY-GOBANG 最精简的五子棋人机对战

国庆没事,想看看最少多少行可以写一个人机对战起来游戏,于是有了这个 Python 版五子棋人机对战,仅仅几百行:

https://github.com/skywind3000/gobang

主要算法:min/max,博弈树搜索,alpha/beta 剪枝

下面是代码(点击 More/continue 展开)

Continue reading

Loading

Posted in 人工智能, 游戏开发 | Tagged | Leave a comment

《新水浒传》为维稳出了一份大力

中心思想就是两个字“忠义”,哪怕这个制度已经腐朽了,哪怕让自己和兄弟被害死,但仍要忠于皇上,这种“大忠大义”被导演讴歌的无处不在,大结还被局命名为“忠义参天”。

导演真是煞费苦心呀,为了表现宋江的英雄气概,强行加了很多原著上没有的台词,什么“犯我中华者虽远必诛”来突出他的气概,很多吴用说的经典台词也挪给宋江来突出他的智谋。让宋江这个机会主义者和投降主义者摇身一变成为一个忠义英雄,打着替天行道大旗骗民心,跟皇帝搞统一战线维稳,打农民起义军。

鲁迅说过:“一部《水浒》,说得很分明:因为不反对天子,所以大军一到,便受招安,替国家打别的强盗—不‘替天行道,的强盗去了。终于是奴才。”

宋江的问题不是他“是否英雄”,“是否有勇有谋”,而是他搞错了一个根本问题:就是“为谁而战?”,应该是为老百姓而战,而不是为皇帝而战。搞错了“替天行道”的这个天是谁这个基本道理,天应该是民意而不是封建统治阶级。他压根没搞明白“爱国”和“爱朝廷”是两码事。

毛主席说过:“《水浒》这部书,好就好在投降。做反面教材,使人民都知道投降派。《水浒》只反贪官,不反皇帝。”

导演一厢情愿的歪曲原著讴歌忠义,要替宋江平反不惜添油加醋,是导演想相谁献媚呢?还是想为为谁维稳?我觉得实在是该记导演一大功劳呀!!

Loading

Posted in 未分类 | 2 Comments

Windows字体为什么那么难看?

1)很多字库比如宋体,12号以下都是点阵字体。

2)GDI太老了,只有5级灰度,而且AA是横向的,Y轴方向没有AA。

3)雅黑又不能通用,且小字号时高低不平。

 

改进:

1)字体SuperSample。

2)勾边。

image_thumb8

image_thumb13

image_thumb15

image_thumb17

Loading

Posted in 图形编程, 编程技术 | 1 Comment

【原创】快速除以255的方法

经过若干次试验修改,研究出下面这个快速/255的宏,可以在 X属于[0,65536]的范围内误差为零:

#define div_255_fast(x)    (((x) + (((x) + 257) >> 8)) >> 8)

传统来说,人们习惯于将 /255改为 >> 8,但是这样误差挺大的,比如先乘以255再除以255,连续做十次,如果用>>8来代替除法,那么十次之后,误差为10. 另外一种常见的近似法是((x) + 255) >> 8,这种累积误差也挺厉害的。

因此>>8代替/255结果是比较粗糙的。而这个宏的开销比起>>8来说成本大12%。

经过测试65536000次计算中,使用/255的时间是325ms, 使用div_255_fast的时间是70ms,使用>>8的时间是62ms,div_255_fast的时间代价属于可以接受的范围。

下面是测试程序(点击more展开):

Continue reading

Loading

Posted in 编程技术 | Leave a comment

测试了一下:TT达到64

image

记录一下。

Loading

Posted in 未分类 | 4 Comments

CYGWIN 环境搭建记录

[sshd]

ssh-host-config

/var/empty目录的拥有者必须是sshd进程的拥有者, 而且权限必须是700; 如果sshd进程的拥有者不是SYSTEM, 则只有这个拥有者可以通过ssh登录系统, 因为sshd需要执行seteuid, 非系统账户执行seteuid将自己有效id设为其他用户时会被拒绝。

如果是在 Win7下面需要建立一个独立的用户,这时CYGWIN终端需要以管理员权限运行,否则用户设置失败,无法安装sshd服务。

[svnserve]

cygrunsrv -I svnserve -d “CYGWIN svnserve” –chdir /data/svnroot –path /usr/bin/svnserve –args “–foreground –daemon –root=/data/svnroot –listen-port=3690″ –neverexits –type auto -o

如果发现svnserve.exe无法监听在相应端口, 需要添加额外参数(–args中): –listen-host=0.0.0.0 (或监听在特定的ip或主机名上).

[passwd]

如果在cygwin中发现自己所在的组变成了”mkpaswd”, 这说明/etc/passwd或者/etc/group需要重建了, 运行:
mkpasswd -l >/etc/passwd; mkgroup -l >/etc/group

[httpd]

启动httpd服务时可能会报告”Bad system call”错误, 这是由于apache2需要cygserver, 运行:
cygserver-config

而且环境变量$CYGWIN中包含server, 参见[he CYGWIN environment variable].

[init]

配置启动 systemv 的 init 服务,管理员启动cygwin,并运行:

init-config

然后查看 /etc/inittab 和 /etc/rc.d/rc 两个文件,根据需要编辑,首先是   /etc/inittab:

# id:runlevels:action:process
id:3:initdefault:
rc::bootwait:/etc/rc
l0:0:wait:/etc/rc.d/rc 0
l3:3:wait:/etc/rc.d/rc 3
#S0:2345:respawn:/sbin/agetty -L -T vt100 -n ttyS0 9600 ttyS0

 

接下来是 /etc/rc.d/rc:

#! /bin/bash
# Now find out what the current and what the previous runlevel are.
argv1="$1"
set `/sbin/runlevel`
runlevel=$2
previous=$1
export runlevel previous

# Source function library.
. /etc/rc.d/init.d/functions

# Get first argument. Set new runlevel to this argument.
[ -n "$argv1" ] && runlevel="$argv1"

# echo "rc $runlevel" >> /tmp/rc.log

# Is there an rc directory for this new runlevel?
if [ -d /etc/rc.d/rc$runlevel.d ]; then
        # First, run the KILL scripts.
        for i in /etc/rc.d/rc$runlevel.d/K*; do
                # Check if the script is there.
                [ ! -f $i ] && continue

                # stop script
                $i stop
        done

        # Now run the START scripts.
        for i in /etc/rc.d/rc$runlevel.d/S*; do
                # Check if the script is there.
                [ ! -f $i ] && continue

                # start script
                $i start
        done
fi

 

不要直接复制上面的代码,最好照着用手敲,页面上 copy/paste 经常会把 indent 搞乱,bash脚本的缩进一乱就没法运行了。使用时把启动停止脚本放到 /etc/rc/init.d 下面,然后启动时候做软连接:

/etc/rc.d/rc0.d/K*     # 停止脚本
/etc/rc.d/rc3.d/S*     # 启动脚本
别忘记 init-config 时候把 init 安装成 windows 服务,如此,可以自由的增加自动启动脚本了。
 

[supervisor]

 
安装 python2-setuptools 然后:
easy_install_2.7 pip
pip install supervisor
mkdir /etc/supervisor
mkdir /etc/supervisor/conf.d
mkdir /var/log/supervisor
编辑 /etc/supervisor/supervisord.conf :
[unix_http_server]
file=/var/run/supervisord.sock
chmod=666

[supervisord]
logfile=/var/log/supervisor/supervisord.log
logfile_maxbytes=50000000
logfile_backup=10
loglevel=info
pidfile=/var/run/supervisord.pid
nodaemon=false
minfds=2048
minprocs=200
childlogdir=/var/log/supervisor

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisord.sock

[include]
files=/etc/supervisor/conf.d/*.conf

然后就可以使用了

Loading

Posted in 未分类 | Tagged | Leave a comment