1. 解壓http://builds.nightly.webkit.org/files/trunk/src/WebKit-r100089.tar.bz2到cygwin目錄下
2. 下載win32預(yù)編譯依賴庫: ./Tools/Scripts/update-webkit
3. 修改WebKitLibraries\win\tools\vsprops\common.vsprops(DisableSpecificWarnings=4819), 解決在中文操作系統(tǒng)里編譯與某些英文符號(hào)不兼容問題。某些新版本的WebCore\platform\DefaultLocalizationStrategy.cpp中引號(hào)也要修改一下。
4. 檢查系統(tǒng)環(huán)境變量:
WEBKITLIBRARIESDIR D:\cygwin\WebKit-r100089\WebKitLibraries\win
WEBKITOUTPUTDIR D:\cygwin\WebKit-r100089\WebKitBuild
DXSDK_DIR D:\cygwin\WebKit-r100089\DXSDK_Feb10
SystemDrive D:
其中SystemDrive對(duì)應(yīng)cygwin安裝盤符,DXSDK_DIR是dx9sdk的路徑,還需要安裝QuickTime SDK。
5. 開始命令行編譯:./Tools/Scripts/build-webkit --debug,全部通過之后再用vc2005 ide打開項(xiàng)目并調(diào)試,否則某些腳本會(huì)有問題。
6. 安裝Safari,復(fù)制相關(guān)運(yùn)行時(shí)文件到WEBKITOUTPUTDIR子目錄,運(yùn)行MiniBrowser
ps1: vc2005需要安裝sp1, 否則stl鏈接會(huì)出錯(cuò)。智能分析造成cpu太卡,可通過改名C:\Program Files\Microsoft Visual Studio 8\VC\vcpackages\feacp.dll來屏蔽。
ps2: dx9sdk可以用比較老的版本,但鏈接時(shí)需要?jiǎng)h除common.vsprops里的/SAFESEH。
ps3: 編譯Cairo版本: ./Tools/Scripts/build-webkit --debug --wincairo, 需要vista以上系統(tǒng)運(yùn)行,否則會(huì)報(bào)WSAPoll找不到。
http://www.cnblogs.com/coffeestone/archive/2011/01/10/1931872.html
http://blog.csdn.net/elfylin/article/details/6769747
posted @
2011-12-31 00:55 foxriver 閱讀(1597) |
評(píng)論 (0) |
編輯 收藏
目前官方ffmpeg的最新版本為0.9, 我們就以此為例:
1. 下載最新git版本的源代碼(http://ffmpeg.zeranoe.com/builds/, 本例下載的是2011-12-12版本)
2. 放到MSYS環(huán)境里配置,生成config.h文件。mingw gcc是能順利編譯通過整個(gè)項(xiàng)目的,并生成最新版的ffmpeg。
3. 建立vc6工程,把相關(guān)代碼都加入到工程中。由于在vc生成的obj都在一個(gè)目錄下,所以需要修改文件名,讓其不重名。
4. 安裝intel compiler 11編譯器,單獨(dú)提取其icl.exe及相關(guān)include目錄,替換掉vc6自帶的cl.exe, 在工程設(shè)置里加上/Qstd=c99,用于支持C99語法。
5. 安裝intel compiler 10編譯器,單獨(dú)提取lib目錄,因?yàn)榇税姹菊{(diào)試庫的結(jié)構(gòu)能完美支持vc6的調(diào)試信息。
6. 在vc6的options里設(shè)置include/exe/lib查找目錄,指向intel編譯器。
7. 開始修改代碼,添加C99的相關(guān)linux頭文件, 用于支持vc6, (unistd.h, stdint.h, inttypes.h, getopt.h)
8. 添加C99和linux的相關(guān)實(shí)現(xiàn)代碼,ffmpeg需要用到: getopt_long, strtoll, gettimeofday, atoll, usleep等
9. 修改windows的相關(guān)兼容代碼,GetWindowLongPtr -> GetWindowLong, GWLP_USERDATA
10. 去除硬件加速libavcodec代碼,和依賴庫代碼。選擇所需要的模塊,修改相關(guān)的allcodec.c, alldevices.c, allfilters.c, allformats.c
11. 加上鏈接庫,sdl.lib, winmm.lib, dxguid.lib, wsock32.lib
12. 在os_support.c里,把<winsock2.h>移動(dòng)到文件最前面。
13. 如果是ffmpeg, 已經(jīng)能順利編譯了。如果是ffplay,還需要編譯靜態(tài)sdl, 并鏈接。
14. 等等,音頻運(yùn)行不正確?有雪花聲?因?yàn)檫€需要替換所有文件里的<math.h>為<mathimf.h>, 默認(rèn)的rint等數(shù)學(xué)函數(shù)和gcc不兼容。
15. ok, 大功告成,純C版本完美運(yùn)行。
16. 由于ffmpeg0.9在c文件里,添加了一些intel compiler不支持的mmx語法,所以編譯mmx/sse加速版本時(shí),一小部分.c文件需要依賴mingw gcc編譯成.o文件,再通過vc6的lib.exe工具轉(zhuǎn)換成lib,讓vc6鏈接上。當(dāng)然還要加上yasm編譯的很多匯編obj.
17. 有興趣的,可以繼續(xù)以此方法編譯x264庫,官方最新代碼MMX版也可以順利通過。
posted @
2011-12-17 02:09 foxriver 閱讀(2646) |
評(píng)論 (0) |
編輯 收藏
普通jpeg
8x8塊編碼DCT,熵編碼=Huffman,
jpeg2000
有小波浮點(diǎn)或整數(shù)兩種變換算法, 熵編碼=MQ-Code,中等壓縮比有良好的表現(xiàn),衍生格式為ecw,用于壓縮衛(wèi)星圖片。
jpeg-xr
john carmack在rage資源中使用的格式,他推薦的一般都不會(huì)差。微軟定義的開源算法,比jpeg2000有所進(jìn)化,主要改進(jìn)有DCT塊的層次保存格式,塊之間后期接縫處理。有無損和有損模式,適合長(zhǎng)期保存游戲貼圖。
h264 iframe
使用單幀內(nèi)預(yù)測(cè)技術(shù),圖片越大,越能體現(xiàn)超強(qiáng)的壓縮比。熵編碼=Gobomb-Code
其他一些游戲壓縮格式:
pvrtx
iphone壓縮格式, 效果比較理想,不開源。
etc1
android中普遍的壓縮格式。
dxt1, dxt3, dxt5
早期的經(jīng)典格式, 采用塊狀分割,恒定壓縮比,適合二次壓縮。
bc6, bc7
被微軟強(qiáng)化的dx10壓縮格式,和dxt1一個(gè)壓縮比,圖片質(zhì)量非常好。
其他非游戲壓縮格式:
1. 圖片掃描文件二值壓縮格式, JB2(djvu), JBIG2(pdf), TIFF C4
2. 數(shù)碼相機(jī)里RAW壓縮格式, 用于近無損壓縮,大部分廠商都有自己的定義:Epson ERF, SGI Log24, Nikon NEF, Kodak DCR, Pentax PEF等
-------------------------
1:100的圖片壓縮效果對(duì)比

