發表文章

Java OpenJDK + OpenJ9 加快啟動時間 speed up java startup time

OpenJ9是另一種JVM implementation 據說效能比HotSpot好 確定的是memory用量較低,CPU效能似乎看跑的程式 (平均HotSpot好像比較好) 啟動速度較快,可以用 -Xshareclasses 打開cache功能 (AOT+JIT),下次Java就不用重新compile class (第一次會比較慢) 我用的是AdoptOpenJDK,最新版本JDK (左邊版本選最下面的,右邊選OpenJ9) https://adoptopenjdk.net/releases.html?jvmVariant=openj9 一般人使用選擇後面沒寫LargeHeap的版本就夠了,那個是給需要大記憶體的程式用 因為電腦加記憶體到16G了,使用上充足就想提高效能 同樣程式編譯成64bit會比32bit記憶體用量多,效能較高,比較HotSpot 32/64bit用量,印象中Chatty多了30%以上 HotSpot 32bit 換到 OpenJ9 64bit,記憶體用量差不多 ,就知道OpenJ9很會省了 啟動Chatty大概4秒吧,以前HotSpot要幾秒不知道,久到我其他程式都開完還沒起來 command line option https://www.eclipse.org/openj9/docs/cmdline_specifying/ 目前我用的參數 (非開發/debug用,只是拿來跑程式,把所有看到會提高效能都開了) -Dcom.ibm.tools.attach.enable=no -Xaggressive -Xnolinenumbers -Xshareclasses -XX:SharedCacheHardLimit1G 加參數的方法可參考 https://craftwarblog.blogspot.com/2017/10/windows-jarjvm-run-jar-file-with-jvm.html https://www.eclipse.org/openj9/docs/xshareclasses/ -Xshareclasses:cacheDir=<directory> C:\Documents and Settings\<username>\Local Setti...

記憶體超頻知識整理, memory overclock

超頻可以提高效能,缺點增加耗電和熱量,減少元件壽命,較不穩定 超頻需要看記憶體,主機板,記憶體控制器 (現在都整合在CPU內) 原生記憶體是指設計時就以JEDEC的標準來做,如果主機板或CPU沒有原生支援該頻率,還是算超頻使用 (不支援的部分算超頻) JEDEC standard DDR4 module 超頻記憶體指的是memory chip非設計給該頻率使用 透過某些方法讓,記憶體以更高頻率運作,應該是透過挑選記憶體顆粒和PCB設計吧,所以穩定性較低,為了提高穩定性通常會提高電壓 同製程技術下,頻率越高產生越多熱量,電壓越低熱量越少 (不同家的無法直接比較) 同時脈CL數低的延遲比較低,速度比較快 耗電量可以參考這個說明 http://www.tpuser.idv.tw/wp/?p=1859 記憶體single rank和dual rank和是不是雙面無關,一般dual rank都做成雙面? ex: 8G的記憶體可能會標示成 1RxN, 2RxN 2R就是dual rank,N我忘記是什麼了,可能是幾個顆粒? 或是bit width? 如果想知道rank是什麼,可以看 https://en.wikipedia.org/wiki/Memory_rank single rank基本上比dual rank好 (除了可能和主機板不相容,大容量可能抓不到) 少一個控制器,速度稍快,耗電量較低,訊號比較不會干擾,超頻空間比較大 主機板也有限制支援的最大rank數 (不是看插幾條記憶體) 目前除了伺服器用DDR4 3200 16G單條都是 2R,應該是成本考量密度沒做上去

防止LavFilter被遊戲使用, blacklist specified application

LavFilter是知名解碼包K-Lite Codec Pack的核心元件 有些遊戲會因為使用到LavFilter來解碼,導致遊戲運作不正常 可能症狀: 無畫面/聲音或異常,遊戲卡住/當掉 解法: 在LavFilter的設定中禁止某個程式使用 資料來源 (K-Lite Codec Pack的FAQ) https://www.codecguide.com/faq_troubleshooting.htm#item8 執行(Win+R) regedit 根據要設定blacklist的元件,先切換到指定位置 (在路徑那條複製貼上按Enter) 選取Blacklist後,按右鍵新增DWORD,名字用程式的執行檔名 (xxx.exe) 加完後點兩下把數值改成1 LAV Video Decoder HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\LAV\ Video \Blacklist LAV Audio Decoder HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\LAV\ Audio \Blacklist LAV Splitter HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\LAV\ Splitter \Blacklist

