Лучший способ обнаружения изменений - PullRequest
0 голосов
/ 30 марта 2010

На данный момент я использую метод while (true) для обнаружения изменений в памяти. Проблема в том, что это убивает производительность приложений. У меня есть список из 30 указателей, которые нужно проверить как можно быстрее на наличие изменений, не жертвуя при этом огромной потерей производительности. У кого-нибудь есть идеи по этому поводу?

РЕДАКТИРОВАТЬ ** Идея состоит в том, чтобы обнаружить изменения в памяти, вызванные определенными приложениями во время запуска онлайн-игры-стрелялки. На самом деле это не античит, но в том же духе.

memScan = new Thread(ScanMem);

public static void ScanMem()
        {            
            int i = addy.Length;
            while (true)
            {
                Thread.Sleep(30000); //I do this to cut down on cpu usage
                for (int j = 0; j < i; j++)
                {
                    string[] values = addy[j].Split(new char[] { Convert.ToChar(",") });
                    //MessageBox.Show(values[2]);
                    try
                    {
                        if (Memory.Scanner.getIntFromMem(hwnd, (IntPtr)Convert.ToInt32(values[0], 16), 32).ToString() != values[1].ToString())
                        {
                            //Ok, it changed lets do our work
                            //work 
                            if (Globals.Working)
                                return;                            
                            SomeFunction("Results: " + values[2].ToString(), "Memory");
                            Globals.Working = true;
                        }//end if
                    }//end try
                    catch { }
                }//end for
            }//end while
        }//end void

Ответы [ 4 ]

3 голосов
/ 30 марта 2010

зачем перебирать указатели, чтобы найти изменения? почему бы не использовать механизм, основанный на событиях?

Полагаю, указатели указывают на класс? пусть этот класс вызывает событие каждый раз, когда он становится «грязным», а затем имеет класс супервизора, который контролирует классы и обрабатывает любые возникающие события.

2 голосов
/ 30 марта 2010

Вам не нужно проверять все элементы одновременно. Вы можете реализовать конвейерную обработку. Так что на каждой итерации вы проверяете только один элемент за раз. Таким образом, вы не столкнетесь с какими-либо проблемами, связанными с производительностью, и закончите проверку всех элементов за 30 итераций. Так что просто уменьшите ваш сон и переместите его во внутренний цикл for, как показано ниже. Я думаю, должно улучшить вашу производительность.

memScan = new Thread(ScanMem);

public static void ScanMem()
    {            
        int i = addy.Length;

        while (true)
        {
            for (int j = 0; j < i; j++)
            {

                Thread.Sleep(10000); // Reduce sleep

                string[] values = addy[j].Split(new char[] { Convert.ToChar(",") });
                //MessageBox.Show(values[2]);
                try
                {
                    if (Memory.Scanner.getIntFromMem(hwnd, (IntPtr)Convert.ToInt32(values[0], 16), 32).ToString() != values[1].ToString())
                    {
                        //Ok, it changed lets do our work
                        //work 
                        if (Globals.Working)
                            return;                            
                        SomeFunction("Results: " + values[2].ToString(), "Memory");
                        Globals.Working = true;
                    }//end if
                }//end try
                catch { }
            }//end for
        }//end while
    }//end void
1 голос
/ 30 марта 2010

Переменная j цикла используется только для выбора из addy . Возможно, помимо опроса, было бы неплохо изменить для () на Parallel.For () ?

PS. Я не знаю, насколько «тяжелыми» являются SomeFunction и Memory.Scanner (возможно, они также изменяют некоторое глобальное состояние) и какие другие операции вы выполняете в то же время.

1 голос
/ 30 марта 2010

Предполагая, что нет никакого способа заставить отслеживаемый код перебрасывать события в грязные, это примерно лучшее решение из доступных.

Nit-picking (так как я надеюсь, что они были просто подрезаны для фрагмента):

  • Я надеюсь, что у вас есть веская причина для вызова string.Split внутри цикла, как это. Очевидно, что если переменная addy не меняется, было бы лучше хранить массивы int и использовать это
  • Похоже, сравнение int лучше, чем сравнение строк
  • Я действительно надеюсь, что вы не просто игнорируете подобные исключения

Исправление этих ошибок (при условии, что они могут быть рассмотрены в реальном коде) может значительно снизить производительность. Кроме того, я действительно сомневаюсь, что ваша пауза должна составлять 30 секунд, вы, вероятно, могли бы сократить ЦП почти так же всего за 1 секунду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...