Merge pull request #1121 from karashiiro/fix/rx-net-performance

fix(network): use Observable.Create instead of Subject
This commit is contained in:
goat 2023-02-18 23:08:20 +01:00 committed by GitHub
commit 047a06a232
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -27,7 +27,7 @@ internal class NetworkHandlers : IDisposable, IServiceType
{
private readonly IMarketBoardUploader uploader;
private readonly ISubject<NetworkMessage> messages;
private readonly IObservable<NetworkMessage> messages;
private readonly IDisposable handleMarketBoardItemRequest;
private readonly IDisposable handleMarketTaxRates;
@ -45,14 +45,33 @@ internal class NetworkHandlers : IDisposable, IServiceType
this.uploader = new UniversalisMarketBoardUploader();
this.CfPop = (_, _) => { };
this.messages = new Subject<NetworkMessage>();
this.messages = Observable.Create<NetworkMessage>(observer =>
{
void Observe(IntPtr dataPtr, ushort opCode, uint sourceActorId, uint targetActorId, NetworkMessageDirection direction)
{
var dataManager = Service<DataManager>.GetNullable();
observer.OnNext(new NetworkMessage
{
DataManager = dataManager,
Data = dataPtr,
Opcode = opCode,
SourceActorId = sourceActorId,
TargetActorId = targetActorId,
Direction = direction,
});
}
gameNetwork.NetworkMessage += Observe;
return () =>
{
gameNetwork.NetworkMessage -= Observe;
};
});
this.handleMarketBoardItemRequest = this.HandleMarketBoardItemRequest();
this.handleMarketTaxRates = this.HandleMarketTaxRates();
this.handleMarketBoardPurchaseHandler = this.HandleMarketBoardPurchaseHandler();
this.handleCfPop = this.HandleCfPop();
gameNetwork.NetworkMessage += this.ObserveNetworkMessage;
}
/// <summary>
@ -84,21 +103,6 @@ internal class NetworkHandlers : IDisposable, IServiceType
this.handleCfPop.Dispose();
}
private void ObserveNetworkMessage(
IntPtr dataPtr, ushort opCode, uint sourceActorId, uint targetActorId, NetworkMessageDirection direction)
{
var dataManager = Service<DataManager>.GetNullable();
this.messages.OnNext(new NetworkMessage
{
DataManager = dataManager,
Data = dataPtr,
Opcode = opCode,
SourceActorId = sourceActorId,
TargetActorId = targetActorId,
Direction = direction,
});
}
private IObservable<NetworkMessage> OnNetworkMessage()
{
return this.messages.Where(message => message.DataManager?.IsDataReady == true);