sergeyols
Умник
Вообщем-то столкнулся со следующей проблемой. Сделал примерно вот такой спидометр:
OnGameModeInit:
Скорость обновляется чуть в другом месте, не буду добавлять, чтобы не забивать вам голову. Так вот, такой спидометр стакается, то есть тексдрав не обновляется для одного игрока, он обновляется для всех. Попытался найти инфу, мне посоветовали создать массив с текстдравами и для каждого игрока колдовать с отдельным текстдравом. Я циклом создал под MAX_PLAYERS по текстдраву и ужаснулся. При 500 слотах, к потреблению памяти добавилось 19 МБ! 19 МБ для спидометра, согласитесь, это слишком. Я конечно понимаю, что память можно освобождать пока игрок оффлайн, но это не решение проблемы. Так вот, как вы оптимизирует спидометр?
OnGameModeInit:
Код:
Textdraw0 = TextDrawCreate(480.000000, 350.000000, "0 mp/h");
TextDrawBackgroundColor(Textdraw0, 255);
TextDrawFont(Textdraw0, 3);
TextDrawLetterSize(Textdraw0, 0.450000, 1.799999);
TextDrawColor(Textdraw0, -1);
TextDrawSetOutline(Textdraw0, 1);
TextDrawSetProportional(Textdraw0, 1);
TextDrawSetShadow(Textdraw0, 1);
Textdraw1 = TextDrawCreate(480.000000, 365.000000, "Fuel: 0%");
TextDrawBackgroundColor(Textdraw1, 255);
TextDrawFont(Textdraw1, 3);
TextDrawLetterSize(Textdraw1, 0.450000, 1.799999);
TextDrawColor(Textdraw1, -1);
TextDrawSetOutline(Textdraw1, 1);
TextDrawSetProportional(Textdraw1, 1);
TextDrawSetShadow(Textdraw1, 1);
Textdraw2 = TextDrawCreate(480.000000, 381.000000, "lock");
TextDrawBackgroundColor(Textdraw2, 255);
TextDrawFont(Textdraw2, 3);
TextDrawLetterSize(Textdraw2, 0.270000, 1.399999);
TextDrawColor(Textdraw2, COLOR_TOMATO);
TextDrawSetOutline(Textdraw2, 1);
TextDrawSetProportional(Textdraw2, 1);
Textdraw3 = TextDrawCreate(504.000000, 381.000000, "windows");
TextDrawBackgroundColor(Textdraw3, 255);
TextDrawFont(Textdraw3, 3);
TextDrawLetterSize(Textdraw3, 0.270000, 1.399999);
TextDrawColor(Textdraw3, COLOR_TOMATO);
TextDrawSetOutline(Textdraw3, 1);
TextDrawSetProportional(Textdraw3, 1);
Код:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER)
{
new str[64];
format(str, sizeof(str), "Fuel: %.2f%", veh_info[GetPlayerVehicleID(playerid)][fuel]);
TextDrawSetString(Textdraw1, str);
if(!veh_info[GetPlayerVehicleID(playerid)][lock])
{
TextDrawHideForPlayer(playerid,Textdraw2);
TextDrawColor(Textdraw2, COLOR_LIGHT_CYAN);
TextDrawShowForPlayer(playerid,Textdraw2);
}
else
{
TextDrawHideForPlayer(playerid,Textdraw2);
TextDrawColor(Textdraw2, COLOR_TOMATO);
TextDrawShowForPlayer(playerid,Textdraw2);
}
if(!veh_info[GetPlayerVehicleID(playerid)][windows])
{
TextDrawHideForPlayer(playerid,Textdraw3);
TextDrawColor(Textdraw3, COLOR_LIGHT_CYAN);
TextDrawShowForPlayer(playerid,Textdraw3);
}
else
{
TextDrawHideForPlayer(playerid,Textdraw3);
TextDrawColor(Textdraw3, COLOR_TOMATO);
TextDrawShowForPlayer(playerid,Textdraw3);
}
ShowSpeed(playerid);
}
else HideSpeed(playerid);
return 1;
}
public OnPlayerUpdate(playerid)
{
if(isPlayerDriver(playerid))
{
new str[64];
format(str, sizeof(str), "%d mp/h", SpeedVehicle(playerid));
TextDrawSetString(Textdraw0, str);
}
character_info[playerid][AFK] = 0;
return 1;
}
ShowSpeed(playerid)
{
TextDrawShowForPlayer(playerid, Textdraw0);
TextDrawShowForPlayer(playerid, Textdraw1);
TextDrawShowForPlayer(playerid, Textdraw2);
TextDrawShowForPlayer(playerid, Textdraw3);
}
HideSpeed(playerid)
{
TextDrawHideForPlayer(playerid, Textdraw0);
TextDrawHideForPlayer(playerid, Textdraw1);
TextDrawHideForPlayer(playerid, Textdraw2);
TextDrawHideForPlayer(playerid, Textdraw3);
}
