void FObjectReplicator::QueueRemoteFunctionBunch( UFunction* Func, FOutBunch &Bunch ) { // This is a pretty basic throttling method - just don't let same func be called more than // twice in one network update period. // // Long term we want to have priorities and stronger cross channel traffic management that // can handle this better int32 InfoIdx=INDEX_NONE; for (int32 i=0; i < RemoteFuncInfo.Num(); ++i) { if (RemoteFuncInfo[i].FuncName == Func->GetFName()) { InfoIdx = i; break; } } if (InfoIdx==INDEX_NONE) { InfoIdx = RemoteFuncInfo.AddUninitialized(); RemoteFuncInfo[InfoIdx].FuncName = Func->GetFName(); RemoteFuncInfo[InfoIdx].Calls = 0; } if (++RemoteFuncInfo[InfoIdx].Calls > CVarMaxRPCPerNetUpdate.GetValueOnGameThread()) { UE_LOG(LogRep, Verbose, TEXT("Too many calls to RPC %s within a single netupdate. Skipping. %s. LastCallTime: %.2f. CurrentTime: %.2f. LastRelevantTime: %.2f. LastUpdateTime: %.2f "), *Func->GetName(), *GetObject()->GetName(), RemoteFuncInfo[InfoIdx].LastCallTime, OwningChannel->Connection->Driver->Time, OwningChannel->RelevantTime, OwningChannel->LastUpdateTime ); return; } RemoteFuncInfo[InfoIdx].LastCallTime = OwningChannel->Connection->Driver->Time; if (RemoteFunctions == NULL) { RemoteFunctions = new FOutBunch(OwningChannel, 0); } RemoteFunctions->SerializeBits( Bunch.GetData(), Bunch.GetNumBits() ); if ( Connection != NULL && Connection->PackageMap != NULL ) { UPackageMapClient * PackageMapClient = CastChecked< UPackageMapClient >( Connection->PackageMap ); // We need to copy over any info that was obtained on the package map during serialization, and remember it until we actually call SendBunch if ( PackageMapClient->GetMustBeMappedGuidsInLastBunch().Num() ) { OwningChannel->QueuedMustBeMappedGuidsInLastBunch.Append( PackageMapClient->GetMustBeMappedGuidsInLastBunch() ); PackageMapClient->GetMustBeMappedGuidsInLastBunch().Empty(); } // Copy over any exported bunches PackageMapClient->AppendExportBunches( OwningChannel->QueuedExportBunches ); } }
void FObjectReplicator::QueueRemoteFunctionBunch( UFunction* Func, FOutBunch &Bunch ) { // This is a pretty basic throttling method - just don't let same func be called more than // twice in one network update period. // // Long term we want to have priorities and stronger cross channel traffic management that // can handle this better int32 InfoIdx=INDEX_NONE; for (int32 i=0; i < RemoteFuncInfo.Num(); ++i) { if (RemoteFuncInfo[i].FuncName == Func->GetFName()) { InfoIdx = i; break; } } if (InfoIdx==INDEX_NONE) { InfoIdx = RemoteFuncInfo.AddUninitialized(); RemoteFuncInfo[InfoIdx].FuncName = Func->GetFName(); RemoteFuncInfo[InfoIdx].Calls = 0; } if (++RemoteFuncInfo[InfoIdx].Calls > 2) { UE_LOG(LogNet, Log, TEXT("Too many calls to RPC %s within a single netupdate. Skipping. %s"), *Func->GetName(), *GetObject()->GetName() ); return; } if (RemoteFunctions == NULL) { RemoteFunctions = new FOutBunch(OwningChannel, 0); } RemoteFunctions->SerializeBits( Bunch.GetData(), Bunch.GetNumBits() ); }