foxriver
Keep It Simple and Stupid. |
1. 解壓http://builds.nightly.webkit.org/files/trunk/src/WebKit-r100089.tar.bz2到cygwin目錄下 2. 下載win32預編譯依賴庫: ./Tools/Scripts/update-webkit 3. 修改WebKitLibraries\win\tools\vsprops\common.vsprops(DisableSpecificWarnings=4819), 解決在中文操作系統(tǒng)里編譯與某些英文符號不兼容問題。某些新版本的WebCore\platform\DefaultLocalizationStrategy.cpp中引號也要修改一下。 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對應cygwin安裝盤符,DXSDK_DIR是dx9sdk的路徑,還需要安裝QuickTime SDK。 5. 開始命令行編譯:./Tools/Scripts/build-webkit --debug,全部通過之后再用vc2005 ide打開項目并調(diào)試,否則某些腳本會有問題。 6. 安裝Safari,復制相關(guān)運行時文件到WEBKITOUTPUTDIR子目錄,運行MiniBrowser ps1: vc2005需要安裝sp1, 否則stl鏈接會出錯。智能分析造成cpu太卡,可通過改名C:\Program Files\Microsoft Visual Studio 8\VC\vcpackages\feacp.dll來屏蔽。 ps2: dx9sdk可以用比較老的版本,但鏈接時需要刪除common.vsprops里的/SAFESEH。 ps3: 編譯Cairo版本: ./Tools/Scripts/build-webkit --debug --wincairo, 需要vista以上系統(tǒng)運行,否則會報WSAPoll找不到。 http://www.cnblogs.com/coffeestone/archive/2011/01/10/1931872.html http://blog.csdn.net/elfylin/article/details/6769747
目前官方ffmpeg的最新版本為0.9, 我們就以此為例:
1. 下載最新git版本的源代碼(http://ffmpeg.zeranoe.com/builds/, 本例下載的是2011-12-12版本)
2. 放到MSYS環(huán)境里配置,生成config.h文件。mingw gcc是能順利編譯通過整個項目的,并生成最新版的ffmpeg。
3. 建立vc6工程,把相關(guān)代碼都加入到工程中。由于在vc生成的obj都在一個目錄下,所以需要修改文件名,讓其不重名。
4. 安裝intel compiler 11編譯器,單獨提取其icl.exe及相關(guān)include目錄,替換掉vc6自帶的cl.exe, 在工程設(shè)置里加上/Qstd=c99,用于支持C99語法。
5. 安裝intel compiler 10編譯器,單獨提取lib目錄,因為此版本調(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)實現(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>移動到文件最前面。
13. 如果是ffmpeg, 已經(jīng)能順利編譯了。如果是ffplay,還需要編譯靜態(tài)sdl, 并鏈接。
14. 等等,音頻運行不正確?有雪花聲?因為還需要替換所有文件里的<math.h>為<mathimf.h>, 默認的rint等數(shù)學函數(shù)和gcc不兼容。
15. ok, 大功告成,純C版本完美運行。
16. 由于ffmpeg0.9在c文件里,添加了一些intel compiler不支持的mmx語法,所以編譯mmx/sse加速版本時,一小部分.c文件需要依賴mingw gcc編譯成.o文件,再通過vc6的lib.exe工具轉(zhuǎn)換成lib,讓vc6鏈接上。當然還要加上yasm編譯的很多匯編obj.
17. 有興趣的,可以繼續(xù)以此方法編譯x264庫,官方最新代碼MMX版也可以順利通過。
普通jpeg
8x8塊編碼DCT,熵編碼=Huffman,
jpeg2000
有小波浮點或整數(shù)兩種變換算法, 熵編碼=MQ-Code,中等壓縮比有良好的表現(xiàn),衍生格式為ecw,用于壓縮衛(wèi)星圖片。
jpeg-xr
john carmack在rage資源中使用的格式,他推薦的一般都不會差。微軟定義的開源算法,比jpeg2000有所進化,主要改進有DCT塊的層次保存格式,塊之間后期接縫處理。有無損和有損模式,適合長期保存游戲貼圖。
h264 iframe
使用單幀內(nèi)預測技術(shù),圖片越大,越能體現(xiàn)超強的壓縮比。熵編碼=Gobomb-Code
其他一些游戲壓縮格式:
pvrtx
iphone壓縮格式, 效果比較理想,不開源。
etc1
android中普遍的壓縮格式。
dxt1, dxt3, dxt5
早期的經(jīng)典格式, 采用塊狀分割,恒定壓縮比,適合二次壓縮。
bc6, bc7
被微軟強化的dx10壓縮格式,和dxt1一個壓縮比,圖片質(zhì)量非常好。
其他非游戲壓縮格式:
1. 圖片掃描文件二值壓縮格式, JB2(djvu), JBIG2(pdf), TIFF C4
2. 數(shù)碼相機里RAW壓縮格式, 用于近無損壓縮,大部分廠商都有自己的定義:Epson ERF, SGI Log24, Nikon NEF, Kodak DCR, Pentax PEF等
-------------------------
1:100的圖片壓縮效果對比
游戲貼圖壓縮質(zhì)量對比圖
所有涉及圖片放大縮小,旋轉(zhuǎn)或圖片扭曲的操作,都會有Resample. 而插值算法,就是為了減少走樣而。其中又分卷積和后置濾波。
1. 卷積,通常在源圖片空間采樣,但有時候warp算法復雜(比如RBF徑向基函數(shù)),造成像素在源圖片空間縱橫比例不同,往往用后置濾波更簡單。以下對比是1:1對象空間的旋轉(zhuǎn)變換。
原圖如下,目標質(zhì)量對比圖為中心旋轉(zhuǎn)5度,重復72次,正好360度恢復原樣。
crysis2 dx9一幀渲染流程:
1. TestCooperativeLevel()
2. 設(shè)置n-patch細分等級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 細節(jié)(BW)
10.6 細節(jié)(AW)
10.7 皮膚生成
10.8 皮膚應用
11. 半透明物體繪制。
11.1 霧
12. Glow Gen(光暈生成)
13. HDR Post Proesss
13.1 Motion Blur, 運動模糊
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)試信息
網(wǎng)上開源RSA實現(xiàn)庫:
openssl 強大的工具集合
crypto++ 過于復雜的封裝,特別是rsa實現(xiàn)模塊。
速度上有優(yōu)勢的:XySSL, CyaSSL(都使用的LibTomMath)
邏輯上有優(yōu)勢的:axcrypto, raknet
還有一些大數(shù)庫: vlong,WinNTL
對于公鑰簽名認證, google android自帶的libmincrypt有超快的實現(xiàn)方法,可惜代碼只是為了一家優(yōu)化,僅提供e=3的加速。而網(wǎng)上通常的ASN.1證書,都用了e=63357。
當QQ群聊天記錄日積月累,達到一定數(shù)量級的時候,要查找某些單一文字,往往會花費10幾秒甚至幾分鐘才有反應。除去磁盤讀取的時間,是否對聊天記錄做一個全局索引也是個重要的優(yōu)化,這篇文章就是為了優(yōu)化文本查找速度,介紹一個最簡單的方法。
試著把QQ每條聊天記錄看成SQL里單一記錄,對單條記錄做全文索引。這里用的方法是bit位快速匹配。假設(shè)一條聊天記錄是"test", 轉(zhuǎn)換成16進制,就是"74 65 73 74", 對單條記錄,定義196位bit空間(占用24字節(jié)),定義為數(shù)組A, 然后按bit層(注意不是字節(jié))做or操作: (A = A or N, 把A的第N個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】
使用時,給需要查找的字符串建立相同大小的bit索引B,對查找數(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é)果為空(完全沒有交集),則可以快速跳過這條記錄,而不用去判斷實際內(nèi)容中是否包含了查找文本。
if (B & A)
{
// 兩者索引存在交集,有一定的可能性,處理進一步文字查找操作。
}
else
{
// 兩者不可能有包含關(guān)系,直接跳過本條記錄內(nèi)容,判斷數(shù)據(jù)庫下一條記錄。
}
原理很簡單,就是求兩者的交集,但往往簡單的索引,能帶來意想不到的速度提升。實際測試中,只要輸入的查找文本比較短小,大約30%~60%上下浮動的數(shù)據(jù)都能直接略過,大大節(jié)省了查找總耗時。
本人實現(xiàn)中,中文的查找方法相當于兩個單字節(jié)的英文,為了最大效率利用空間,用算法把中文每個BYTE都壓縮在196bit之內(nèi)。
加入比較的4種方法有:
1. 快速高斯模糊。
2. 二次Summed Area Table Blur(適合gpu, 常用于DOF,http://www.gamasutra.com/view/feature/3102/four_tricks_for_fast_blurring_in_.php)
3. Alpha Blur(motionblur變種,優(yōu)化過后的算法,嚴重依賴相鄰像素之間累積關(guān)系,不適合gpu, http://freespace.virgin.net/hugo.elias/graphics/x_motion.htm)
4. SuperFastBoxBlur(http://incubator.quasimondo.com/processing/superfast_blur.php)
其中,這四種方法內(nèi),除了高斯模糊是O(n)之外,其他都是O(1)效率。也就是說,運算速度和模糊半徑?jīng)]有關(guān)系,只和圖片大小有關(guān)。
圖上時間僅供參考,除了AlphaBlur代碼優(yōu)化過,其它方法僅僅是基本實現(xiàn)原理。SuperFastBoxBlur和SummedAreaTable實際使用中,要比圖上更快些。
以下方法沒有列入比較范圍
1. 直接基于O(n*n)的高斯模糊核,速度太慢。圖上方法采用縱向和橫向高斯核分解。
2. Stack Blur, 比高斯快的方法,并且效果和效率兼?zhèn)洹?http://www.codeproject.com/KB/graphics/blurringwithcuda.aspx)
3. FFT gaussian blur
4. High-Dimensional Gaussian Filtering (bilateral)
5. constant time filters - heat diffusion.(Kass, 2006)
6. constant time filters - SVD, singular value decomposition (Gotsman 1994)
7. SAT衍生出來的一些方法,F(xiàn)ast Filter Spreading,Linear Filters and their Transposes。
---------------------------------------------------
關(guān)于2次Summed Area Table實現(xiàn)。
一次SAT采樣4個點,二次SAT則需要9個點,三次需要16個點,以此類推。并且乘上對應的Weight Function,除以(面積^n, n = 幾次). 詳細公式見:Filtering By Repeated Integration
#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
--------------------
用以上技巧的前提是,這個.H必須被不同的CPP包含兩次以上。
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
27 | 28 | 29 | 30 | 1 | 2 | 3 | |||
4 | 5 | 6 | 7 | 8 | 9 | 10 | |||
11 | 12 | 13 | 14 | 15 | 16 | 17 | |||
18 | 19 | 20 | 21 | 22 | 23 | 24 | |||
25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 |