Программа для нажатия клавиш

Теория и практика Diablo 3
Добрый день всем.

Написал на C# программу для регулярного нажатия клавиш по расписанию.
Она незаменима при игре за монаха-саппорта. Может быть использована и в других случаях.
На форуме уже есть программа с подобным функционалом, однако мне его сильно не хватало, и я написал свою.

Изображение
Картинки предыдущих версий
Изображение
ИзображениеИзображениеИзображение
Изображение
Изображение
Изображение
Изображение
Изображение
Изображение
Изображение
Изображение
Изображение
Изображение
Изменения версий
Update 17.05.2016 (14:40):

1. Добавлены три профиля в общий список (всего их стало девять).
2. Исправлена ошибка с сохранением клавиш для разного вида пауз в настройках.
3. Значительно изменена система прожатия по кулдауну. Теперь всё работает намного точнее.
4. Увеличено влияние настройки "Задержка кулдауна" на точность его прожатия.
5. Добавлена поддержка соотношения сторон экрана 5:4 для прожатия по кулдауну, улучшена работа режимов 16:10 и 16:9.
6. Добавлен новый режим "Кдр+сек". Прожатие по кулдауну, но не раньше установленного времени.
7. Теперь опция "Процесс/зажатие" по умолчанию активирована.
8. Добавлены подсказки по наведению мыши на все активные пункты.
9. Сделано описание функций в виде страницы помощи, ссылка на которую будет доступна из программы (открывается в браузере).
10. Добавлена обработка прожатия скиллов с "золотыми рамками", чтобы прожимались только в случае необходимости.
11. Добавлена возможность выбора типа прожатия для тех, у кого стандарт не работает точно.
12. Переработан интерфейс, исправлены ошибки и недоработки.


Update 16.09.2015 (13:30):

1. Поправлена работа программы в x86 системах (32 бита).
2. Поправлена работа зажатия/прожатия кнопок.
3. Поправлена работа прожатия по кулдауну, в том числе при разрешении 1366х768.
4. Добавлена настройка задержки при работе кулдауна. Корректировка позволяет подстроить точность прожатия под конкретные условия.
5. Переработана и улучшена система проверки выставленных клавиш, триггеров, настроек.
6. Переработана система сохранения настроек.
7. Переработана система выбора триггеров. Их теперь можно назначать произвольно, а также выбирать зажат или нажат должен быть триггер.
8. Переработан интерфейс, исправлены ошибки и недоработки.


Update 28.08.2015 (15:40):

1. Введён принципиально новый режим автоматического прожима скиллов по кулдауну без указания времени. Нужен для учёта динамического отката, например, с Гогока.
Режим новый, довольно сложный. Так что жду отзывов по его работе.
Должен работать в разрешении 16:9 и 16:10 (большинство современных мониторов).
Для работы необходимо выбрать процесс и играть в Diablo3 в оконном режиме (можно на весь экран).
Режим работы нажатия (при выборе процесса) теперь выбирается в выпадающем списке возле времени.
Откат проверяется у того скилла, который соответствует порядку клавиши в программе.
То есть триггер 1 - первая кнопка, триггер 5 - левая клавиша мыши.

2. Переработана и улучшена система проверки выставленных клавиш, триггеров, настроек.
3. Индикаторы триггеров в окне программы теперь переключаются всегда.
4. Добавлена возможность сброса всех триггеров (двойной щелчок правой клавиши в любой пустой области программы).
5. Поправлена ошибка с обработкой клавиш с пустым временем (зажатие или кулдаун).
6. При запуске работы по нажатию на Start теперь блокируются все кнопки, включая Save/Load.
7. Количество профилей увеличено до 6. Горячими клавишами переключаются первые 3.
8. Переработан интерфейс, исправлены ошибки и недоработки.


Update 19.05.2015 (13:41):
1. Сделана индикация триггеров и возможность активировать их мышкой.
2. Сделан выбор файлов с именем программы для персонализации. Если их нет, берутся любые.
3. Добавлена возможность выключить задержки прожатия, путём выставления пустой паузы.
4. Добавлена возможность выбора задержки после нажатия Enter (раньше была строго 30 секунд).
5. Добавлено сохранение позиции окна программы.
6. Сделаны глобальными настройки положения окна, хоткеев профилей/запуска.
7. Поправлена ошибка, препятствующая запуску программы сразу в свёрнутом виде.
8. Переработан интерфейс, исправлены ошибки и недоработки.