雀魂顯卡用量過高, Majsoul GPU high load

目前確認是顯卡VRam不夠用,750太舊了只有1G 可以開其他非瀏覽器的程式,逼瀏覽器放出VRam後關掉程式再開 ex: 打開雀魂遊戲前,先開mpc-hc 放影片再關掉來釋放 遊戲內已改成省電模式還是有問題的可以嘗試下面的方法 Windows+Ctrl+Shift+B 重啟顯卡驅動後,瀏覽器重開可以解決 這個熱鍵好像是Win10限定 ? 重啟後,雀魂沒重開瀏覽器前會顯示WebGL錯誤,可以推測出遊戲是用WebGL 可能是遊戲沒寫好,或是顯卡驅動有問題,導致資源無法被釋放 檢驗方式,task manager或是用GPU-Z中GPU用量 以我目前用Nvidia 750,firefox中 GPU會用4x或100%,正常情況下是少於10% 重啟顯卡驅動後就可以看到顯卡VRam和 GPU load降低了 遊戲要重開機才能跑得順的,可以試試看這個方法

Windows API Sets

https://docs.microsoft.com/en-us/windows/desktop/apiindex/windows-apisets An API Set is a strong name for a list of Win32 APIs. The convention for assigning a strong name to an API Set is to use what appears to be a dll name. But the purpose of an API Set is to provide architectural separation between the API Set's name and its associated host DLL implementation for improved portability of your app, so you should think of an API Set's name as just a unique character string, and not as a dll name. For delay load, you use the name of the API Set. 基本上就是一堆長得像 api-ms-win- 的dll Win7好像沒有? (2020就不支援了,不用管?)

關掉Windows10內建防毒, disable windows defender antivirus

關防毒 https://www.windowscentral.com/how-permanently-disable-windows-defender-windows-10 關smartscreen (掃描下載檔案, 可疑網站黑名單) 如果你有另外裝防毒軟體 + 不用IE或Edge 基本上可以關掉省資源 https://www.digitalcitizen.life/how-disable-or-enable-smartscreen-filter-internet-explorer-or-windows-8 內建防毒滿難用的,可設定的參數太少,建議裝一套免費的 如果有裝其他防毒,通常不需要手動關掉內建防毒 https://craftwarblog.blogspot.com/2018/07/personal-free-antivirus.html 不關防毒的情況下,建議設定例外清單的項目,避免影響效能 ex: virtual machine的image和程式 (含android模擬器)

Firefox 設定調整 about:config

http://kb.mozillazine.org/Category:Preferences 讓 Firefox 連線數變多 (然後加快速度) ( from gslin blog) network.http.max-persistent-connections-per-server   改成10 (和Chrome一樣) browser.urlbar.decodeURLsOnCopy 讓網址複製後可以保留文字,不用% escape 其他調過的東西忘了...

程式設定/遊戲紀錄可能位置, program setting/game save folder

不在程式同目錄的話,可能的位置 (可能會有公司名前置) 系統變數參考 https://ss64.com/nt/syntax-variables.html %USERPROFILE% %USERPROFILE%\Documents %USERPROFILE%\AppData 下三個目錄內 %appdata% (就是 %USERPROFILE%\AppData\Roaming) %LOCALAPPDATA%  (就是 %USERPROFILE%\AppData\LocalLow) %LocalAppData%\VirtualStore (少見,通常是安裝在系統目錄的舊程式,不支援UAC的) 也有可能不以檔案形式保存,使用 registry Win + R -> regedit HKEY_CURRENT_USER\Software HKEY_LOCAL_MACHINE\SOFTWARE (通常是不分使用者帳號共用的,整台機器的設定才會在這)

電腦配備選擇CPU, 顯卡GPU, RAM

