Skip to content

Commit a63c40c

Browse files
DocMoebiuzcpuwolf
andauthored
Add MF.Config.MAX_VARS_PER_FRAME to limit number of variables read in each frame (#13)
* reduce ReadSimVars() count to improve performance 1. use std::list instead of std::vector, for circular iteration 2. list max 5 SimVars reading in very frame 3. VimVars clean() needs update list iterator * too slow for feedback data use 12 for a while * Changed back to std::vector and added method to send command for changing it. * removed explicit DEFAULT value Co-authored-by: Wei Shuai <cpuwolf@sina.com>
1 parent 57355bd commit a63c40c

2 files changed

Lines changed: 31 additions & 4 deletions

File tree

src/PackageDefinitions/mobiflight-event-module.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<AssetPackage Version="0.5.0">
2+
<AssetPackage Version="0.6.0">
33
<ItemSettings>
44
<ContentType>MISC</ContentType>
55
<Title>Event Module</Title>

src/Sources/Code/Module.cpp

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
#include <SimConnect.h>
44
#include <MSFS\Legacy\gauges.h>
55
#include <vector>
6+
#include <list>
67
#include <string>
78
#include <sstream>
89
#include <iostream>
910
#include <fstream>
1011
#include "Module.h"
1112

1213
HANDLE g_hSimConnect;
13-
const char* version = "0.5.0";
14+
const char* version = "0.6.0";
1415

1516
const char* ClientName = "MobiFlightWasmModule";
1617
const char* MobiFlightEventPrefix = "MobiFlight.";
@@ -33,6 +34,10 @@ uint16_t SimVarOffset = 1000;
3334
// For each registered client can 10000 data definition ids are reserved
3435
uint16_t ClientDataDefinitionIdSimVarsRange = 10000;
3536

37+
// Maximum number of variables that are read from sim per frame, Default: 30
38+
// Can be set to different value via config command
39+
uint16_t MOBIFLIGHT_MAX_VARS_PER_FRAME = 30;
40+
3641
// data struct for dynamically registered SimVars
3742
struct SimVar {
3843
int ID;
@@ -58,6 +63,10 @@ struct Client {
5863
// This is an optimization to be able to re-use already defined data definition IDs & request IDs
5964
// after resetting registered SimVars
6065
uint16_t MaxClientDataDefinition = 0;
66+
// Runtime Rolling CLient Data reading Index
67+
//std::vector<SimVar>::iterator RollingClientDataReadIndex;
68+
uint16_t RollingClientDataReadIndex;
69+
6170
};
6271

6372
// The list of currently registered clients
@@ -272,6 +281,8 @@ void RegisterSimVar(const std::string code, Client* client) {
272281
void ClearSimVars(Client* client) {
273282
client->SimVars.clear();
274283
fprintf(stderr, "MobiFlight: Cleared SimVar tracking.");
284+
//client->RollingClientDataReadIndex = client->SimVars.begin();
285+
client->RollingClientDataReadIndex = 0;
275286
}
276287

277288
// Read a single SimVar and send the current value to SimConnect Clients
@@ -293,8 +304,14 @@ void ReadSimVar(SimVar &simVar, Client* client) {
293304
void ReadSimVars() {
294305
for (auto& client : RegisteredClients) {
295306
std::vector<SimVar>* SimVars = &(client->SimVars);
296-
for (auto& value : *SimVars) {
297-
ReadSimVar(value, client);
307+
308+
int maxVarsPerFrame = SimVars->size() < MOBIFLIGHT_MAX_VARS_PER_FRAME ? SimVars->size() : MOBIFLIGHT_MAX_VARS_PER_FRAME;
309+
310+
for (int i=0; i < maxVarsPerFrame; ++i) {
311+
ReadSimVar(SimVars->at(client->RollingClientDataReadIndex), client);
312+
client->RollingClientDataReadIndex++;
313+
if (client->RollingClientDataReadIndex >= SimVars->size())
314+
client->RollingClientDataReadIndex = 0;
298315
}
299316
}
300317
}
@@ -379,6 +396,8 @@ Client* RegisterNewClient(const std::string clientName) {
379396
newClient->DataDefinitionIDStringResponse = 2 * newClient->ID; // 500 Clients possible until offset 1000 is reached
380397
newClient->DataDefinitionIDStringCommand = newClient->DataDefinitionIDStringResponse + 1;
381398
newClient->SimVars = std::vector<SimVar>();
399+
//newClient->RollingClientDataReadIndex = newClient->SimVars.begin();
400+
newClient->RollingClientDataReadIndex = 0;
382401
newClient->DataDefinitionIdSimVarsStart = SimVarOffset + (newClient->ID * ClientDataDefinitionIdSimVarsRange);
383402

384403
RegisteredClients.push_back(newClient);
@@ -525,6 +544,14 @@ void CALLBACK MyDispatchProc(SIMCONNECT_RECV* pData, DWORD cbData, void* pContex
525544
SendNewClientResponse(client, newClient);
526545
fprintf(stderr, "MobiFlight: Received Client to register: %s.\n", str.c_str());
527546
}
547+
548+
if (m_str.get()->find("MF.Config.MAX_VARS_PER_FRAME.Set.") != std::string::npos) {
549+
std::string prefix = "MF.Config.MAX_VARS_PER_FRAME.Set.";
550+
str = m_str.get()->substr(prefix.length());
551+
uint16_t value = static_cast<uint16_t>(std::stoi(str));
552+
MOBIFLIGHT_MAX_VARS_PER_FRAME = value;
553+
fprintf(stderr, "MobiFlight: Set MF.Config.MAX_VARS_PER_FRAME to %u.\n", value);
554+
}
528555
break;
529556
}
530557

0 commit comments

Comments
 (0)