Update 30.04.2015 (15:15):
1. Добавлена пауза для карты. Принцип работы такой же, как у телепорта.
2. Сделана подстановка по-умолчанию имени профиля при сохранении в файл.
3. Добавлена опция персонализации интерфейса. В директорию программы можно положить:
  • ico-файл: меняется иконка.
  • jpg-файл (465x261): меняется фон.
  • txt-файл (первая строка): меняется заголовок окна.
4. Кардинально улучшена система предупреждений об ошибках (отсутствие пауз, триггеров, отсутствие выбранного процесса, пересечение глобальных хоткеев).
5. Добавлено меню по нажатию правой клавиши мыши на иконку в трее: Start/Stop и Exit.
6. Сделан выбор "Процесс" или "Область действия" в настройках (называется Процесс/Зажатие).
В том числе, это позволяет запретить запуск программы без выбора процесса.
7. Добавлена возможность проверки обновления версии.
По нажатию на соответствующий пункт и/или при старте программы (при установке галочки).
8. Добавлена возможность назначать произвольные клавиши для прожатия, а также для карты/телепорта/остановки по кнопке. Активируется возможность при использовании пункта "Выбор..." или нажатием правой клавишей мыши на элемент выбора кнопки.
9. Переработан интерфейс, исправлены ошибки и недоработки.


Update 10.04.2015 (10:15):
1. Добавлена возможность именования профилей.
2. Добавлены горячие клавиши для быстрого переключения профилей, в том числе запущенных.
3. Добавлена возможность остановки по ЛКМ при прожиме Shift+ЛКМ.
4. Добавлена возможность продления паузы при уже запущенной паузе.
5. Добавлен автоматический выбор процесса Diablo3, если это возможно.
6. Переработан интерфейс, исправлены ошибки и недоработки.


Update 25.03.2015 (17:45):
1. Использование альтернативной системы отправки клавиш, при выборе процесса.
В целом переработана система отправки нажатия/зажатия клавиш в процесс.
Результат должен быть идентичен варианту с выбором области действия, но при появлении каких-то проблем с нажатиями в режиме без выбора процесса, попробуйте выбрать его и протестировать.
Для программистов: отличная библиотека "Shynd's PostMessage".

2. Добавлена работа с неактивным окном (окном без фокуса).
При выборе процесса нажатие /зажатие клавиш будут передаваться даже в неактивное окно.
3. Добавлена опция Save/Load.
Она позволяет сохранять любое количество профилей в файлы и загружать из них.
4. Добавлена опция случайной задержки.
Она позволяет прожимать кнопки через рандомные интервалы времени.
Например, вы установили интервал прожатия 5000мс и рандомное прожатие 1000мс.
Будет прожиматься кнопка каждый раз в интервале от 4000мс до 6000мс. То есть +-1000мс.

5. Доабавлено "автоотжатие" входа в чат (Enter).
После нажатия Enter (вход в чат) включается таймер. Если за ~30 секунд вы его не нажали ещё раз, считается, что Enter отжат и скиллы продолжают прожиматься. Нужно это для предотвращения ситуаций, когда отправлять сообщение передумали, а кнопки прожиматься прекратили, что может вызвать недоумение.
6. Изменена логика работы прерывания работы.
Любое прерывание прожатий (телепорт, Enter, отдельная кнопка для "Скакуна", например) теперь запоминает время, оставшееся до следующего прожатия.
После окончания интервала ожидания, скиллы будут прожиматься с корректной задержкой.

7. Переработан интерфейс, исправлены ошибки и недоработки.


Update 20.03.2015 (14:20):
1. Зажатие клавиш стало опциональным.
Для работы требуется выбор процесса с игрой.
То есть, зажатие будет работать, только если программу стартовать после запуска Diablo3.

2. Добавлена возможность передавать зажатие клавиш в неактивное окно.
3. Добавлена опция мультипрожатия (тройное прожатие клавиш).
4. Исправлены мелкие недоработки.


Update 19.03.2015 (12:20):
1. Добавлена опция зажатия клавиш.
После долгих поисков, решение было найдено на stackoverflow.
2. Добавлены клавиши мыши в список клавиш с паузой.
3. Исправлена работа этой клавиши.
4. Исправлены мелкие недоработки.