游戲貼圖壓縮質(zhì)量對(duì)比圖
posted @
2011-12-06 01:57 foxriver 閱讀(4961) |
評(píng)論 (0) |
編輯 收藏
所有涉及圖片放大縮小,旋轉(zhuǎn)或圖片扭曲的操作,都會(huì)有Resample. 而插值算法,就是為了減少走樣而。其中又分卷積和后置濾波。
1. 卷積,通常在源圖片空間采樣,但有時(shí)候warp算法復(fù)雜(比如RBF徑向基函數(shù)),造成像素在源圖片空間縱橫比例不同,往往用后置濾波更簡(jiǎn)單。以下對(duì)比是1:1對(duì)象空間的旋轉(zhuǎn)變換。
原圖如下,目標(biāo)質(zhì)量對(duì)比圖為中心旋轉(zhuǎn)5度,重復(fù)72次,正好360度恢復(fù)原樣。



posted @
2011-03-21 01:01 foxriver 閱讀(2226) |
評(píng)論 (4) |
編輯 收藏
crysis2 dx9一幀渲染流程:
1. TestCooperativeLevel()
2. 設(shè)置n-patch細(xì)分等級(jí)D3DRS_ADAPTIVETESS_Y
3. GPU同步設(shè)置,Query9::GetData(), Query9::Issue()
4. ShadowMap
5. ZPass, 生成GBuffer信息。
6. Depth_DownScale
7. SSAO
8. Scattering List
9. Deferred Lighting
9.1 Irradiance Volume Evaluate
9.2.1 Visares
9.2.2 Outdoor
9.3 Deferred CubeMaps
9.4 Deferred Lights
9.5 SSAO_BLUR
9.6 Deferred Lights
9.6.1 ShadowMap Pool
10. 不透明物體繪制。
10.1 General(BW)
10.2 地形(BW)
10.3 General(AW)
10.4 地形(AW)
10.5 細(xì)節(jié)(BW)
10.6 細(xì)節(jié)(AW)
10.7 皮膚生成
10.8 皮膚應(yīng)用
11. 半透明物體繪制。
11.1 霧
12. Glow Gen(光暈生成)
13. HDR Post Proesss
13.1 Motion Blur, 運(yùn)動(dòng)模糊
13.1.1 Motion Vector Gen
13.1.2 Motion Vector Dilate
13.1.3 Motion Vector Apply
13.1.4 Motion Vector Apply Pass 2
13.2 HalfRes downsample
13.3 QuarterRes downsample
13.4 BrightPass
13.5 Bloom and Flares
13.5.1 TexBlur 16Taps
13.5.2 TexBlur Gaussian
13.5.3 TexBlur Gaussian
13.5.4 HDR flares
13.6 Sunshafts生成
13.7 MergeColorCharts
13.8 CombineColorGradingWithColorChart
13.9 ToneMapping
14. Post Effects
14.1 MSAA
14.2 3D HUD
15. 刷新繪制
16. 繪制界面
17. 繪制調(diào)試信息

