+ Ответить в теме
Показано с 1 по 20 из 70

Тема: Уроки SDK. Поэтапно с начала.

Комбинированный просмотр

  1. #1
    Как добавить активный элемент на экран.
    Для начала надо открыть файл нужного нам экрана (он находятся в папке Assets\Python\Screens). Затем добавить объект с которым хотим взаимодействовать (addSlider - слайдер, setText - текст, setButtonGFC - кнопка плюс или минус, и т.д.).
    Нужно иметь ввиду что для взаимодействия с объектом у этого объекта есть три параметра идущие друг за другом в функции создания оъекта: WidgetTypes (тип реакции объекта при взаимодействии), iData1 (число), iData2 (число) (например setButtonGFC("имя объекта", u"", "", X координата, Y координата, длинна, высота, WidgetTypes.WIDGET_GENERAL, -1, -1, ButtonStyles.BUTTON_STYLE_CITY_MINUS)).
    Если хотим отделатся только питоном то достаточно указать WidgetTypes.WIDGET_GENERAL и написать алгоритм в функции def handleInput (self, inputClass) , которая находится в том же файле.
    Но если питона не достаточно (напрмер сделать всплывающую подсказку в питоне у меня не получилось), то прийдется использовать SDK.
    1) Открываем файлы CvEnums.h и CyEnumsInterface.cpp, ищем WidgetTypes и добавляем туда новый. Добавлять надо в конец списка перед , NUM_WIDGET_TYPES, .
    2) Открываем файл CvDLLWidgetData.cpp
    3) Ищем функцию void CvDLLWidgetData:: parseHelp(CvWStringBuffer &szBuffer, CvWidgetDataStruct &widgetDataStruct) - алгоритм подсказки при наведении курсора на объект. Добавляем туда наш widget и алгоритм подсказки (алгоритмы подсказок есть еще в файле CvGameTextMgr.cpp).
    4) Ищем функцию bool CvDLLWidgetData:: executeAction( CvWidgetDataStruct &widgetDataStruct ) - клик по объекту. Добавляем туда наш widget и алгоритм действий.

    Значения переменных widgetDataStruct.m_iData1 и widgetDataStruct.m_iData2 в функциях parseHelp и executeAction это наши iData1 и iData2 которые мы указывали при создании объектов.
    продвинь это сообщение в соцсеть:  
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

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

    В SDK новый параметр будет вызыватся функцией GC.getDefineINT("NEW_PARAMETR"). Это очень медленная функция, поэтому если хотите чтоб с новым параметром расчеты происходили быстро, то надо сделать соответствующие изменения в файлах CvGlobals.cpp и CvGlobals.h на примере существующего параметра MOVE_DENOMINATOR. И уже заместь GC.getDefineINT("NEW_PARAMETR") использовать GC.getNEW_PARAMETR().
    А как удалось выяснить, что она очень медленная? Через установку таймера на выполнение функции? Я вчера CvPlot просматривал, так она там много где используется, например в расчете видимости тайлов. Если заменить её на GC.getNEW_PARAMETR() то это должно по идее ускорить игру, хоть и не намного.

    Вообще, какие основные тормоза в SDK? Я знаю некоторые.
    Callback'и в Питон, их и так большей частью ещё в RevDCM заблокировали, а я оставшиеся заблокировал, теперь даже расчет опыта юнита до следующего уровня у меня идет через SDK.
    Pathfinding - в Caveman2Cosmos они свой сделали, с поддержкой многопоточности и без использования exe-файла, как я понял. Надо будет сделать по аналогии, но мне до это уровня ещё расти и учить.
    Циклы через весь массив, для обнаружения нужной связи. Например через весь набор прокачек, имеется ли такая у юнита. Как бы ещё научить сохранять связи между ними, и автоматически пересчитывать при изменении XML. Эту проблему устранили в Realism Invictus.

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

  3. #3
    1) Потому что GC.getNEW_PARAMETR() возвращает число, хранящееся в переменной. А GC.getDefineINT("NEW_PARAMETR") сначала ищет по названию нужную переменную, а только потом возвращает число.
    Когда я начинал осваивать SDK, то сделал чтоб юниты по диагоналям передвигались не так далеко как по вертикалям и горизонталям, и сделал я это через GC.getDefineINT("NEW_PARAMETR"). Игроки, которые играли в мой мод, сразу стали жаловатся что ИИ стал дольше думать. Когда я сделал все через GC.getNEW_PARAMETR(), жалобы исчезли.

    2) Расчет лучшего тайла для города делается в конце каждого хода игроков. Я сделал так чтоб этот алгоритм выполнялся перед ходом поселенца. ИИ запоминает что выбрал лучший тайл, и если не произошли события, которые могут повлиять на выбор, то алгоритм не выполняется.
    Возмжность апгредить юнита в другого проверяется через рекурсивную функцию для каждого юнита каждый ход. Я этот алгоритм вызываю при запуске мода для каждого юнита и сохраняю результат в единственный битовый масив. Этат алгоритм настолько медленный, что мой мод стал долго запускаться. Поэтому я этот алгоритм сделал многопоточным. При запуске моего мода можно посмотреть загрузку процессора, если загрузились все ядра - значит выполняется этот алгоритм.
    Многие расчеты я тоже делаю при запуске мода или игры, и уже в самой игре использую заместь алгоритмов заранее вычесленый результат.
    Есть еще метод замены ветвлений (if else) на математические выражения (современные процессоры не любят ветвления).
    Например
    if (x > 0) {y += x;}
    заменяется на
    y += x * (x > 0);.
    Правда, код после этого делается плохо читаемым, поэтому оптимизацию ветвлений я всегда сопровождаю коментариями оригинального кода
    y += x * (x > 0);//if (x > 0) {y += x;}.

    А в каком файле (и название функции) находится альтернатива Pathfinding в моде Caveman2Cosmos? Хочу себе такое зделать.
    продвинь это сообщение в соцсеть:  
    Последний раз редактировалось NeseryozniyVET; 31.08.2013 в 20:31.
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  4. #4
    Спасибо, заменю ради интереса GC.getDefineINT("PLOT_VISIBILITY_RANGE") на GC.getPLOT_VISIBILITY_RANGE().


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

    Возмжность апгредить юнита в другого проверяется через рекурсивную функцию для каждого юнита каждый ход.
    А это кажется в RevDCM побеждено, туда ведь был включен Sanguo Mod Performance в котором с этой проблемой боролись.

    Есть еще метод замены ветвлений (if else) на математические выражения (современные процессоры не любят ветвления).
    Про такое даже не слышал, запомню на будущее, ещё пригодится.

    А в каком файле (и название функции) находится альтернатива Pathfinding в моде Caveman2Cosmos? Хочу себе такое зделать.
    CvPathGenerator.cpp и CvPathGenerator.h если правильно помню.
    продвинь это сообщение в соцсеть:  

  5. #5
    Ах, да, оставлю ссылку здесь, чтобы не забылась. Как раз в тему. А пока попробую разобраться, что такое профайлер и как им пользоваться на примере Civ4.

    http://forums.civfanatics.com/showthread.php?t=487573
    продвинь это сообщение в соцсеть:  

  6. #6
    Буду писать новыми постами, все равно уроки по ссылкам в первом посте рассредоточены, а под новые есть зарезервированное место.

    Побаловался с этими профайлерами, с Very Sleepy, LTProf и вот сейчас CodeAnalysist.

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






    Вот скрин из

    Very Sleepy

    Что смущает, из того что мне понятно. Функция initCvPythonExtensions она жрет просто какое-то дико неприличное количество ресурсов, это как я понимаю использование игрой питона?

    Далее уже по доступному CvGameCoreDLL.dll. Неожиданный результат по функциям.
    shuffle - ещё понятно, хотя надо посмотреть, что она именно делает.
    CvCity::getTeam - уже странно, но все таки.
    getUnit - ладно, это самое понятное.
    CvPlayerAI::AI_maxGoldPerTurnTrade - а вот это как? Как он умудряется так золото свое считать.
    CvPlayerRecord::getMinutesPlayed - понятно, но что-то больно много этот подсчет минут себе требует.
    CvPlayer::getAdvancedStartVisibilityCost - а это-то ему зачем. Игру начинал нормальную, безо всяких там AdvancedStart.

    В общем смотреть и смотреть, учиться да учиться.
    продвинь это сообщение в соцсеть:  

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

    Немного изменил её, дабы calculateGoldRate() высчитывался лишь один раз.

    Скрытый текст
    Код:
    int CvPlayerAI::AI_maxGoldPerTurnTrade(PlayerTypes ePlayer) const
    {
    	int iMaxGoldPerTurn;
    	int GoldRate = calculateGoldRate();//Cansei 1.09.2013
    
    	FAssert(ePlayer != getID());
    
    	if (isHuman() || (GET_PLAYER(ePlayer).getTeam() == getTeam()))
    	{
    //		iMaxGoldPerTurn = (calculateGoldRate() + (getGold() / GC.getDefineINT("PEACE_TREATY_LENGTH")));//Cansei 1.09.2013
    	iMaxGoldPerTurn = (GoldRate + (getGold() / 10));
    	}
    	else
    	{
    		iMaxGoldPerTurn = getTotalPopulation();
    
    		iMaxGoldPerTurn *= GC.getLeaderHeadInfo(getPersonalityType()).getMaxGoldPerTurnTradePercent();
    		iMaxGoldPerTurn /= 100;
    
    		iMaxGoldPerTurn += std::min(0, getGoldPerTurnByPlayer(ePlayer));
    	}
    
    //	return std::max(0, std::min(iMaxGoldPerTurn, calculateGoldRate()));//Cansei 1.09.2013
    	return std::max(0, std::min(iMaxGoldPerTurn, GoldRate));
    }


    Функция немного присмирела, но все равно остается неприлично прожорливой. Буду смотреть дальше, вглубь calculateGoldRate().
    Код:
    0x2eb90a0 	CvPlayerAI::AI_maxGoldPerTurnTrade 	2.25
    Код:
    0x2eb90a0        CvPlayerAI::AI_maxGoldPerTurnTrade 	2.80
    Код:
    0x2eb90a0        CvPlayerAI::AI_maxGoldPerTurnTrade 	1.96
    продвинь это сообщение в соцсеть:  

+ Ответить в теме

Похожие темы

  1. Тайлы с ресами позначены с начала игры?
    от Taras_UA в разделе Civ5 - Игровые вопросы
    Ответов: 1
    Новое: 05.10.2010, 18:18
  2. Тактические уроки двух последних войн Ирака для общевойскового командира
    от Гость в разделе Разговоры обо всём, кроме Цивилизации
    Ответов: 2
    Новое: 18.03.2009, 16:57
  3. Уроки французского
    от BuDDaH в разделе Палаты команды Монархия MTDG2
    Ответов: 5
    Новое: 01.02.2007, 14:21
  4. Уроки C++
    от vpadlo в разделе Civ4 - Модная Цивилизация
    Ответов: 13
    Новое: 21.01.2007, 00:58
  5. Глючит 1.61 рус: с начала игры остается 10 ходов!
    от Mityay в разделе Civ4 - Технические вопросы
    Ответов: 1
    Новое: 17.07.2006, 13:51

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
Рейтинг@Mail.ru

free counters