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

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

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

  1. #1
    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение

    У себя в моде я оптимизировал CvCity::getTeam(). Она по твоим скриншотам 4,73% жрет
    Код:
    TeamTypes CvCity::getTeam() const
    {
    //VET Optimization - begin /
    	//return GET_PLAYER(getOwnerINLINE()).getTeam();
    	return m_eTeam;
    //VET Optimization - end /
    }
    Может ее еще и инлайновой сделать ?
    Сделал по аналогии, добавил функции

    Код:
    TeamTypes CvCity::getTeam() const
    {
    	return m_eCityTeam;
    }
    
    void CvCity::updateTeamType()
    {
    	m_eCityTeam = GET_PLAYER(getOwnerINLINE()).getTeam();
    }

    updateTeamType() прописал в init, liberate и read. Так чтобы не сохранялась, а вычислялась при загрузке сейва. Вроде все идет, но не оставляет ощущение, что что-то забыл. Может ещё updateTeamType() нужен, какие вообще способы существуют для смены владельца города? Захват, дипломатия и освобождение?
    При захвате, как понимаю старый полностью уничтожается и создаётся новый, как его копия?


    После изменения, функция CvCity::getTeam() пропала из топа, но на верхние места вылезла другая CvCity::getOwner.
    CvTeam::getCompletedSpaceshipProjects вконец обнаглела, причем в половине случаев вызывает сама себя.
    продвинь это сообщение в соцсеть:  

  2. #2
    Похоже найден виновник многих несуразностей. Это функция CvUnit::getLayerAnimationPaths()

    Выглядит она вот так.

    Скрытый текст
    Код:
    void CvUnit::getLayerAnimationPaths(std::vector<AnimationPathTypes>& aAnimationPaths) const
    {
    	for (int i=0; i < GC.getNumPromotionInfos(); ++i)
    	{
    		PromotionTypes ePromotion = (PromotionTypes) i;
    		if (isHasPromotion(ePromotion))
    		{
    			AnimationPathTypes eAnimationPath = (AnimationPathTypes) GC.getPromotionInfo(ePromotion).getLayerAnimationPath();
    			if(eAnimationPath != ANIMATIONPATH_NONE)
    			{
    				aAnimationPaths.push_back(eAnimationPath);
    			}
    		}
    	}
    }


    Вызывает уйму всякой муры, включая как саму себя, так и самые неожиданные вещи. Например CvCity::getY, причем обходится даже без CvCity::getX
    продвинь это сообщение в соцсеть:  

  3. #3
    Цитата Сообщение от Cansei Посмотреть сообщение
    Похоже найден виновник многих несуразностей. Это функция CvUnit::getLayerAnimationPaths(
    Ну во-первых GC.getNumPromotionInfos() нужно вывести за пределы цикла
    int iNumProm = GC.getNumPromotionInfos();
    for (int i=0; i < iNumProm; ++i)

    А во-вторых можно заменить булевый масив наличия прокачек у юнита, на масив существующих прокачек у юнита (и переделывать его при получении или потери прокачки) и переменную количества этих прокачек. Тогда код будет выглядеть так.
    Код:
    int iNumProm = m_iNumPromotions;//m_iNumPromotions - новая переменная у каждого юнита.
    PromotionTypes* peLoopProms = m_paePromotions;//m_paePromotions - новый масив взамен старого
    for (int i=iNumProm; i != 0; --i, ++peLoopProms)
    {
    	AnimationPathTypes eAnimationPath = (AnimationPathTypes) GC.getPromotionInfo(peLoopProms[0]).getLayerAnimationPath();
    	if(eAnimationPath != ANIMATIONPATH_NONE)
    	{
    		aAnimationPaths.push_back(eAnimationPath);
    	}
    }
    Эффект будет пропорционален количеству прокачек в моде.
    продвинь это сообщение в соцсеть:  
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  4. #4
    А во-вторых можно заменить булевый масив наличия прокачек у юнита, на масив существующих прокачек у юнита (и переделывать его при получении или потери прокачки) и переменную количества этих прокачек. Тогда код будет выглядеть так.
    Спасибо, как-то так я и думал. Но при таких условиях по идее резко возрастет количество потребляемой памяти и время на запись/сохранение. Я вот думаю, как бы ввести int массив прокачек типа вектор, содержащие индекс прокачки в GC.getNumPromotionInfos() Но вот как конкретно это реализовать пока не знаю. Я C++ начал изучать только в июне, и то по книжкам, так что реального опыта в этом маловато.

    Похоже найден виновник многих несуразностей. Это функция CvUnit::getLayerAnimationPaths
    Там проблема в другом, там функция возвращает ссылку на пустой вектор, потому как LayerAnimationPaths отвечает за изменение внешнего вида юнита при получении прокачки. А таких прокачек не только в игре, но и в большинстве модов нет. Я специально смотрел в Master of Mana и Caveman2Space. Таких прокачек там не нашел. Я пробовал изменить функцию, убрав из неё ссылку на вектор. Но игра теперь не идет дальше главного меню. Буду думать дальше.
    продвинь это сообщение в соцсеть:  
    Последний раз редактировалось Cansei; 02.09.2013 в 17:04.

  5. #5
    Ну так предложеный мною метод и есть что-то типа вектора только быстрее и без лишних функций и переменных. Размер масива равен количеству прокачек у юнита, если прокачек нет - то просто нулевой указатель. В моем примере я предлагал масив PromotionTypes (32 бита), но если в моде количество прокачек не превышает число 255, то можно и unsigned char (8 бит) использовать или unsigned short (16 бит), если прокачек больше 255 и меньше 64 тисяч.
    продвинь это сообщение в соцсеть:  
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  6. #6
    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    Ну так предложеный мною метод и есть что-то типа вектора только быстрее и без лишних функций и переменных. Размер масива равен количеству прокачек у юнита, если прокачек нет - то просто нулевой указатель. В моем примере я предлагал масив PromotionTypes (32 бита), но если в моде количество прокачек не превышает число 255, то можно и unsigned char (8 бит) использовать или unsigned short (16 бит), если прокачек больше 255 и меньше 64 тисяч.
    А понятно, пардон не так понял. Так и сделаю. Я почему-то подумал о прикреплении к юниту всех его прокачек, как набора переменных. Совсем уже запутался с этими AnimationPathTypes и тем, как убедить функцию использовать анимацию юнита по умолчанию, если ни одна прокачка её не изменяет.
    продвинь это сообщение в соцсеть:  

  7. #7
    Цитата Сообщение от Cansei Посмотреть сообщение
    updateTeamType() прописал в init, liberate и read.
    В liberate прописывать не надо. Там идет вызов acquireCity, та вызывает initCity, а та init.
    продвинь это сообщение в соцсеть:  
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  8. #8
    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    В liberate прописывать не надо. Там идет вызов acquireCity, та вызывает initCity, а та init.
    Спасибо. Уберу. То есть достаточно только в init прописать? Ну и в read, если не сохранять. А этот TeamTypes для города, оно вообще много памяти требует? Как полноценный объект класса CvTeam?

    С LayerAnimationPaths долго маялся, разбирался с AnimationPaths. В итоге понял, что перемудрил и банально закомментил все лишнее. До меня дошло, что вызовы идут из самой функции, а не из exe. В итоге в списках этой функции теперь вообще не замечено. А раньше она со всеми вызовами жрала почти 5%. Все равно она даже в модах походу не используется. Тут может быть ошибка была, что вектор не был определен в функции, ну там std::vector<AnimationPathTypes> aAnimationPaths?

    Скрытый текст
    Код:
    void CvUnit::getLayerAnimationPaths(std::vector<AnimationPathTypes>& aAnimationPaths) const
    {
    	// for (int i=0; i < GC.getNumPromotionInfos(); ++i)
    	// {
    		// PromotionTypes ePromotion = (PromotionTypes) i;
    		// if (isHasPromotion(ePromotion))
    		// {
    			// AnimationPathTypes eAnimationPath = (AnimationPathTypes) GC.getPromotionInfo(ePromotion).getLayerAnimationPath();
    			// if(eAnimationPath != ANIMATIONPATH_NONE)
    			// {
    				// aAnimationPaths.push_back(eAnimationPath);
    			// }
    		// }
    	// }
    }


    Теперь вот новый враг CvCity::getOwner функция дерзкая больно, надо присмирить. Причем большая часть её вызовов почему-то идет из старой знакомой чертовки CvPlayerAI::AI_maxGoldPerTurnTrade. А ещё есть весьма наглая GetLocaleTime судя по названию она из питона? Почти полтора процента времени на неё уходит. Перенести бы это в dll.
    продвинь это сообщение в соцсеть:  

  9. #9
    Продолжаю углубляться в особенности исполнения функций. Специально прогонял через эти программки обычную версию, без модов. Так как играл без автоплея, то результат сильно отличался. Но вот проблемные функции по прежнему на месте. Тот же LayerAnimationPaths был замечен не раз, к тому же ещё вчера нашел в теме мода Planetfall случай когда она вообще приводила к вылету докапываясь до настроек карты. Что интересно на ихфанатиках вообще почти не заметил упоминания этой функции, походу либо они и не знают, что она странная, либо эти программки что-то не так показывают. Но судя по упоминанию в теме Planetfall и тому что обе программы показывают примерно одни и те же результаты, похоже где-то здесь и вправду подвох, найти бы ещё где.
    Я пока нашел три основные функции где точно виден подвох. Это за исключением уже побежденной LayerAnimationPaths , CvPlayerAI::AI_getGreeting и многократно упоминаемая CvPlayerAI::AI_maxGoldPerTurnTrade. Есть ещё около десятка других, но они не так заметны. CvPlayerAI::AI_getGreeting к примеру не только многократно вызывает сама себя, но и CvPlot::isLake зачем вообще функции выбирающей тип приветствия при диалоге с AI знать является ли тайл озером?

    Есть у меня пока гипотеза, что возникает это из-за какого-то бага в питон-составляющей, что присылает всякую ересь в фунции.
    Вот эта функция, уже упрощенная правда когда я комментирую все кроме последней строки, она пропадает из списков. Есть подозрение, что передаваемый PlayerTypes ePlayer идет как непойми что.
    Скрытый текст
    Код:
    DiploCommentTypes CvPlayerAI::AI_getGreeting(PlayerTypes ePlayer) const
    {
    	TeamTypes eWorstEnemy;
    
    	if (GET_PLAYER(ePlayer).getTeam() != getTeam())
    	{
    		eWorstEnemy = GET_TEAM(getTeam()).AI_getWorstEnemy();
    
    		if ((eWorstEnemy != NO_TEAM) && (eWorstEnemy != GET_PLAYER(ePlayer).getTeam()) && GET_TEAM(GET_PLAYER(ePlayer).getTeam()).isHasMet(eWorstEnemy) && (GC.getASyncRand().get(4) == 0))
    		{
    			if (GET_PLAYER(ePlayer).AI_hasTradedWithTeam(eWorstEnemy) && !atWar(GET_PLAYER(ePlayer).getTeam(), eWorstEnemy))
    			{
    				return (DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_WORST_ENEMY_TRADING");
    			}
    			else
    			{
    				return (DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_WORST_ENEMY");
    			}
    		}
    		else if ((getNumNukeUnits() > 0) && (GC.getASyncRand().get(4) == 0))
    		{
    			return (DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_NUKES");
    		}
    		else if ((GET_PLAYER(ePlayer).getPower() < getPower()) && AI_getAttitude(ePlayer) < ATTITUDE_PLEASED && (GC.getASyncRand().get(4) == 0))
    		{
    			return (DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_UNIT_BRAG");
    		}
    	}
    
    	return (DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_GREETINGS");
    }
    продвинь это сообщение в соцсеть:  

  10. #10
    идейный враг всяких трансформероB

    Аватар для Snake_B


    Регистрация
    14.09.2007
    Адрес
    Донецк-Камчатка....
    Сообщений
    13,323
    установил теме статус важная...

    to Cansei
    хотелось бы все таки, чтобы выкладывались исходники... а то много чего интересного делали, потом по каким-нибудь причинам пропадали...
    и все наработки вместе с ними...
    продвинь это сообщение в соцсеть:  

  11. #11
    Цитата Сообщение от Snake_B Посмотреть сообщение
    to Cansei
    хотелось бы все таки, чтобы выкладывались исходники... а то много чего интересного делали, потом по каким-нибудь причинам пропадали...
    и все наработки вместе с ними...
    Так я же и пишу как их получить, с указанием конкретных функций и вида их изменения, при желании можно получить нужное просто прочитав тему. С исходниками проблема в том, что все эти изменения проводятся уже на значительно модифицированной версии, а переносить их на чистую BTS потребует кучу дополнительной работы. По крайней мере, пока я не разберусь как в VS2008 удобно поддерживать несколько разных версий одновременно не копаясь в настройках и папках с файлами.
    продвинь это сообщение в соцсеть:  

  12. #12
    Цитата Сообщение от Cansei Посмотреть сообщение
    А этот TeamTypes для города, оно вообще много памяти требует? Как полноценный объект класса CvTeam?
    32 бита (4 байта) на город. Если построишь миллион городов, то игра будет из-за TeamTypes жрать аж на 4 мегабайта больше :-)
    продвинь это сообщение в соцсеть:  
    Если новые технологии позволяют обходится без услуг простых людей - это прогресс, а если новые технологии позволяют обходится без услуг миллионеров и крупных компаний - это нарушение авторских прав.
    Мой мод

  13. #13
    Цитата Сообщение от NeseryozniyVET Посмотреть сообщение
    32 бита (4 байта) на город. Если построишь миллион городов, то игра будет из-за TeamTypes жрать аж на 4 мегабайта больше :-)
    Спасибо, до меня только позавчера дошло, что эти Types это же перечисления, те же int по сути. До этого я почему-то считал их разновидностью объектов.
    продвинь это сообщение в соцсеть:  

  14. #14
    Хе-хе. Натравил на исходники цивы Cppcheck, ищет вот сейчас. Нашел кучу предупреждений и три (пока три) ошибки с delete созданного как new[].

    Исправил, посмотрю что он найдет дальше.
    продвинь это сообщение в соцсеть:  

  15. #15
    С неправильным удалением указателей разобрался. Их там всего пять и было. Но и то весьма неприятно. Ну и ещё штук 20 утечек памяти в CvInfos. Но там они некритичны, завтра с ними все равно разберусь для порядка. Из предупреждений в основном на опечатки с FAssert. Запускал профилирование с дебаг версией, насколько же приятно смотреть на реальное распределение ресурсов.
    Тут бы отдельную темку выделить, "Оптимизация Civ4", а то к урокам это имеет немного отдаленное отношение.
    продвинь это сообщение в соцсеть:  

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

Похожие темы

  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