假如我们有个ring buffer, 里面的数据需要每帧执行.
.....
但是为了优化,我们跳帧执行
不bb, 直接上代码
let UpdateDataMod:number = 10; // > 0
class RingBufferUpdate {
protected _updateIndexCounter:number = 0;
startIdx:number = 0;
endIdx:number = 0;
_bufferMaxSize:number = 1001; // ring buffer size.
frameUpdate():void {
this._updateIndexCounter = (++this._updateIndexCounter) % UpdateDataMod;
let _start: number = this.startIdx;
let _end: number = this.endIdx;
if (_start == _end)
return;
console.log("%c mode %d ----- update from " + _start + " to " + _end + "----------------- _updateIndexCounter = " + this._updateIndexCounter,
'background: #006600; color: #ff0000', UpdateDataMod
);
let mod:number = _start % UpdateDataMod;
if (mod <= this._updateIndexCounter)
_start = _start + (this._updateIndexCounter - mod);
else
_start = _start + (this._updateIndexCounter - mod) + UpdateDataMod;
//loop for ring buffer
let passMax : boolean = _end >= _start;
while (_start <= _end || !passMax) {
console.log("update index " + _start); // doing job.
_start += UpdateDataMod;
if (_start >= this._bufferMaxSize) {
_start = this._updateIndexCounter;
if (passMax)
break;
passMax = true;
}
}
}
testUpdate(s:number, e:number, loopTime:number):void {
this.startIdx = s;
this.endIdx = e;
for(let i = 0 ; i < loopTime; i++) {
this.frameUpdate();
}
}
}
var testObj:RingBufferUpdate = new RingBufferUpdate();
testObj.testUpdate(2, 1000, 12);
testObj.testUpdate(800, 100, 12);
UpdateDataMod = 5;
testObj.testUpdate(2, 1000, 12);
testObj.testUpdate(800, 100, 12);
UpdateDataMod = 15;
testObj.testUpdate(2, 1000, 20);
testObj.testUpdate(800, 100, 20);