Update 17.03.2015 (09:30):
1. Настройки программы вынесены в отдельное меню.
2. Сворачивание в трей сделано опциональным.
3. Мультизапуск (несколько копий программы) также сделан опциональным.
4. Добавлена настройки дополнительной клавиши с паузой (например, для прожатия Скакуна у Крестоносца).
5. Сделано сохранение всех настроек и профиля при выходе из меню настроек (или запуске процесса).
6. Исправлены мелкие недоработки.


Update 13.03.2015 (16:30):
1. Добавлена возможность прожатия Shift + Mouse Click.
2. Реализовано сворачивание программы в трей.
3. Оптимизирован код, исправлены мелкие недочёты.


Update 12.03.2015 (17:14):
1. Добавлена возможность работы в выбранном процессе (отбор среди процессов >400Мб в памяти).
2. Исправлены незначительные ошибки.
3. Оптимизирован код.


Update 06.03.2015 (15:33):
1. Добавлен Space (пробел) в кнопки для использования.
2. Добавлены две клавиши для прожатия.
3. Добавлены настройки хоткея запуска / хоткея телепорта / задержки телепорта.
4. Исправлены ошибки в обработке T/Enter.


Update 05.03.2015 (10:34):
1. Добавил LMouse и RMouse в кнопки для использования.
2. Заблокировал возможность разворачивать окно.
3. Подсказку при наведении на Start/Stop дополнил и починил перевод.
4. Поправил подписи к клавишам на русском.
5. Исправил ошибки в обработке T/Enter.
6. Добавил возможность сохранять профили локально.

Три профиля, если выходишь из программы при активном профиле: он сохраняется.
Если файл профиля существует, то его настройки перезаписываются при смене профилей (не только при выходе).

Программа позволяет запускать повторяющийся цикл прожатия клавиш.

Например, у вас есть монах-саппорт и вы хотите постоянно прожимать:
  каждые 4.7 секунды Покой, на цифре 2 в игре, каждые 15 секунд Прозрение, на цифре 3.
А ещё хотите при зажатом Shift прожимать:
  каждые 3 секунды мантру, на цифре 1, каждые 5 секунд Святую святых, на цифре 4.

Также вы хотите, чтобы при открытии чата вы могли спокойно писать, а не забивать его цифрами.
Ещё было бы неплохо, если бы телепорт в город не прерывался перекастовыванием мантры.

Такой вид примет настроенная программа:
Картинка с настройками
Изображение

Теперь вам осталось нажать F11 (или запустить мышью), а в игре уже активировать/деактивировать постоянные нажатия при помощи кнопки ScrollLock, а нажатия по Shift-у будут срабатывать при его зажатом состоянии.

Основные возможности/отличия от аналогов
1. Индивидуальные настройки для каждой из четырёх кнопок для нажатия.
Каждой кнопке выставляется триггер (Shift, Scroll Lock и т.д.) и время задержки прожатия.
При этом можно, например, все четыре кнопки повесить на один триггер, тогда при его включении будут срабатывать все нажатия с соответствующими задержками (вплоть до 600 секунд - 10 минут).

2. Единственный переключатель для запуска/остановки.
Может запускаться из игры (или любого приложения) при помощи глобальной горячей клавиши F11.
Можно останавливать/запускать как выполнение всех потоков по клавише F11, так и любого конкретного, по нажатию соответствующей кнопки-триггера.

3. Возможность выбора области действия. Программа может работать как во всех приложениях, так и только в Diablo3 (я использую оконный режим).

4. Возможность выбора вариантов приостановки работы:
Без приостановки.
Приостановка на 7-8 секунд по нажатию на "T" - телепорт в город.
Приостановка по нажатию на "Enter" (окно чата), по вторичному нажатию "Enter" работа возобновляется.
Приостановка по нажатию на "T" или "Enter".

5. Возможность смены языка программы.

Ссылки для программистов
1. Перехватывание нажатий клавиатуры: библиотека keyboard hook.
Используется в программе для "отлавливания" нажатий на Enter / T.
2. Нажатие клавиш клавиатуры: библиотека windows input.
Используется в программе для нажатия на клавиши "1", "2", "3", "4" и т.д.
3. Глобальные горячие клавиши: описание метода.
Используется в программе для отрабатывания нажатия F11.
4. Таймеры: описание метода.
Используются в программе для периодического нажатия на клавиши.
5. Отправка сообщений в приложения: библиотека "Shynd's PostMessage".
Используются наработки в программе при выборе процесса.
6. Исходные коды программы на GitHub.