更新 2019/11/16 只以主流產品和遊戲使用分析,由於產品名稱和代號會改變只提供一般性原則 (懶得隨產品更新),一般所說CP值較好的主流產品約在該系列/該代中間區段,可根據預算做上下修正,或想 玩遊戲/使用程式 的需求調整。 CPU/GPU溫度過高時會自動降低頻率(效能會下降)或關閉部分功能,以減少熱量產生來降溫保護元件,好的散熱可以讓元件在高負載下維持性能。選購時,要注意耗電較高的一般溫度也較高。一般只標示 TDP ,雖然不是使用的電量,一般TDP高的耗電也比較高。 比較產品優劣時,除了最常看的效能排名外,也可以看能源效率,通常標記為每瓦(Watt)效能 CPU Intel CPU和主機板都比較貴,而且腳位常更換,升級或損壞更換比較困難 AMD 都比較便宜,CPU腳位比較不常更換,新舊CPU/主機板間相容性較高 同等效能AMD較便宜,耗電量也不像顯卡品牌差異那麼大 CPU效能排名可用 CPU tier去google tomshardware的排名 https://www.tomshardware.com/reviews/cpu-hierarchy,4312.html 筆電下 mobile CPU tier https://www.notebookcheck.net/Mobile-Processors-Benchmark-List.2436.0.html 下面選項建議調整 Show only notebook CPUs Process(nm) 顯示卡 (GPU是顯示卡核心晶片) 同樣晶片的卡,在用料上有差異造成價差 (散熱,還有板子上的其他元件) 選擇上除了遊戲fps及跑分數字以外,還要看其他功能,例如: 硬體加速(解碼)能用更有效率播放高壓縮的影片檔,如果不支援就得用CPU做軟體解碼 Nvidia 價錢較貴,耗電較低溫度低穩定性較高,硬體壓縮Nvenc比AMD好太多,要實況只推薦Nvidia AMD 比較便宜耗電高溫度高,穩定性和壽命相對較低。考慮電費 + 必需使用更大功率的電源供應器,不推薦,除非有促銷才值得考慮。 遊戲用: Nvidia整體花費可能差不多,使用體驗比較好 應用程式上的表現,AMD跑分比較優秀 (同等級顯卡) 實際的選擇還是要看用途去找評測決定 顯卡效能排名可用 GPU tier去g...

混插頻率/速度不同記憶體, mix different clock memory

圖片
組電腦的時候ram太貴 + 搞錯以為2666是超頻買了Micron Crucial 2400 8G一條 使用上太吃緊了,降價後補上一條Micron Crucial 2666 8G一條 買前確認過2666的會寫入較低頻率的SPD資訊 (確保相容性能開機) 使用的軟體 CPU-Z, SIV64(64位元版本)好像都是免費軟體 看兩條記憶體的SPD資訊 同一條記憶體運作需要的時間 (latency/clock) ,在不同頻率下很接近,假設為相同就好了 無修正時開機,bios會抓全部中latency最大的數字以保證相容性,效能會降低 因為latency比較大是在較高clock下,較低clock時可以跑較低latency數 分子不變下,分母的clock變低,運作時間就變長 去bios把數值調成和2400的單條使用時相同,回復效能 (假設2666在2400下應該能跑到同樣的latency,非超頻的JEDEC標準記憶體應該都能相容JEDEC低頻率標準) 如果沒記各條的數值,可以直接參考SPD填入 (比較新的主機板在bios內也可以看SPD) 簡單說就是設定成全部記憶體中頻率最慢那條的數值 tRC不知為何單條2400時抓到56的數值,SPD是寫55 (自動比SPD多1) 調成55使用了一段時間,似乎系統有機會不穩定 改回56,這好像是AMD的限制? 必須是偶數,反正55, 56效能差別很小,就讓系統決定吧 SPD好像有更詳細的其他資訊,bios裡面都是auto,沒有寫抓到多少 主要參數都修正了,剩下懶得自己調整,也許會損失一點效能吧

Win10 虛擬桌面, virtual desktop

可把相關的程式放在不同桌面,方便管理 可惜桌面上的檔案/目錄/連結是共用的 實況軟體 (ex: OBS) 只能擷取非最小化的視窗,放在虛擬桌面也可以被抓到,同時不影響主桌面,可以放點歌的播放器,或是實況的dashboard https://support.microsoft.com/en-us/help/4028538/windows-10-multiple-desktops https://www.howtogeek.com/197625/how-to-use-virtual-desktops-in-windows-10/ 圖形介面的用法看上面 記錄一下常用的熱鍵 Win + Tab  Task View,可管理各個桌面,如果只有一個桌面就會顯示全部程式 Win + Ctrl + D 開新桌面 Win + Ctrl + F4 關桌面 Win + Ctrl + 左/右 切換桌面

安裝OpenAL installation