posted @
2011-02-18 02:51 foxriver 閱讀(2310) |
評(píng)論 (0) |
編輯 收藏
網(wǎng)上開源RSA實(shí)現(xiàn)庫:
openssl 強(qiáng)大的工具集合
crypto++ 過于復(fù)雜的封裝,特別是rsa實(shí)現(xiàn)模塊。
速度上有優(yōu)勢(shì)的:XySSL, CyaSSL(都使用的LibTomMath)
邏輯上有優(yōu)勢(shì)的:axcrypto, raknet
還有一些大數(shù)庫: vlong,WinNTL
對(duì)于公鑰簽名認(rèn)證, google android自帶的libmincrypt有超快的實(shí)現(xiàn)方法,可惜代碼只是為了一家優(yōu)化,僅提供e=3的加速。而網(wǎng)上通常的ASN.1證書,都用了e=63357。
posted @
2011-02-10 07:11 foxriver 閱讀(1722) |
評(píng)論 (0) |
編輯 收藏
當(dāng)QQ群聊天記錄日積月累,達(dá)到一定數(shù)量級(jí)的時(shí)候,要查找某些單一文字,往往會(huì)花費(fèi)10幾秒甚至幾分鐘才有反應(yīng)。除去磁盤讀取的時(shí)間,是否對(duì)聊天記錄做一個(gè)全局索引也是個(gè)重要的優(yōu)化,這篇文章就是為了優(yōu)化文本查找速度,介紹一個(gè)最簡(jiǎn)單的方法。
試著把QQ每條聊天記錄看成SQL里單一記錄,對(duì)單條記錄做全文索引。這里用的方法是bit位快速匹配。假設(shè)一條聊天記錄是"test", 轉(zhuǎn)換成16進(jìn)制,就是"74 65 73 74", 對(duì)單條記錄,定義196位bit空間(占用24字節(jié)),定義為數(shù)組A, 然后按bit層(注意不是字節(jié))做or操作: (A = A or N, 把A的第N個(gè)bit設(shè)置為1)
初始狀態(tài):
A = 0; // 【0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00】
A = A or 0x74; // 【0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00】
A = A or 0x65; // 【0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00】
A = A or 0x73; // 【0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00】
A = A or 0x74; // 【0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00】
使用時(shí),給需要查找的字符串建立相同大小的bit索引B,對(duì)查找數(shù)據(jù)"es"做相同處理:
B = 0;
B = B or 0x65; // 【0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00】
B = B or 0x73; // 【0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00】
然后把A和B做and操作,如果結(jié)果為空(完全沒有交集),則可以快速跳過這條記錄,而不用去判斷實(shí)際內(nèi)容中是否包含了查找文本。
if (B & A)
{
// 兩者索引存在交集,有一定的可能性,處理進(jìn)一步文字查找操作。
}
else
{
// 兩者不可能有包含關(guān)系,直接跳過本條記錄內(nèi)容,判斷數(shù)據(jù)庫下一條記錄。
}
原理很簡(jiǎn)單,就是求兩者的交集,但往往簡(jiǎn)單的索引,能帶來意想不到的速度提升。實(shí)際測(cè)試中,只要輸入的查找文本比較短小,大約30%~60%上下浮動(dòng)的數(shù)據(jù)都能直接略過,大大節(jié)省了查找總耗時(shí)。
本人實(shí)現(xiàn)中,中文的查找方法相當(dāng)于兩個(gè)單字節(jié)的英文,為了最大效率利用空間,用算法把中文每個(gè)BYTE都?jí)嚎s在196bit之內(nèi)。
posted @
2011-01-14 01:22 foxriver 閱讀(2210) |
評(píng)論 (6) |
編輯 收藏
算是對(duì)多重繼承里,類型轉(zhuǎn)換所做一個(gè)筆記。先看如下代碼:
class A
{
public:
A() { m_data = 'A';}
~A() {}
char m_data;
};
class B
{
public:
B() { m_data = 'B';}
~B() {}
char m_data;
};
class C : public A, public B
{
public:
C() { m_data = 'C';}
~C() {}
char m_data;
};
class D : public C
{
public:
D() { m_data = 'D';}
~D() {}
void test()
{
DWORD value = (DWORD)this;
A* address1 = (A*)(value);// 編譯通過,類型轉(zhuǎn)換錯(cuò)誤(僅在在虛擬繼承的情況下),正確的寫法:A* address1 = (A*)((D*)value);
B* address2 = (B*)(value);// 編譯通過,類型轉(zhuǎn)換錯(cuò)誤,正確的寫法:B* address2 = (B*)((D*)value);
C* address3 = (C*)(value);
D* address4 = (D*)(value);
printf("%c %c %c %c", address1->m_data, address2->m_data, address3->m_data, address4->m_data);
}
char m_data;
};
void main()
{
D d;
d.test();
}
代碼運(yùn)行后,結(jié)果為A A C D,顯然B這個(gè)類沒有正確轉(zhuǎn)換。
A和B都是D的父類,為什么A* address1 = (A*)value這句轉(zhuǎn)換正確,而B* address2 = (B*)(value)出錯(cuò)呢?這就是多重繼承的不可判斷性。
正因?yàn)檫@種特性的存在,我們?cè)趯?shí)際使用中,應(yīng)該盡量避免多重繼承,選擇單一繼承這種模式。JAVA就是如此,最初設(shè)計(jì)時(shí)就只能單一繼承,而多重繼承則演變?yōu)榧兲摻涌?interface),這樣就規(guī)避了此類問題。但可惜,在C++里,WTL和QT都大量使用這種模型,想在實(shí)際項(xiàng)目中完全避免,也很困難。
要解決,有幾種方法。
1. 把B* address2 = (B*)(value)這行,改寫為B* address2 = (B*)((D*)value); 這樣就能直觀的傳達(dá)給編譯器,B正確的偏移量。
最終輸出A B C D,正是我們想要的結(jié)果。
2. 顯示使用static_cast,當(dāng)編譯器不能確定轉(zhuǎn)換類型時(shí),會(huì)提示編譯錯(cuò)誤信息。
例如:
B* address2 = static_cast<B*>(value); // 編譯失敗。
B* adddres2 = static_cast<B*>((D*)value); // 編譯成功,并且結(jié)果正確。
3. 使用RTTI解決。
--------------------------------------------------
看似問題解決了,可如果一旦改寫為
虛擬繼承(class C : virtual public A, virtual public B)這種形式,A運(yùn)行時(shí)還是會(huì)出錯(cuò),必須寫成A* address1 = (A*)((D*)value);。如程序里用到了多重繼承,一定要小心+謹(jǐn)慎。
posted @
2011-01-12 15:53 foxriver 閱讀(6371) |
評(píng)論 (10) |
編輯 收藏
#ifndef __file_h__
extern const char table1[];
#else
const char table1[] = "\x30\xB8\xD1\xB8\x10\x68\x3D\xBC\x09\x04\x31\x94\x5C\x91\xAF\x6C";
#endif
#ifndef __file_h__
#define __file_h__
.........function
#endif
--------------------
用以上技巧的前提是,這個(gè).H必須被不同的CPP包含兩次以上。
posted @
2010-04-08 11:17 foxriver 閱讀(6188) |
評(píng)論 (7) |
編輯 收藏