Замечания о безопасности
1. Программу вы свободно можете проверить на сайте VirusTotal.
2. Никаких данных в сеть программа не передаёт и не получает, это можно проверить любым фаерволлом.
3. Ссылка на исходные коды есть чуть выше. Качайте, смотрите, проверяйте :)
4. Название программы принципиального значения не имеет. TurboHud известен всем, в том числе и Близзардам, однако ни одного бана за него нет и не было. Потому переживать из-за программы для простого удобства использования многократных нажатий я бы не стал.
5. Тем не менее, напоминаю, программу вы используете на свой страх и риск.
Отвечать за компанию Blizzard я не готов :)


Скачать.
ver 2.4 D3H.exe MD5: FCBDD46309A10D889B71E759DC3EE7AE
прошлые версии
ver 2.3 D3H.exe MD5: 82C6FBD465FA528AEA2543C40655DF16
ver 2.2 D3H.exe MD5: 4806C485D3BDD97015CA73022181DB0A
ver 2.1 D3H.exe MD5: A73B09B24BED258668CF18BC130DD345
ver 2.0 D3H.exe MD5: 757BA4DB2A5E172E868AF6A5314215CD
ver 1.9 D3H.exe MD5: 147B4BC822F8E77B5476CFE900D8212F
ver 1.8 D3H.exe MD5: 282B105143556DDC3DD9B318AF4EDEE7
ver 1.7 D3H.exe MD5: DD40795F2ECCE8D3F7E000A4E04AFA37
ver 1.6 D3H.exe MD5: D8B8B203760485652E12C6951650E159
ver 1.5 D3H.exe MD5: 1BA9BE4081EB435C38B1DC81CDF4261F
ver 1.4 D3H.exe MD5: 167C9081C92BE352C2BA4AC0047C736F
ver 1.3 D3H.exe MD5: 9D166F6107005E43470B94644F3AEBD4
ver 1.2 D3H.exe MD5: AE8EF4FE5AA290F76CE7D69E371D0FBD3
ver 1.1 D3H.exe MD5: DDB6C05FCF6EA430F230E8B308BC4AC6

Cтраница помощи.

Пожелания и предложения крайне приветствуются!

P.S.
Требует .Net Framework 3.5. Но он, наверное, у всех есть и так.
И не забывайте, что вы можете посчитать свой реальный DPS при помощи моего калькулятора 8-)
Последний раз редактировалось DmitryOlenin 17 май 2016, 16:25, всего редактировалось 18 раз(а).

Спасибо, опробуем. :thumbup:
Requiem
 
Ждал звезду с небес - зарегистрирован до выхода Diablo III Дождались! (3 года на портале)

кстате за использование кликера могут и того :)
amak
 
Дождались! (3 года на портале)

Могут "того" за использование любой программы.
Хоть антивируса. Это прописано в соглашении, которое все принимают.

За ТурбоХуд должны были "того" уже давно, многие тысячи людей, я полагаю, им пользуются.
Но нет, не банят. Так что мне не страшно. Но каждый решает для себя, несомненно.

Достойно) :thumbup: Но пробовать не буду, ибо люблю играть ручками) Но за работу и функционал - однозначно плюс) :)

Добавлено спустя 4 минуты 10 секунд:
Совместить бы её еще с твоей программкой для расчета ДПС в одной теме, но не представляю, как лучше это реализовать....
Просто оставлю ссылку. Те, кто не видел - посмотрят) http://horadric.ru/forum/viewtopic.php?f=16&t=26771

Я эту ссылку в первом же сообщении оставил (последняя строка).
Но всё равно спасибо, что помнишь. :)

Пожелание: ту же программу, но для Mac OS ! :thumbup:
sl0h
 
Дождались! (3 года на портале)

DmitryOlenin, что-то проворонил её. :oops: Выделил жирным шрифтом, если не против)

Пожелание: добавить бы функционал для мультибокса - сделать выбор, в какие процессы д3 посылать определенный команды

Спасибо, может добавить еще 2 клавиши для правой и левой кнопки мыши ?
Косметические предложения:
- Лучше заблокировать возможность разворота на весь экран а то некрасиво :)
- При наведении на кнопку старт(РУС язык) подсказка на английском
- При наведении на кнопку стоп подсказка F11 to start
- Названия "Клавиша 1" везде одинаковое
P.S. А где программа хранит настройки ?
lordep
 