OpenAL是3D聲音的函式庫,沒安裝有些遊戲會不能玩,或是缺少部分聲音效果 https://en.wikipedia.org/wiki/OpenAL 先安裝OpenAL SI(sample implementation) 下載OpenAL 1.1 Windows Installer (zip),解開執行安裝 https://www.openal.org/downloads/ OpenAL SI 很久沒更新已經不建議安裝了,現在建議的安裝方法為 安裝OpenAL Soft (要先安裝上面的才有作用,算是延伸功能) 下載檔案 (Win32 and Win64 binaries are also provided下面 -bin.zip的那個檔) https://www.openal-soft.org/#download 解開後把對應目錄的dll檔案複製進Windows的資料夾 (只提供64位元系統安裝法) router\Win32 bin\Win32 複製到 %SystemRoot%\SysWOW64 router\Win64 bin\Win64 複製到 %SystemRoot%\System32 不要router的話,router目錄內的檔案不要複製 bin\Win32  改名成OpenAL32.dll 複製到 %SystemRoot%\SysWOW64 bin\Win64 改名成OpenAL32.dll 複製到 %SystemRoot%\System32

Is it possible to store the address of a label in a variable and use goto to jump to it?

http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html https://stackoverflow.com/questions/6421433/address-of-labels-msvc gcc有,MSVC不支援 只想拿來給switch case用 與其用enum存再switch,不如直接存address用goto,或許會稍微快一點? 沒研究過CPU branch prediction和indirect branch怎麼做的,無法確定 function pointer也能達成類似的效果,可是function call cost應該比較高

long path on win10

https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/ 舊的 MAX_PATH 好像是260字的限制 真的會需要解放那麼長的path嗎? 有些壓縮檔解開後,有很多層目錄,檔名又長的,就會需要 https://www.howtogeek.com/266621/how-to-make-windows-10-accept-file-paths-over-260-characters/

NightBot 設定,關掉過濾連結和符號

全部設定都可以在網頁上修改 只列出幾個新手會困擾的設定 關掉擋連結 !filters links disable 關掉擋符號,顏文字之類的會被擋 !filters symbols disable 如果要打開就把disable改成enable 如果要修改指令,建議還是用網頁介面比較方便

吉里吉里 (きりきり, KiriKiri) 的設定檔 (.cf, .cfu)

吉里吉里引擎的遊戲 特徵遊戲目錄下通常會有的檔案 .xp3 (data.xp3, patch.xp3...etc) .cf (設定檔,主檔名和遊戲一樣) .cfu (使用者設定檔, 在記錄檔資料夾save內,エンジン設定修改後存放在這) 裝完新遊戲,我會先套用的設定 https://mega.nz/#!ss0nEYib!sL2Vuq_fDUI2dQtuIKyalQ1wWFyK_PWi5m88kLGClOI 接著看遊戲有沒有提供修改引擎設定 通常叫 エンジン設定.exe, SupportTools.exe,可用來修改 .cfu 改完後,我會把.cfu的內容整合進.cf,再砍掉.cfu 部分設定說明 (能從設定檔修改的,依遊戲而異) ; 該行表示註解 執行檔同名.cf save folder內 .cfu ; save存在遊戲資料夾, 因為我覺得紀錄另外放要管理很麻煩, 這個只有改.cf有效 datapath="\x24\x28\x65\x78\x65\x70\x61\x74\x68\x29\x2f\x73\x61\x76\x65\x64\x61\x74\x61" ; 關joypad joypad="\x6E\x6F" ; 聲音輸出時降bgm音量 bgmdownbyvoice="\x38\x35" ; jpgeg解碼 high jpegdec="\x68\x69\x67\x68" ; 等垂直同步 waitvsync="\x79\x65\x73" ; voice下一句不停, voice click no stop voicestopbyclick="\x6E\x6F" ; 關掉mouse wheel wheel="\x6E\x6F"

遊戲FPS和螢幕畫面更新率(Refresh Rate), VSync, G-Sync, FreeSync, Adaptive Sync

