語言:C#
平臺:Windows
運行環境:.Net Framework
IDE:Visual Studio Community 2019
某賽車游戲使用config.ini檔案作為軟體組態檔,玩家在玩游戲程序中常常需要更改一些設定,其中包括更改/設定游戲幀率。大部分設定都可以在游戲設定界面內完成。關于幀數的設定,游戲界面并沒有給出,然而這又是最重要的游戲引數之一,追求游戲性能和體驗的玩家,包括職業玩家、主播、平民玩家都需要常常更改這一引數。
一般情況下,玩家修改幀數可以打開Windows檔案資源管理器,然后找到游戲的組態檔目錄,找到組態檔config.ini,用記事本打開,然后將其中的配置項比如“Framelimit=30”改成“Framelimit=38”,最后點擊保存。
我自己也是該游戲玩家之一。因覺得這個程序需要多次點擊,步驟稍顯麻煩,就想寫個小工具使用。寫出來的程式能完美運行,然而打開任務管理器一看,更改ComboBox中的Text時候,程式占用的記憶體會上升。雖然占用的記憶體不大,只有幾M,每次記憶體提高也只有幾kB,但是強迫癥的我還是想把記憶體攀升的原因弄明白。
整個程式的代碼有數百行,為節省本文篇幅,以下僅貼出相關片段,如果還需要其他片段再在評論區貼出:
private void ComboBox1_TextChanged(object sender, EventArgs e)
{
string ConfigFilePath = GetConfigFilePath(); // 獲取玩家需要修改幀數的組態檔路徑
if (File.Exists(ConfigFilePath))
{
try
{
pictureBox3.Visible = true; // 顯示組態檔的圖示,用戶點擊后可以用記事本改幀數
// 將組態檔中關于幀數的值放到TextBox內供用戶修改
TextBoxesGetValues(ConfigFilePath);
// 讀取組態檔中是否隱藏寵物的引數
string LoverPetShowFlag = ReadValueFromIniFile(Section, strLoverPetShowFlag, "null", ConfigFilePath);
if (LoverPetShowFlag == "0")
{
checkBox1.CheckState = CheckState.Checked; // 隱藏寵物
}
else
{
checkBox1.CheckState = CheckState.Unchecked; // 顯示寵物
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else
{
pictureBox3.Visible = false;
EmptyValueTextBoxes();
}
}
private void EmptyValueTextBoxes()
{
textBox1.Text = "";
textBox2.Text = "";
textBox3.Text = "";
}
private void TextBoxesGetValues(string iniFilePath)
{
textBox1.Text = ReadValueFromIniFile(Section, strFramelimit, "null", iniFilePath);
textBox2.Text = ReadValueFromIniFile(Section, strOutdoorFramelimit, "null", iniFilePath);
textBox3.Text = ReadValueFromIniFile(Section, strDanceFramelimit, "null", iniFilePath);
}
private string GetConfigFilePath()
{
StringBuilder sb = new StringBuilder();
sb.Append(QQSpeedDirectoryPath);
sb.Append(@"\");
sb.Append(comboBox1.Text);
sb.Append(@"\配置\config.ini");
return sb.ToString();
}
ComboBox中存放的是游戲賬號,賬號有多個的時候,可以用鍵盤上的上下箭頭切換顯示不同的賬號。就是在這里,當改變ComboBox的Text時,程式占用的記憶體會上升,大約ComboBox.Text每改變5次,記憶體就增加1M。
是不是代碼中缺少了資源釋放相關的指令,還是現有代碼寫法不規范,還請大佬們解惑!本人是個編程小白,對C#的代碼規范、運行機制、記憶體管理什么的不是很了解。上述代碼中GetConfigFilePath()函式還是特意弄的,因為一開始是用“+”文本連接符獲取組態檔路徑的,后來網上查了說這樣會導致String在記憶體中的復制,于是改用StringBuilder方法,沒想到這樣還是存在記憶體上升的問題。
在此向各位前輩們求助,望指點一二。跪謝!
uj5u.com熱心網友回復:
ReadValueFromIniFile 怎么實作的,里面用到非托管記憶體或者實作了 IDispose 的物件,要釋放。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/8459.html
標籤:C#
