и скорости перебору это не добавит
...если работать на 486DX, а если стоит Искра 1030, то о каком-либо переборе вообще можно забыть...
проблему в скорости работы алгоритма для подобных задач (с подобным объемом данных) можно и не поднимать.
даже если, ради эксперимента, получать данные о луте при помощи такого цикла
found := 0;
for i := 0 to 767 do
begin
ReadProcessMemory(Hdl, PTR + i*4, @LootPTR, 4, BytesRead);
if LootPTR <> 0 then
begin
ReadProcessMemory(Hdl, …., @LootData, 4, BytesRead);
…..
inc(found);
if found = count then // если число найденных = общем числу, остановить перебор
break;
end;
end;
не будет никаких явных задержек.
Убрав «if found = count then» из цикла, получим напрасное расходование ресурсов, особенно, когда в массиве несколько элементов;
Если есть возражения по данному пункту, предоставьте сравнение быстродействия алгоритмов, где видно, что скорость различается не на микросекунды, а, хотя бы, на десятки миллисекунд.
в перечень предметов не попадут
не подпадут любые значения, если в данный момент производится запись данных в массив из другого потока.
В любом случае, бессмысленно получать данные о луте чаще одного раза в секунду-- 2010-07-26, 04:54 --
Дабы не быть голословным, вот два цикла, в которых идет поиск 10000 элементов, случайно разбросанных по массиву из 100000 элементов.
// заполняем случайные ячейки RandArray
for I := 0 to 10000 do
begin
num := RandomRange(0,100000);
if RandArray[num] = 0 then
RandArray[num] := 1;
end;
// перебор всего массива
for I := 0 to 100000 do
begin
if RandArray[i] <> 0 then
FoundArray[i] := 1;
end;
// останавливаем перебор, если найдены все 10000 значений
found := 0;
for I := 0 to 100000 do
begin
if RandArray[i] <> 0 then
begin
FoundArray[i] := 1;
inc(found);
if found = 10000 then
break;
end;
end;
Результат выполнения:
0,112 мс – первый алгоритм
0,015 мс – второй алгоритм
учтите, что затраченное время измеряется в миллисекундах.
Тест был сделан:
Windows XP SP3
Core 2 Duo E8400 1966 MHz
2048 Мб (DDR3-1333 DDR3 SDRAM)