Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Автоматизация расчетов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
arxnday
Отправлено: 29 Ноября, 2015 - 02:39:35
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




Всем привет!
Собственно, пытаюсь сделать простенькую игру для набития руки, и столкнулся со следующей проблемой которую не понимаю как реализовать.
Вот есть у нас, допустим, склад, и необходимо чтобы каждую секунду "отработавшая шахта" приносящая 5 ед. ресурса не уходила в пустоту, а это значение добавляла к текущему показателю склада.
Как это можно реализовать?
Первая мысль была связана с cron, но при наличии, допустим, тысячи таких операций каждую секунду, кажется, будет слишком высокая нагрузка на сервер. Есть ли другие пути или можно сильно не беспокоиться о нагрузке от крона?
 
 Top
MiksIr
Отправлено: 29 Ноября, 2015 - 02:44:17
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


А зачем тебе хранить текущее состояние, если ты его всегда можешь посчитать. Обновляй базу на операциях списания (опустошение склада, например, или пролучение бонуса), а текущее состояние посчитаешь как "последниее состояние + (текущее время - время последнего состояния) * прирост".

Ну как вариант, ваще не очень в геймдеве.


-----
self-banned
 
 Top
arxnday
Отправлено: 29 Ноября, 2015 - 02:56:03
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




MiksIr пишет:
А зачем тебе хранить текущее состояние, если ты его всегда можешь посчитать. Обновляй базу на операциях списания (опустошение склада, например, или пролучение бонуса), а текущее состояние посчитаешь как "последниее состояние + (текущее время - время последнего состояния) * прирост".

Ну как вариант, ваще не очень в геймдеве.

Хм, спасибо за наводку на еще один вариант реализации)
Хотя на операциях списания не вариант, нужно чтобы при каждом обновлении страницы выводилось точное значение хранящегося на складе ресурса
получается, если правильно в 3 часа ночи понял такая очередность:
1. результат = (текущий timestamp - timestamp с бд) * прирост в секунду
2. состояние склада += результат
3. обновление значения timestamp

Спасибо!

(Отредактировано автором: 29 Ноября, 2015 - 02:57:15)

 
 Top
MiksIr
Отправлено: 29 Ноября, 2015 - 03:14:18
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Зачем тебе "3. обновление значения timestamp"?


-----
self-banned
 
 Top
arxnday
Отправлено: 29 Ноября, 2015 - 03:38:05
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




MiksIr пишет:
Зачем тебе "3. обновление значения timestamp"?
а что, в таблицу потом не нужно заносить значение последнего проведения операции?)
 
 Top
MiksIr
Отправлено: 29 Ноября, 2015 - 04:51:28
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Для операции - надо. Но "показать сколько на складе" - это не операция. Т.е. заносите таймстамп только если тратите со склада, или если пришли какие-то бонусы за достижения, или если число прироста в секунду меняется (апнули шахту) и т.д.

А если просто показываете состояние - зачем заносить его, если можно продолжать расчитывать... будет просто "текущий timestamp" увеличиваться и все.

В базах данных если можно лишний раз не писать - лучше не писать.


-----
self-banned
 
 Top
lastdays
Отправлено: 29 Ноября, 2015 - 08:37:12
Post Id



Частый гость


Покинул форум
Сообщений всего: 220
Дата рег-ции: Март 2013  


Помог: 7 раз(а)




PHP:
скопировать код в буфер обмена
  1. print update_store( time()-5  );
  2.  
  3.  
  4. function update_store ( $lastom )
  5. {
  6.  //- Получаем время последнего обновления
  7.  $last_act = test( time() - $lastom );
  8.  //- Сколько ресурсов в секунду
  9.  $resource_tick = round(5 * $last_act);
  10.  
  11.  return $resource_tick;
  12. }
  13.  
  14. function test( $par )
  15. {
  16.         if ( $par < 0 ) $par = 0;
  17.         return $par;
  18. }


Для примера и незачем каждую секунду обновлять. Записывай в БД или куда удобно время последнего обновления

(Отредактировано автором: 29 Ноября, 2015 - 08:37:42)

 
 Top
arxnday
Отправлено: 30 Ноября, 2015 - 22:43:01
Post Id


Новичок


Покинул форум
Сообщений всего: 41
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




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

Спасибо всем огромное)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB