Псевдокод для этого таков:
FPS_WANTED = 25
(just a number, it can be changed while executing, or it can be constant)
TIME_OF_DRAWING = 1000/FPS_WANTED
(this is in milliseconds, I believe it is accurate enough)
( should be updated when FPS_WANTED changes)
UntilTheUserLeavesTheDrawingApplication()
{
time1 = getTime();
doAnimation();
time2 = getTime();
animationTime = time2-time1;
if (animationTime > TIME_OF_DRAWING)
{
[the FPS_WANTED cannot be reached]
You can:
1. Decrease the number of FPS to see if a lower framerate can be achieved
2. Do nothing because you want to get all you can from the CPU
}
else
{
[the FPS can be reached - you can decide to]
1. wait(TIME_OF_DRAWING-animationTime) - to keep a constant framerate of FPS_WANTED
2. increase framerate if you want
3. Do nothing because you want to get all you can from the CPU
}
}
Конечно, могут быть вариации этого, но это основной алгоритм, который действует в любом случае анимации.
Возможно, должно, но это не так. .update ()
не вызывает метод .save ()
для отдельных объектов в QuerySet, а вместо этого обновляет все за один вызов SQL (UPDATE, как это бывает) . Поскольку он не использует .save ()
, было бы непоследовательно вызывать сигналы до и после сохранения. Я, конечно, могу представить себе варианты использования, в которых кто-то может этого захотеть, но я также могу представить себе случаи, в которых этого не делать. Мне кажется, что не вызывать сигналы до и после сохранения - это правильное поведение, поскольку это оставляет больше гибкости для программиста. Эти сигналы нетрудно активировать вручную, и я думаю, что это так »