Дождались! (3 года на портале)

lordep
Спасибо за замечания! Всё поправлю :)
Программа настройки хранит в файле в недрах темповой директории Windows.
Например, у меня:
c:UsersАдминистраторAppDataLocalD3HotD3H.exe_Url_0rek00bxfc2ms4gv34sd1s1h2cfllxte1.0.0.0

tarantoga
Интересно. Не думал об этом. А как процессы выбирать? Я так понимаю, после запуска им присваются уникальные PID. То есть надо как-то проверять это всё... Довольно нетривиально.

DoctorCharm
Конечно, я не против, спасибо :)

sl0h
Под Макось не думаю, что получится. Ибо тут построено всё на библиотеках для Windows.
В частности, на .Net Framework. Может быть есть какие-то хитрые средства портирования, не знаю.
Но, в целом, это по трудоёмкости примерно как новую программу написать.
Да ещё и в совершенно незнакомой среде :)

DmitryOlenin, может лучше хранить файл конфигурации вместе с программой ? Так сказать, портативная версия :)
lordep
 
Дождались! (3 года на портале)

lordep, Вопрос к автору, я весь код не изучал, пробежался взглядом. В файле "d3hot.cs",
в метод "private VirtualKeyCode virt_code(int i)" да и в остальных методах, не много ли там операторов "if" не разумнее это в "switch" засунуть? Что я хотел сказать, что такое оптимизация не слышали.
Namey
 

Namey
Вот статья про Switch. А вот ещё одно сравнение switch и if..then.
Если я правильно её понял, switch работает едва ли не в два раза медленнее, чем if.
Что я хотел сказать... может не стоит разбрасываться выражениями типа "... не слышали"?

По наглядности... Сравните две строки:
case 0: vkc = VirtualKeyCode.VK_1; break;
if (i == 0) vkc = VirtualKeyCode.VK_1;

Есть ощущение, что в данном случае по читабельности if как минимум не хуже.
В общем, отвечая на ваш вопрос... нет, в switch засунуть всё не разумнее.
Использование if или switch - это вкусовщина, принципиально не влияющая вообще ни на что.

Ещё есть какие-то замечания? Я думаю, что оптимизировать тут есть куда.
Поделитесь опытом, пожалуйста.

lordep
Можно, только зачем? Пользователю разве нужны эти файлы?
Вряд ли кто-то будет на флешке программу с компьютера на компьютер таскать.

DmitryOlenin, if разумно использовать при не большом дереве до 3-4, все что больше 3, быстрее работает switch. Но ладно вы обошлись if, так а где же оператор else,
if (i == 0) vkc = VirtualKeyCode.VK_1;
if (i == 1) vkc = VirtualKeyCode.VK_2;
if (i == 2) vkc = VirtualKeyCode.VK_3;
...
if (i == 0) vkc = VirtualKeyCode.VK_1; else
if (i == 1) vkc = VirtualKeyCode.VK_2; else
if (i == 2) vkc = VirtualKeyCode.VK_3; else
...
у вас получается что, процесс всегда проверяет все варианты.
Namey
 

Да, разумно, else надо поставить. Спасибо.
Если есть ссылка, что switch быстрее при наборах более 3 вариантов, был бы признателен за неё.

DmitryOlenin, Я думаю вы в силах самостоятельно найти ответа на вас интересующие вопросы, а подобный тест вы и сами можете провести.

System.Diagnostics.Stopwatch s = new Stopwatch();
s.Start();
// code
s.Stop();
Console.WriteLine(s.Elapsed);
Namey
 

У меня есть задумка для новых прог, но для других игр :)
В доцку или пое не играешь?
нет, не боты ))

попробую сформулировать идеи.
для доцки: до начала игры, на этапе прогрузки или до крипов открыть профили твоих тиммейтов на ДБ(если есть офк, просто автоматом вбить ник в поиск и нажать поиск за меня). просто автоиатизация. чтобы вручную не открывать 4 вкладки с ДБ-поиском и не копипастить ники. могу помочь проге открывая стим-профиль игроков через контекстное меню, во вшитом браузере

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

офк, если в эти игры не играешь, то конечно не настаиваю. но вдруг во что-то из этого играешь, вот и подкинул идейки.

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

maximxx
За доверие спасибо.
Однако, VirusTotal всё одобряет.
Может быть это какие-то локальные эвристические настройки?
Впрочем... не так важно, жду от Вас отзыва, если возможно :)

DmitryOlenin писал(а):tarantoga
Интересно. Не думал об этом. А как процессы выбирать? Я так понимаю, после запуска им присваются уникальные PID. То есть надо как-то проверять это всё... Довольно нетривиально.


Товарищ писал скрипт для бота правда в AHK(autohotkey), который использует 2 окна Д3 для последовательных циклический действий. Там он решил эту проблему конкретизацией адреса старта процесса Д3, к примеру:

Copy1 = D:Games2Diablo IIIDiablo III.exe ; путь к первой копии
Copy2 = E:!GamesDiablo IIIDiablo III.exe ; путь ко второй копии
Copy3 = D:GAMESDiablo3Diablo III.exe ; заглушка под 3 копию

;ищем окна, раскидываем по углам и изменяем размеры
SysGet, Scr, Monitor ; основной экран, ScrLeft x ScrTop - верхний левый, ScrRight x ScrBottom - нижний правый углы

IfWinExist, ahk_exe %Copy1%
WinActivate
WinMove, ahk_exe %Copy1%, , -7, -26, 1000, 800, ; первое окно в левый верхний

IfWinExist, ahk_exe %Copy2%
WinActivate
WinMove, ahk_exe %Copy2%, , %ScrRight%-993, -26, 1000, 800, ; второе - правый верхний

IfWinExist, ahk_exe %Copy3%
{
WinActivate
WinMove, ahk_exe %Copy3%, , -7, %ScrBottom%-800, 1000, 800, ; третье - левый нижний
}

Я никогда не программировал на C, но может такой метод сработает и там :)

Спасибо за труд в написании програмок для общественного пользования (особенно за "Расчет-DPS"!).
В качестве поддержки могу донатнуть или же помочь в игре на ХКС (быстрый лоу кач(1-70), рифт кач(т6), ВП(1-39)). Буду рад встречи!

RealJhad
Спасибо за предложение :) Сам играю только на ХЦ довольно давно.
Могу сам прокачать кого-нибудь, мне не сложно. Донатить тоже не надо, конечно.

Можно процессы искать, например, по имени запускаемого файла.
Но это какая-то сложная настройка, честно говоря.

Вы уверены, что это вообще будет востребовано?
В смысле, много ли вообще людей мультибокс использует?
А то получается какая-то заказная настройка для конкретного пользователя :)

Namey
Не поленился, провёл тесты. Среднее время в каких-то там долях секунды.
12 проверок if: 886.6
12 проверок if..else: 855.2 Прирост скорости порядка 3%. В пределах погрешности.
12 проверок switch: 882.6 Прирост скорости порядка 0.5%. В пределах погрешности.
Вот 3 вышеописанных варианта:
Код с if
Код: Выделить всё
            System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
            s.Start();
            if (rnd == 100) i = rnd / 2 + 11; //869
            if (rnd == 200) i = rnd / 2 + 12;
            if (rnd == 300) i = rnd / 2 + 13; //1424 //811
            if (rnd == 400) i = rnd / 2 + 14; //866
            if (rnd == 500) i = rnd / 2 + 15; //984 //875
            if (rnd == 600) i = rnd / 2 + 16; //818 //842
            if (rnd == 700) i = rnd / 2 + 17; //1002 //881
            if (rnd == 800) i = rnd / 2 + 18;
            if (rnd == 900) i = rnd / 2 + 19; //854 //875
            if (rnd == 1000) i = rnd / 2 + 20;
            s.Stop();
            MessageBox.Show("Выполнилось за: " + s.Elapsed.ToString() + ". Результат:" + rnd.ToString());

            //12 проверок if. Среднее время считаем, отбрасываем самый большой и маленький результаты.
            //(869+866+984+875+818+842+1002+881+854+875)/10=886.6

Код с if..else
Код: Выделить всё
            System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
            s.Start();
            if (rnd == 100) i = rnd / 2 + 11; else //839
            if (rnd == 200) i = rnd / 2 + 12; else
            if (rnd == 300) i = rnd / 2 + 13; else
            if (rnd == 400) i = rnd / 2 + 14; else //824
            if (rnd == 500) i = rnd / 2 + 15; else //911
            if (rnd == 600) i = rnd / 2 + 16; else //836
            if (rnd == 700) i = rnd / 2 + 17; else
            if (rnd == 800) i = rnd / 2 + 18; else
            if (rnd == 900) i = rnd / 2 + 19; else //878 //854 //890 //857 //818
            if (rnd == 1000) i = rnd / 2 + 20; //827 //935 //836
            s.Stop();
            MessageBox.Show("Выполнилось за: " + s.Elapsed.ToString() + ". Результат:" + rnd.ToString());

            //12 проверок if с else. Среднее время считаем, отбрасываем самый большой и маленький результаты.
            //(839+824+911+836+878+854+890+857+827+836)/10=855.2 Прирост скорости порядка 3%. В пределах погрешности.

Код со switch
Код: Выделить всё
            System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
            s.Start();
            switch (rnd)
            {
                case 100: i = rnd / 2 + 11; break; //860 //854
                case 200: i = rnd / 2 + 12; break; //1062 //842
                case 300: i = rnd / 2 + 13; break; //968 //869
                case 400: i = rnd / 2 + 14; break;
                case 500: i = rnd / 2 + 15; break; //827  //878 //851
                case 600: i = rnd / 2 + 16; break; //1216
                case 700: i = rnd / 2 + 17; break;
                case 800: i = rnd / 2 + 18; break;
                case 900: i = rnd / 2 + 19; break;
                case 1000: i = rnd / 2 + 20; break; //815 //815
            }
            s.Stop();
            MessageBox.Show("Выполнилось за: " + s.Elapsed.ToString() + ". Результат:" + rnd.ToString());
           
            //12 проверок if с switch. Среднее время считаем, отбрасываем самый большой и маленький результаты.
            //(860+854+1062+842+968+869+827+878+851+815)/10=882.6 Прирост скорости порядка 0.5%.  В пределах погрешности.

DmitryOlenin, Я так понял вы случайными числами проверяли, не думаю что это объективный тест.
А что если так:
Code
class Program
{
static void Main(string[] args)
{
System.Diagnostics.Stopwatch s = new Stopwatch();

s.Start();
Run_if(20);
s.Stop();
Console.WriteLine(s.Elapsed);

s.Restart();
Run_switch(20);
s.Stop();
Console.WriteLine(s.Elapsed);

s.Restart();
Run_if(25);
s.Stop();
Console.WriteLine(s.Elapsed);

s.Restart();
Run_switch(25);
s.Stop();
Console.WriteLine(s.Elapsed);

Console.ReadKey();
}

static void Run_if(int x)
{
if (x == 0) { }
else if (x == 1) { }
else if (x == 2) { }
else if (x == 3) { }
else if (x == 4) { }
else if (x == 5) { }
else if (x == 6) { }
else if (x == 7) { }
else if (x == 8) { }
else if (x == 9) { }
else if (x == 10) { }
else if (x == 11) { }
else if (x == 12) { }
else if (x == 13) { }
else if (x == 14) { }
else if (x == 15) { }
else if (x == 16) { }
else if (x == 17) { }
else if (x == 18) { }
else if (x == 19) { }
else if (x == 20) { }
else if (true) { }
}

static void Run_switch(int x)
{
switch (x)
{
case 0: break;
case 1: break;
case 2: break;
case 3: break;
case 4: break;
case 5: break;
case 6: break;
case 7: break;
case 8: break;
case 9: break;
case 10: break;
case 11: break;
case 12: break;
case 13: break;
case 14: break;
case 15: break;
case 16: break;
case 17: break;
case 18: break;
case 19: break;
case 20: break;
default: break;
}
}
}
Последний раз редактировалось Namey 03 мар 2015, 16:30, всего редактировалось 3 раз(а).
Namey
 

У меня получилось, что при любом переданном значении switch быстрее.
Что 0, что 5, что 20.

DmitryOlenin, Ну значить делайте выводы :) . Разумеется что мы говорим даже не о миллисекундах, навряд пользователь заметит разницу, это не повод писать как нибудь, эта профессия славится точностью, наверное точнее некуда :thumbup: .
А тема что и когда лучше использовать, это большая тема, все зависит от ситуаций, к сожалению или к счастью нет одного или пары лучший методов, все по ситуации.
Namey
 

След.

Вернуться в Игровая механика


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1