圖片
2022/8/19 更新 顯卡輸出畫面的速度(遊戲的FPS) 和顯示器更新的速度不同會有問題 顯卡較快: 畫面撕裂 (Screen Tearing) 及浪費資源 (frame無法全部顯示在螢幕上,顯卡和CPU用量增加更耗電,溫度較高,加快壽命耗損) 顯卡較慢: 畫面不順 我的第一張顯卡,在沒限制FPS的情況下,玩遊戲兩天燒掉,換新貨 (應該是劣質品) 影片畫面可參考 https://sites.google.com/view/twmonitors/%E7%9B%B8%E9%97%9C%E7%9F%A5%E8%AD%98/gsync-freesync 有以下四種解決方案 1. 無特殊硬體 (螢幕及顯卡) V-Sync犧牲顯卡的輸出去配合螢幕的速度 或No-Sync不限制 (可減少畫面延遲),建議限制比螢幕高的FPS (到一個數值後再提高就很難感到差異,可是消耗更多資源去運算,不值得) 怎麼設比較好? 要看個人體驗 在60的螢幕上,我用的設定是兩倍=120 (根據螢幕和個人感覺調整) 下面兩種可動態調整更新速度,解決上面的問題 (需要支援的顯卡和螢幕) 會稍微提高latency (應該是不影響體驗的程度?) 螢幕可能要打開variable refresh的選項 (free-sync/g-sync,設定的名字不一定) 遊戲設定記得要關掉VSync(垂直同步),FPS限制關掉或大於等於螢幕,否則沒效 2. G-Sync Nvidia專利,原生支援的螢幕比較貴 (必須向Nvidia購買G-Sync模組) 因為支援FreeSync的螢幕比較多,所以Nvidia決定修改驅動程式,讓顯卡能夠透過軟體使用G-Sync在只支援FreeSync的螢幕上 (效果應該比原生硬體支援G-Sync差?) 要購買FreeSync螢幕,建議先查詢能不能和G-Sync相容 Nvidia的認證清單,沒列的是未達標準,請自行上網查詢看要不要買 https://www.nvidia.com/en-us/geforce/products/g-sync-monitors/specs/ 支援的介面只有DisplayPort(DP) 1.2 以後 聽說用HDMI使用 Adaptive-Sync 是AMD的專利,NV不能用 (未確認) 開啟方法 ...

Windows console(cmd.exe) 中文輸入/輸出, utf-8 encoding input/output

由於想玩日文遊戲,系統locale為日文 (code page 932),可能這樣中文才有問題,未確認 Windows console (cmd.exe) 下要輸出輸入非ansi文字需要先做設定 先講寫程式時要如何輸出 要先改變stdout的輸出模式,否則直接使用wcout會只能輸出ansi _setmode(_fileno(stdout), _O_WTEXT); 接下來的wcout都沒問題了 (只需要設定一次模式) 這個問題是我在開發 暫停程式 時遇到的 https://craftwarblog.blogspot.com/2017/12/suspend-process-replacing-pssuspendexe.html 用console輸出的程式都會有一個cmd在 (~6.xMB),總記憶體用量會比預期大 但啟動速度比較快 (因為OS會快取 cmd.exe?) 輸入給程式時的編碼要用chcp改變 改成utf-8的方法 chcp 65001 到win10 1803都還有下面的問題 在使用cmd script執行的時候,如果cmd檔不是ansi必須在第一行用chcp改變編碼 否則cmd.exe會讀取script檔錯誤 (這個我除錯很久才發現) 而且utf-8 BOM會出錯,不能有BOM 如果是直接在cmd下打指令似乎沒這個限制

IPC(inter-process communication)的選擇

http://pages.cs.wisc.edu/~adityav/Evaluation_of_Inter_Process_Communication_Mechanisms.pdf 雖然是2007古老的資料,系統也不是M$,應該沒差太多 基本上效能 shared memory > pipe > socket 除了在低資料量時pipe效能 > shared memory,差距看起來也不大 猜測,大概是lock消耗在空間小的時候,會比生出一塊記憶體高 shared memory要自己做lock控制比較麻煩 pipe只能1對1 Windows上還有其他方法 https://docs.microsoft.com/en-us/windows/desktop/ipc/interprocess-communications

尋找替代程式 alternativeto (ex: 記事本notepad可用Notepad++替代)

https://alternativeto.net 可以用來搜尋替代程式 (找商業軟體的免費替代,或比較同性質軟體) 在搜尋打入程式名後,選擇你想找哪個程式的替代程式 每個軟體還有使用者投票和評論可以參考 例如Windows內建的記事本(notepad)的替代品,可以找到 https://alternativeto.net/software/notepad/ Notepad++票數有壓倒性優勢應該會比較好用 自動判斷檔案編碼 處理不同系統的換行字元 (文字不會變成只有一行) 可安裝plugin擴充功能