2007年8月9日
#
自己也原创一下
项目做了一段时间了,该做的都做了,可以休整几天了。利用这几天,看了看自己做的项目,发现一个问题,从头到尾都没有用 actionForm。呵呵。
原因了也是因为以前一个从网上查到的让大家都很头疼的经典的问题,就是struts 的 actionForm 执行 validate 返回原来页面后原来的值无法保存的问题。今天写了个测试试了一下,发现 struts 并没有变什么魔术。一切都是这么容易,这个问题根本不是 struts 的问题了。
关键的地方在于, 页面提交后 struts 会将表单的值填进 actionForm,然后执行 validate 方法,不通过就返回源页面。 这时 表单对象是存放在 request 对象里的,与我们平时用的 request.setAttribute("xx")没有任何区别,返回原页面后这个对象当然还在 ,所以页面可以用 request.getAttribute("xx") (“xx”是struts action 映射时的 name,如果配了 attribute 就是 attribute了), 得到之前填写的值。
我们的工程用 velocity ,更容易了,直接 $xx.fieldname ,搞定。
所以,以后还是这样用吧。
2007年8月7日
#
做
演示文稿,一般说来还是ppt方便些,也很容易调整视觉布局和显示效果。主要的方面,请参见别人写的一篇《制作科研Slide的规范建议》,里面说的每一
点,都很值得注意,而且讲述的很有条理。该文里面说的已经很全面、很详细了,这里我只简单说一下我自己体会比较明显的地方,虽然跟该文有重复的地方。
presentation的前提,演示用的电脑能正常打开并演示你的ppt,虽然很少见,但是我也见过有人要开始讲了,先倒腾10分钟笔记本、重启三遍
的,还有的自己制作的特效放不出来,插入的视频播放不了的。另外需要注意自己用的一些特殊符号、公式、插图(origin、visio等)在使用的电脑上
能正确显示出来。首先,题目颜色、字体、大小要合适,作者、导师及工作单位要合适,首页面上一般给出一定的单位图标,显得严谨而自然。题
目一般要取的短一些,短,说明主题鲜明、突出,也更有吸引力。整体的slide字体要足够大,而且字体应该一致,显得有条理,也给人比较完美、不花哨。淡
底深字,一般说来演示效果不错。其次,每张slide上面最好有一个Title,确实让人直接了解本页的内容,而且,可以引导别人跟着自
己的讲述思路,使得别人不胡乱思考你的页面内容(有的人很喜欢钻你的漏洞)。slide页面中有需用强调的数字或文字,不妨换种醒目的颜色。页面中用
item比较好,3~5个项目给人的感觉好些,宁可少写字。一般只有听不太懂的人,才会去一字一句的去看你写的那些段落文字,所以页面不要放过多的文字。
尤其是通篇都是文字的ppt,其实很惹人反感(除非你是纯做理论计算的)。图片的线条粗细要足够,标签和标度的文字、数字要足够大,对比
衬度也要足够,数据图尽量把多条曲线用不同的颜色(毕竟是ppt而不是黑白paper)。位图也要把图弄得有点儿色彩,虽然是同样的信息量,但是效果更
好。有问题的数据最好少些或者不标,否则,敏感的听众会问的。另外,自己的ppt里,尽量少引用别人的、参考文献上的实验数据或者图片,
可能你自己觉得好像自己涉猎挺广泛,但是真正听的懂的人,会对此比较反感,除非是有直接联系的令人信服的其他文献,或者是非常综述性或者有特色的。因为,
引用他人的理论数据,通常给人的感觉是你自己没有这方面的能力,所以只会引用,至少也有偷懒之嫌;另外,那里面可能含有不在你掌握范围内的其他东西,说不
定别人会就此提问。一般说来,我自己看到到从杂志上拷贝的那种模糊的图片,也没什么好感。中国振动联盟|yo%y4W�_ Z'q+p[还有,为了使介绍的工作有条理性,一般都是从基
础的切入点逐步讲起,因此,如果工作比较全面的话,可以分成好几个部分,在不同的部分之间,最好有个纽带做联系,比如设置一个提问(但是要有足够的把握你
后面有能力把这个问题阐述清楚,否则就是自己找不自在),这样显得更漂亮。因为听报告的人也会有一定的疑问,如果你把他们能想到的问题都讲到了的话,他们
自然没疑问了。而每个部分的关键地方,不如稍微使用一下动画,比如说飞入或者渐强显出,但一般不要用太夸张的动作特效,会让人觉得这人有病。对于自己还没
有思考清楚的问题,尽量少放或者不放,或者即使承认这个自己没搞懂,也顺便指出这个问题没那么容易搞清楚,甚至于说“这个问题全世界其他人也都搞不明白,
即使有人号称搞明白了,其实还是有问题的!”。事实上,大家都不是万事通,都有自己不懂的东西,只不过你怎么表述自己和让别人怎么样感觉。有时候,“不
说”可能是个比较妥善而简单的办法,也没什么丢人的。最后,感谢一下实验当中给过帮助的同事,这个是礼貌,也给在座的同事一定的好感。另
外整个报告要收尾了,也调节一下学术气氛,同时给别人一定的思考问题的时间。另外,我觉得可以少说或者不说下面要继续做的实验,不妨留到别人提问到的时候
再说,因为你自己先说出来下一步要继续做什么的话,可能有些人会觉得:你现在的工作做的不全面?最最后,一点儿经验,就是别紧张,大不了
说慢点儿(当然也别太慢)。如果中间有变态人插话提问,你又不想回答,就干脆说“这个我后面的幻灯会讲的”,然后你就接着讲就是了,其实过了两分钟可能别
人都忘了。回答提问的时候,注意两种快捷键:一个是直接数字键然后回车,就直接全屏切换到了该页面;另外一个是shift+F5,当你回到总览的
powerpoint(普通模式)的时候,找到了需要的那张的时候,用这个键就切换全屏了(ppt比较傻,你双击左边的浏览图片,它也不会动作;你回车,
它就给你新加一张幻灯片!)。这些虽然简单,但是很有效,而且省时间,另外,显得你很熟练(一键搞定)。如果您的工作做的有内容,那么跟
silde的张数没什么关系,只要把你的工作系统的讲清楚了就行了。一般说来,给多少时间就讲多少时间,太超或者太短都不好,除非是非常出色的内容,否则
的话,宁可讲的时间短点儿,也别超时,听报告的人其实也累。如果内容不多,你就是讲的再多也没用,真正听的懂的人都明白,只是人家为难不为难你罢了。
ppt也就是个ppt,真正的学术,不是靠ppt做出来的。对于低年级同学,因为没什么工作量,所以很难讲出东西来,也都无所谓。“闻道有先后”,“士别
三日当刮目相看”也不是不常见,即使被别人鄙视,也不用在意。做工作总有量变到质变的时候,只要认真做,早晚都会出东西,这个屡见不鲜。
2007年5月21日
#
注:原文地址:http://scorpioncity.com/dj2.html
3、一些你写程序时必须知道的概念
3.1 位图和子图形
位图是一副图片在计算机里被当作一个像素值的数组来存储。这是个相当蹩脚的解释。基本上可以是计算机上的任何图片,通常是一块由像素组成的矩形。子图形是个和位图一样的东西,但是通常这个子图形相关的位图有透明区域(对于子图形的精确定义在程序员之间也是相当不同的)。子图形是游戏里一个相当重要的组成,有着超过一百万次的使用。例如,你的鼠标光标就是一个合格的子图形,DOOM里的怪物也是子图形。面向你的那边被编程为有透明区域的平面图片(有点绕)。记住子图形总是面对你,但并不是说怪兽总是面对你。不管怎样,对位图和子图形的解释应该足够了,我想。
3.2 双缓冲区和页翻转
如果你的游戏直接绘图到当前显示器,当游戏直接绘图到屏幕时用户将注意到非常明显的闪烁。解决方案是准备两个图像缓冲区,一个“前缓冲区”,一个“后缓冲区”。前缓冲区是用户看到的那个,后缓冲区不是。你把所有的操作画到后缓冲区,当完成绘制完屏幕的所有部分后,你复制后缓冲区的所有内容到前缓冲区。这就是双缓冲区,事实上现在有好几种双缓冲区模式。
通常有两种方法来执行后缓冲区到前缓冲区的传输:复制或者页翻转。
复制:后缓冲区的内容简单的复制到前缓冲区。后缓冲区可以在系统内存或者其他显存表面(这个不会翻译了,应该是显卡内存吧);
页翻转:使用这种技巧,就不需要实际的复制操作。两个缓冲区都必须在显存中。为你游戏的每个框架轮流使用这两个表面来绘图。你总是绘图到当前不可见的那个缓冲区,在框架绘制完成后,你指示硬件去把这个绘制好的缓冲区当成可见的,因此在每个框架中前缓冲区现在都是后缓冲区了。
这个技巧会带来一个问题“Tearing”。显示器按照刷新频率重画屏幕上的图片,通常大约每秒70次(70Hz)。一般的,按照从上到下的顺序。这时问题出现了,当你使用上面的任何一种技巧指示硬件开始画另一个东西时,显示器只画了一半的图像。当你这么做时,下半截的屏幕使用的是新图像,而上半截屏幕还是老图像。这个效果就叫做“Tearing”,或者“切断”。有个已有的解决方案,无论如何,你的页面翻转有可能与屏幕刷新的结束很好的配合起来。(fixme:我想DirectDraw以及替你处理这个了,检查一下)。
4、 剪切和DirectDraw剪切器
剪切是一种技术,指预防绘图操作超出到屏幕外边或者超出一个矩形区域比如窗口。如果不执行这个,通常的结果用最好的词来描述就是一团糟(这句是瞎译的)。在DirectDraw里,例如,当使用窗口模式时,window会给DirectDraw一个它想要的正确的屏幕区域。无论如何,一个行为良好的DirectDraw程序应该只画属于自己的窗口。DriectX有一个对象叫做剪切器可以被加到DirectDraw表面来预防画到窗口外面。
5、DirectDraw表面
DirectDraw使用“表面”去访问一段内存,无论是系统内存还是显存,内存段通常用来存储位图,纹理图,子图形,屏幕或窗口的当前内容。
DirectDraw也支持“覆盖”,一个特殊类型的子图形,一个“覆盖”通常是屏幕上将被覆盖的包含透明位图的内存段。例如,一个赛车游戏可能对驾驶区域和窗口边框使用覆盖。
在有些情况下DirectDraw表面使用的内存可能被丢弃,因为DirectDraw和GDI共享资源。你的程序需要规律的检查看这个是否发生,如果被丢弃那就要恢复表面。
6、DirectX返回值和错误检查
所有的DirectX函数返回HRESULT作为错误码。自从DirectX对象基于COM体系后,正确的方法检查DirectX函数失败是使用宏 SUCCEEDED() 和 FAILED() ,用HRESULT做参数。并不是检查一个if就够了,例如,有的DirectDraw函数返回HRESULT等于DD_OK,但COM对象可能会有多种表示正确的返回值,你的代码有可能还会正确工作,但是这个是错误的方法。
有些事情需要引起注意,有写DirectX函数执行成功后会返回失败码。例如,当你仅询问数据大小的时候,IDirectPlay::GetPlayerData将返回DPERR_BUFFERTOOSMALL。This behaviour isn't documented either, which is incredibly frustrating. There aren't many of these, but be on the lookout.
7、DirectX调试
当你安装DirectX SDK是有个选择安装零售版库还是调试版的。调试版会诊断信息OutputDebugString到你的调试器,这个会很有用。无论如何,这个会降低很多速度。如果你只是想玩游戏,那就选择零售版的库,如果你主要做游戏开发,而且你有足够快的机器,安装调试版本。
2007年5月18日
#
注:原文地址:http://scorpioncity.com/dj2.html
1、图像模式
按照用多少位来存储屏幕上的一个像素,有好多种屏幕模式。使用更多的位,就能显示更多的颜色,但会占用更多的显存。
- 1、2、4、8位 “indexed”模式(8位就是通常所说的"256色");
- 16位(64K色)“high-color” 模式;
- 24位(16.7M色)“真彩色”模式;
- 32位 RGBA 模式,前三个字节和24位真彩色模式一样,第4个字节用做“alpha-channel”,即透明度。
这些模式都是可用的。下面说一下分辨率:
- 320x200
- 320x240
- 640x400
- 640x480
- 800x600
- 1024x768
- 1280x1024
- 1600x1200
现在比较常用的是640x480
(好像年代比较久远了这篇文章,我觉得1024x768应该比较常用吧)。
显示器通常是3/4的纵横比,所以沿着高的那个边拥有的像素点应该是宽的那个的3/4,这样像素点的长宽比就是1,所以像素点就是正方形,也就是说100个像素在一个方向上的物理长度和另一个方向上的相当。但是320x200不是这样子滴,实际上它的像素点是稍显瘦高一点的。
2、颜色原理
有好多种表示颜色的方法,即“颜色模型”,比较常见的一个是“RGB”,几乎所有可见的颜色都可以用红、绿、蓝三种颜色按照各种比例组合生成。通常会用三个字节来存储颜色,每位表示一个主色的强度,从0到255。比如纯的亮红色就是#ff0000,紫色是#ff00ff,灰色是#969696,等等。
下面是一些可以用来表示颜色的c代码:
struct SColor
{
int r;
int g;
int b;
};
SColor make_rgb( int r, int g, int b )
{
SColor ret;
ret.r = r;
ret.g = g;
ret.b = b;
return ret;
}
或者你可能用一个无符号32位整型来储存RGB颜色,0-7位存蓝色,8-15位绿色等等。
typedef unsigned int rgb_color;
#define MAKE_RGB(r,g,b) ( ((r) << 16) | ((g) << 8) | (b) )
当然还有其他的颜色模型,比如HSV(Hue 色调, Saturation 饱和度, Luminance 亮度),但我不打算涉及它。
2.1 High-color和true-color模式
在这两种模式下,屏幕像素按照他们相应的RGB值存储到显存里。比如,如果屏幕左上角的像素点是绿色,那么在true-color模式下,显存里前三个字节就是0,255,0。而在high-color模式下,对应的RGB值分别用5、6、5位来存储,即前5位红色,接下来6位绿色,然后5位蓝色,所以在这个模式下显存对应的就是两个字节,二进制表示就是 00000111 11100000。
2.2 基于调色板或者indexed模式
Indexed模式使用一个“look up table”(LUT)的原理,即颜色查看表,通常这种模式使用8位图像模式,即256色,屏幕上的每个像素都用一个字节来表示,所以每次只能显示256 种颜色,所以这256种颜色就按照每种3个字节存到LUT里,显卡每次就按照LUT里的值确定要显示的颜色。
用Indexed模式创建一个程序是非常痛苦的,尤其是搞图像艺术的,但使用Indexed模式还是有一些优势的:
* 需要很少的内存
* 运行会更快,因为需要传输的字节变少了
* 一些有趣的“调色板动画”技巧,在其他模式下很难完成的在Indexed模式下简直太容易了。你可以只改变LUT里的值去改变屏幕颜色,而不需要改变内存里每个像素对应的值。例如,一个淡出效果可以改变LUT里的RGB值到0来实现。
* 当你有一个纹理需要很多内存的时候,有些3D加速器支持Indexed模式的纹理。
2.3 ModeX
ModeX是一个特殊的 VGA 256色模式,这种模式下显存的内容会按照一个稍微复杂点planar(二维)格式。这个模式下的分辨率可以非常高,DirectDraw知道如何写 ModeX表面,但是windows GDI并不会,所以当你混合这两种不同类型表面的时候要小心。当设置DirectDraw全屏模式时可以选择是否允许DirectDraw创建ModeX 表面。这些日子里你可能想避开ModeX。
2.4 Pitch/Stride
虽然屏幕分辨率可能是640x480x32,但这并不是说每行像素会占用640x4个字节的显存。因为速度上的原因,显卡存储的这些表面宽度经常比他们逻辑上要宽。例如,最大支持1024x768的显卡可能会把所有从320x200到1024x768的模式内部实现为1024x768模式,所以表面的右边会留下空白
(呵呵,默认左对齐),这个分配给表面实际的宽度就称为表面的Pitch(或者Stride),知道表面的Pitch是非常重要的,不管它是一个2D DirectDraw 表面还是纹理贴图,可以使用 DirectDraw 查询表面的Pitch。
3、一些游戏概念你需要知道
下班了,以后继续。。。
博客从今天开始更新了,之所以选择博客,是因为自己虽然是很早就知道博客的,但是现在才开始接受它,好像自己就像c++一样的固执。
c++的博客也符合自己的习惯,并且技术上虽然现在做java很多,但是c++还是割舍不下,国内也都比较浮躁一点,肯用心做事的不多,总在跟着国外的脚步。希望自己能把博客写好一点,让喜欢c++的人都能学到一点东西,真正的扎扎实实的打好基础。
最初的想法是翻译一些DirectX方面的比较好的文章,以后会写一些其他方面的东西。不定期更新吧。