2007年8月9日
#
自己也原創(chuàng)一下
項目做了一段時間了,該做的都做了,可以休整幾天了。利用這幾天,看了看自己做的項目,發(fā)現(xiàn)一個問題,從頭到尾都沒有用 actionForm。呵呵。
原因了也是因為以前一個從網(wǎng)上查到的讓大家都很頭疼的經(jīng)典的問題,就是struts 的 actionForm 執(zhí)行 validate 返回原來頁面后原來的值無法保存的問題。今天寫了個測試試了一下,發(fā)現(xiàn) struts 并沒有變什么魔術。一切都是這么容易,這個問題根本不是 struts 的問題了。
關鍵的地方在于, 頁面提交后 struts 會將表單的值填進 actionForm,然后執(zhí)行 validate 方法,不通過就返回源頁面。 這時 表單對象是存放在 request 對象里的,與我們平時用的 request.setAttribute("xx")沒有任何區(qū)別,返回原頁面后這個對象當然還在 ,所以頁面可以用 request.getAttribute("xx") (“xx”是struts action 映射時的 name,如果配了 attribute 就是 attribute了), 得到之前填寫的值。
我們的工程用 velocity ,更容易了,直接 $xx.fieldname ,搞定。
所以,以后還是這樣用吧。
2007年8月7日
#
做
演示文稿,一般說來還是ppt方便些,也很容易調(diào)整視覺布局和顯示效果。主要的方面,請參見別人寫的一篇《制作科研Slide的規(guī)范建議》,里面說的每一
點,都很值得注意,而且講述的很有條理。該文里面說的已經(jīng)很全面、很詳細了,這里我只簡單說一下我自己體會比較明顯的地方,雖然跟該文有重復的地方。
presentation的前提,演示用的電腦能正常打開并演示你的ppt,雖然很少見,但是我也見過有人要開始講了,先倒騰10分鐘筆記本、重啟三遍
的,還有的自己制作的特效放不出來,插入的視頻播放不了的。另外需要注意自己用的一些特殊符號、公式、插圖(origin、visio等)在使用的電腦上
能正確顯示出來。首先,題目顏色、字體、大小要合適,作者、導師及工作單位要合適,首頁面上一般給出一定的單位圖標,顯得嚴謹而自然。題
目一般要取的短一些,短,說明主題鮮明、突出,也更有吸引力。整體的slide字體要足夠大,而且字體應該一致,顯得有條理,也給人比較完美、不花哨。淡
底深字,一般說來演示效果不錯。其次,每張slide上面最好有一個Title,確實讓人直接了解本頁的內(nèi)容,而且,可以引導別人跟著自
己的講述思路,使得別人不胡亂思考你的頁面內(nèi)容(有的人很喜歡鉆你的漏洞)。slide頁面中有需用強調(diào)的數(shù)字或文字,不妨換種醒目的顏色。頁面中用
item比較好,3~5個項目給人的感覺好些,寧可少寫字。一般只有聽不太懂的人,才會去一字一句的去看你寫的那些段落文字,所以頁面不要放過多的文字。
尤其是通篇都是文字的ppt,其實很惹人反感(除非你是純做理論計算的)。圖片的線條粗細要足夠,標簽和標度的文字、數(shù)字要足夠大,對比
襯度也要足夠,數(shù)據(jù)圖盡量把多條曲線用不同的顏色(畢竟是ppt而不是黑白paper)。位圖也要把圖弄得有點兒色彩,雖然是同樣的信息量,但是效果更
好。有問題的數(shù)據(jù)最好少些或者不標,否則,敏感的聽眾會問的。另外,自己的ppt里,盡量少引用別人的、參考文獻上的實驗數(shù)據(jù)或者圖片,
可能你自己覺得好像自己涉獵挺廣泛,但是真正聽的懂的人,會對此比較反感,除非是有直接聯(lián)系的令人信服的其他文獻,或者是非常綜述性或者有特色的。因為,
引用他人的理論數(shù)據(jù),通常給人的感覺是你自己沒有這方面的能力,所以只會引用,至少也有偷懶之嫌;另外,那里面可能含有不在你掌握范圍內(nèi)的其他東西,說不
定別人會就此提問。一般說來,我自己看到到從雜志上拷貝的那種模糊的圖片,也沒什么好感。中國振動聯(lián)盟|yo%y4W?_ Z'q+p[還有,為了使介紹的工作有條理性,一般都是從基
礎的切入點逐步講起,因此,如果工作比較全面的話,可以分成好幾個部分,在不同的部分之間,最好有個紐帶做聯(lián)系,比如設置一個提問(但是要有足夠的把握你
后面有能力把這個問題闡述清楚,否則就是自己找不自在),這樣顯得更漂亮。因為聽報告的人也會有一定的疑問,如果你把他們能想到的問題都講到了的話,他們
自然沒疑問了。而每個部分的關鍵地方,不如稍微使用一下動畫,比如說飛入或者漸強顯出,但一般不要用太夸張的動作特效,會讓人覺得這人有病。對于自己還沒
有思考清楚的問題,盡量少放或者不放,或者即使承認這個自己沒搞懂,也順便指出這個問題沒那么容易搞清楚,甚至于說“這個問題全世界其他人也都搞不明白,
即使有人號稱搞明白了,其實還是有問題的!”。事實上,大家都不是萬事通,都有自己不懂的東西,只不過你怎么表述自己和讓別人怎么樣感覺。有時候,“不
說”可能是個比較妥善而簡單的辦法,也沒什么丟人的。最后,感謝一下實驗當中給過幫助的同事,這個是禮貌,也給在座的同事一定的好感。另
外整個報告要收尾了,也調(diào)節(jié)一下學術氣氛,同時給別人一定的思考問題的時間。另外,我覺得可以少說或者不說下面要繼續(xù)做的實驗,不妨留到別人提問到的時候
再說,因為你自己先說出來下一步要繼續(xù)做什么的話,可能有些人會覺得:你現(xiàn)在的工作做的不全面?最最后,一點兒經(jīng)驗,就是別緊張,大不了
說慢點兒(當然也別太慢)。如果中間有變態(tài)人插話提問,你又不想回答,就干脆說“這個我后面的幻燈會講的”,然后你就接著講就是了,其實過了兩分鐘可能別
人都忘了?;卮鹛釂柕臅r候,注意兩種快捷鍵:一個是直接數(shù)字鍵然后回車,就直接全屏切換到了該頁面;另外一個是shift+F5,當你回到總覽的
powerpoint(普通模式)的時候,找到了需要的那張的時候,用這個鍵就切換全屏了(ppt比較傻,你雙擊左邊的瀏覽圖片,它也不會動作;你回車,
它就給你新加一張幻燈片!)。這些雖然簡單,但是很有效,而且省時間,另外,顯得你很熟練(一鍵搞定)。如果您的工作做的有內(nèi)容,那么跟
silde的張數(shù)沒什么關系,只要把你的工作系統(tǒng)的講清楚了就行了。一般說來,給多少時間就講多少時間,太超或者太短都不好,除非是非常出色的內(nèi)容,否則
的話,寧可講的時間短點兒,也別超時,聽報告的人其實也累。如果內(nèi)容不多,你就是講的再多也沒用,真正聽的懂的人都明白,只是人家為難不為難你罷了。
ppt也就是個ppt,真正的學術,不是靠ppt做出來的。對于低年級同學,因為沒什么工作量,所以很難講出東西來,也都無所謂。“聞道有先后”,“士別
三日當刮目相看”也不是不常見,即使被別人鄙視,也不用在意。做工作總有量變到質(zhì)變的時候,只要認真做,早晚都會出東西,這個屢見不鮮。
2007年5月21日
#
注:原文地址:http://scorpioncity.com/dj2.html
3、一些你寫程序時必須知道的概念
3.1 位圖和子圖形
位圖是一副圖片在計算機里被當作一個像素值的數(shù)組來存儲。這是個相當蹩腳的解釋?;旧峡梢允怯嬎銠C上的任何圖片,通常是一塊由像素組成的矩形。子圖形是個和位圖一樣的東西,但是通常這個子圖形相關的位圖有透明區(qū)域(對于子圖形的精確定義在程序員之間也是相當不同的)。子圖形是游戲里一個相當重要的組成,有著超過一百萬次的使用。例如,你的鼠標光標就是一個合格的子圖形,DOOM里的怪物也是子圖形。面向你的那邊被編程為有透明區(qū)域的平面圖片(有點繞)。記住子圖形總是面對你,但并不是說怪獸總是面對你。不管怎樣,對位圖和子圖形的解釋應該足夠了,我想。
3.2 雙緩沖區(qū)和頁翻轉(zhuǎn)
如果你的游戲直接繪圖到當前顯示器,當游戲直接繪圖到屏幕時用戶將注意到非常明顯的閃爍。解決方案是準備兩個圖像緩沖區(qū),一個“前緩沖區(qū)”,一個“后緩沖區(qū)”。前緩沖區(qū)是用戶看到的那個,后緩沖區(qū)不是。你把所有的操作畫到后緩沖區(qū),當完成繪制完屏幕的所有部分后,你復制后緩沖區(qū)的所有內(nèi)容到前緩沖區(qū)。這就是雙緩沖區(qū),事實上現(xiàn)在有好幾種雙緩沖區(qū)模式。
通常有兩種方法來執(zhí)行后緩沖區(qū)到前緩沖區(qū)的傳輸:復制或者頁翻轉(zhuǎn)。
復制:后緩沖區(qū)的內(nèi)容簡單的復制到前緩沖區(qū)。后緩沖區(qū)可以在系統(tǒng)內(nèi)存或者其他顯存表面(這個不會翻譯了,應該是顯卡內(nèi)存吧);
頁翻轉(zhuǎn):使用這種技巧,就不需要實際的復制操作。兩個緩沖區(qū)都必須在顯存中。為你游戲的每個框架輪流使用這兩個表面來繪圖。你總是繪圖到當前不可見的那個緩沖區(qū),在框架繪制完成后,你指示硬件去把這個繪制好的緩沖區(qū)當成可見的,因此在每個框架中前緩沖區(qū)現(xiàn)在都是后緩沖區(qū)了。
這個技巧會帶來一個問題“Tearing”。顯示器按照刷新頻率重畫屏幕上的圖片,通常大約每秒70次(70Hz)。一般的,按照從上到下的順序。這時問題出現(xiàn)了,當你使用上面的任何一種技巧指示硬件開始畫另一個東西時,顯示器只畫了一半的圖像。當你這么做時,下半截的屏幕使用的是新圖像,而上半截屏幕還是老圖像。這個效果就叫做“Tearing”,或者“切斷”。有個已有的解決方案,無論如何,你的頁面翻轉(zhuǎn)有可能與屏幕刷新的結束很好的配合起來。(fixme:我想DirectDraw以及替你處理這個了,檢查一下)。
4、 剪切和DirectDraw剪切器
剪切是一種技術,指預防繪圖操作超出到屏幕外邊或者超出一個矩形區(qū)域比如窗口。如果不執(zhí)行這個,通常的結果用最好的詞來描述就是一團糟(這句是瞎譯的)。在DirectDraw里,例如,當使用窗口模式時,window會給DirectDraw一個它想要的正確的屏幕區(qū)域。無論如何,一個行為良好的DirectDraw程序應該只畫屬于自己的窗口。DriectX有一個對象叫做剪切器可以被加到DirectDraw表面來預防畫到窗口外面。
5、DirectDraw表面
DirectDraw使用“表面”去訪問一段內(nèi)存,無論是系統(tǒng)內(nèi)存還是顯存,內(nèi)存段通常用來存儲位圖,紋理圖,子圖形,屏幕或窗口的當前內(nèi)容。
DirectDraw也支持“覆蓋”,一個特殊類型的子圖形,一個“覆蓋”通常是屏幕上將被覆蓋的包含透明位圖的內(nèi)存段。例如,一個賽車游戲可能對駕駛區(qū)域和窗口邊框使用覆蓋。
在有些情況下DirectDraw表面使用的內(nèi)存可能被丟棄,因為DirectDraw和GDI共享資源。你的程序需要規(guī)律的檢查看這個是否發(fā)生,如果被丟棄那就要恢復表面。
6、DirectX返回值和錯誤檢查
所有的DirectX函數(shù)返回HRESULT作為錯誤碼。自從DirectX對象基于COM體系后,正確的方法檢查DirectX函數(shù)失敗是使用宏 SUCCEEDED() 和 FAILED() ,用HRESULT做參數(shù)。并不是檢查一個if就夠了,例如,有的DirectDraw函數(shù)返回HRESULT等于DD_OK,但COM對象可能會有多種表示正確的返回值,你的代碼有可能還會正確工作,但是這個是錯誤的方法。
有些事情需要引起注意,有寫DirectX函數(shù)執(zhí)行成功后會返回失敗碼。例如,當你僅詢問數(shù)據(jù)大小的時候,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調(diào)試
當你安裝DirectX SDK是有個選擇安裝零售版庫還是調(diào)試版的。調(diào)試版會診斷信息OutputDebugString到你的調(diào)試器,這個會很有用。無論如何,這個會降低很多速度。如果你只是想玩游戲,那就選擇零售版的庫,如果你主要做游戲開發(fā),而且你有足夠快的機器,安裝調(diào)試版本。
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 模式,前三個字節(jié)和24位真彩色模式一樣,第4個字節(jié)用做“alpha-channel”,即透明度。
這些模式都是可用的。下面說一下分辨率:
- 320x200
- 320x240
- 640x400
- 640x480
- 800x600
- 1024x768
- 1280x1024
- 1600x1200
現(xiàn)在比較常用的是640x480
(好像年代比較久遠了這篇文章,我覺得1024x768應該比較常用吧)。
顯示器通常是3/4的縱橫比,所以沿著高的那個邊擁有的像素點應該是寬的那個的3/4,這樣像素點的長寬比就是1,所以像素點就是正方形,也就是說100個像素在一個方向上的物理長度和另一個方向上的相當。但是320x200不是這樣子滴,實際上它的像素點是稍顯瘦高一點的。
2、顏色原理
有好多種表示顏色的方法,即“顏色模型”,比較常見的一個是“RGB”,幾乎所有可見的顏色都可以用紅、綠、藍三種顏色按照各種比例組合生成。通常會用三個字節(jié)來存儲顏色,每位表示一個主色的強度,從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 色調(diào), Saturation 飽和度, Luminance 亮度),但我不打算涉及它。
2.1 High-color和true-color模式
在這兩種模式下,屏幕像素按照他們相應的RGB值存儲到顯存里。比如,如果屏幕左上角的像素點是綠色,那么在true-color模式下,顯存里前三個字節(jié)就是0,255,0。而在high-color模式下,對應的RGB值分別用5、6、5位來存儲,即前5位紅色,接下來6位綠色,然后5位藍色,所以在這個模式下顯存對應的就是兩個字節(jié),二進制表示就是 00000111 11100000。
2.2 基于調(diào)色板或者indexed模式
Indexed模式使用一個“look up table”(LUT)的原理,即顏色查看表,通常這種模式使用8位圖像模式,即256色,屏幕上的每個像素都用一個字節(jié)來表示,所以每次只能顯示256 種顏色,所以這256種顏色就按照每種3個字節(jié)存到LUT里,顯卡每次就按照LUT里的值確定要顯示的顏色。
用Indexed模式創(chuàng)建一個程序是非常痛苦的,尤其是搞圖像藝術的,但使用Indexed模式還是有一些優(yōu)勢的:
* 需要很少的內(nèi)存
* 運行會更快,因為需要傳輸?shù)淖止?jié)變少了
* 一些有趣的“調(diào)色板動畫”技巧,在其他模式下很難完成的在Indexed模式下簡直太容易了。你可以只改變LUT里的值去改變屏幕顏色,而不需要改變內(nèi)存里每個像素對應的值。例如,一個淡出效果可以改變LUT里的RGB值到0來實現(xiàn)。
* 當你有一個紋理需要很多內(nèi)存的時候,有些3D加速器支持Indexed模式的紋理。
2.3 ModeX
ModeX是一個特殊的 VGA 256色模式,這種模式下顯存的內(nèi)容會按照一個稍微復雜點planar(二維)格式。這個模式下的分辨率可以非常高,DirectDraw知道如何寫 ModeX表面,但是windows GDI并不會,所以當你混合這兩種不同類型表面的時候要小心。當設置DirectDraw全屏模式時可以選擇是否允許DirectDraw創(chuàng)建ModeX 表面。這些日子里你可能想避開ModeX。
2.4 Pitch/Stride
雖然屏幕分辨率可能是640x480x32,但這并不是說每行像素會占用640x4個字節(jié)的顯存。因為速度上的原因,顯卡存儲的這些表面寬度經(jīng)常比他們邏輯上要寬。例如,最大支持1024x768的顯卡可能會把所有從320x200到1024x768的模式內(nèi)部實現(xiàn)為1024x768模式,所以表面的右邊會留下空白
(呵呵,默認左對齊),這個分配給表面實際的寬度就稱為表面的Pitch(或者Stride),知道表面的Pitch是非常重要的,不管它是一個2D DirectDraw 表面還是紋理貼圖,可以使用 DirectDraw 查詢表面的Pitch。
3、一些游戲概念你需要知道
下班了,以后繼續(xù)。。。
博客從今天開始更新了,之所以選擇博客,是因為自己雖然是很早就知道博客的,但是現(xiàn)在才開始接受它,好像自己就像c++一樣的固執(zhí)。
c++的博客也符合自己的習慣,并且技術上雖然現(xiàn)在做java很多,但是c++還是割舍不下,國內(nèi)也都比較浮躁一點,肯用心做事的不多,總在跟著國外的腳步。希望自己能把博客寫好一點,讓喜歡c++的人都能學到一點東西,真正的扎扎實實的打好基礎。
最初的想法是翻譯一些DirectX方面的比較好的文章,以后會寫一些其他方面的東西。不定期更新吧。