• Из-за обновления GTA 5 (был добавлен новый патч) может временно не работать вход в RAGE Multiplayer.

    ERROR: Your game version is not supported by RAGE Multiplayer.

    Данная ошибка говорит о том, что GTA V обновилась до новой версии (GTA Online тоже). Вам необходимо обновить саму игру в главном меню вашего приложения (Steam / Epic Games / Rockstar Games).
    Если после этого RAGE:MP все равно не работает - вам нужно дождаться выхода патча для самого мультиплеера (обычно это занимает от нескольких часов до нескольких дней).

    Новости и апдейты Rockstar Games - https://www.rockstargames.com/ru/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


    Grand Theft Auto 5 (+ GTA Online) последний раз были обновлены:

Вопрос MongoDB или MySQL?

Yormayker

Новый участник
Автор темы
9 Фев 2021
13
1
3
CheatEngine и аналогию. Клиент находится на компе и занимает область памяти в компе, вычислив область которую надо - ты меняешь свое значение.

Данные хранятся не на компе, а на сервере и с ними ты никаких манипуляций сделать не сможешь.
 

Евгений Бусько

Начинающий специалист
16 Янв 2021
35
9
48
Данные хранятся не на компе, а на сервере и с ними ты никаких манипуляций сделать не сможешь.
Т.е. ты хранишь данные 1к игроков в переменной и производишь манипуляции) Производительность вышла из чата :)
 

Yormayker

Новый участник
Автор темы
9 Фев 2021
13
1
3
Т.е. ты хранишь данные 1к игроков в переменной и производишь манипуляции) Производительность вышла из чата :)
Ты серьезно сейчас? Считаешь, что 1-2к игроков создадут непоправимые последствия в случае с переменными? Они занимают ресурс жёсткого диска (хранят какую либо инфу), но никак не мощностя процессора. Ну, если критичны лишние 100мб (с большим запасом), то да, тут по производительности ударит.
 

Евгений Бусько

Начинающий специалист
16 Янв 2021
35
9
48
Ты серьезно сейчас? Считаешь, что 1-2к игроков создадут непоправимые последствия в случае с переменными? Они занимают ресурс жёсткого диска (хранят какую либо инфу), но никак не мощностя процессора. Ну, если критичны лишние 100мб (с большим запасом), то да, тут по производительности ударит.
Ну если ты думаешь что производительноть это только железо сервера то ок)) А как ты будет дебажить когда 100+ методов обращаются к одной переменной, производят различные операции над этой переменной(примеров можно уйму привести, просто лень писать). Попробуй такое на работе в продакшене сделать - думаю сеньер или техлид будут очень недовольны)
 

Yormayker

Новый участник
Автор темы
9 Фев 2021
13
1
3
Ладно, останемся при своем мнении, тут можно долго говорить))
 

FANNER

Активный участник
18 Сен 2020
18
1
43
MongoDB - Json. Если сравнивать их скорости, то mysql выиграет, т.к. скорость архитектуры sql в разы выше, чем у json. Также mysql известен всем. Есть удобная phpmyadmin панель для работы с данными. Двумя словами - простой и надежный, как швейцарский часы :D. Конечный вердикт за вами.
 

Wa3Rix

Активный участник
high coder
19 Ноя 2020
32
4
30
Протестил скорость INSERT, SELECT и save, find. Почему-то получилось якобы MySQL медленнее в разы.
Тестил на OpenServer MongoDB 4.2 (x64), MySQL 5.7 (x64)

[MySQL] INSERT at 10 times waste 330 ms. [MongoDB] save at 10 times waste 21 ms.
[MySQL] INSERT at 100 times waste 4394 ms. [MongoDB] save at 100 times waste 140 ms.
[MySQL] INSERT at 1000 times waste 44092 ms. [MongoDB] save at 1000 times waste 1311 ms.

[MySQL] SELECT at 10 times waste 99 ms. [MongoDB] find at 10 times waste 129 ms.
[MySQL] SELECT at 100 times waste 1140 ms. [MongoDB] find at 100 times waste 1618 ms.
[MySQL] SELECT at 1000 times waste 11712 ms. [MongoDB] find at 1000 times waste 17912 ms.

XczsGWL.png


JavaScript:
const mysql = require("mysql2");

const connection = mysql.createConnection(
{
    host: "127.0.0.1",
    user: "root",
    password: "",
    database: "db_server"
});

connection.connect((error) =>
{
    if(error)
        console.log("MySQL error: " + error);
    else
    {
        console.log("Подлючение с базой MySQL установленно!");
    }
});

function ObjectToInsertQuery(db_table, object)
{
    let sql_str = "INSERT INTO `test`";// (`id`, `intValue`, `floatValue`, `stringValue`) VALUES (NULL, '1', '2.1', 'dwa');"
    let keys = "", values = "", is_first = true;
    for([key, value] of Object.entries(object))
    {
        if(!is_first)
        {
            keys += ",";
            values += ",";   
        }

        keys += `\`${key}\``;
        values += `'${value}'`;
        is_first = false;
    }

    return `INSERT INTO \`${db_table}\` (${keys}) VALUES (${values});`;
}

function SpeedTestInsertSQL(max_req)
{
    let object =
    {
        numberInt    :     65535,
        numberFloat    :    3.14,
        string        :    "Hello world"
    };
    let query_str = ObjectToInsertQuery("test", object);
    //console.log(query_str);
    
    let date = new Date();
    let start_time = date.getTime();
    let work_count = 0;
    for(let i=0; i<max_req; i++)
    {
        connection.query(query_str, (error, result) =>
        {
            // Очередь? Таймер запускается после выполнения 1-го запроса
            if(work_count == 0)
            {
                date = new Date();
                start_time = date.getTime();   
            }

            if(++work_count >= max_req)
            {
                date = new Date();
                console.log(`\x1b[33m[MySQL] INSERT at ${work_count} times waste ${(date.getTime() - start_time)} ms.` );
            }
        });
    }
}

function SpeedTestReadSQL(max_req)
{
    let date = new Date();
    let start_time = date.getTime();
    let work_count = 0;
    for(let i=0; i<max_req; i++)
    {
        let query_str = `SELECT * FROM \`test\` WHERE \`id\` = 1`;
        connection.query(query_str, (error, result) =>
        {
            if(work_count == 0)
            {
                date = new Date();
                start_time = date.getTime();   
            }

            if(++work_count >= max_req)
            {
                date = new Date();
                console.log(`\x1b[32m[MySQL] SELECT at ${work_count} times waste ${(date.getTime() - start_time)} ms.` );
            }
        });
    }
}

function main()
{
    for(let i=1; i<4; i++)
        SpeedTestInsertSQL(Math.pow(10, i));

    for(let i=1; i<4; i++)
        SpeedTestReadSQL(Math.pow(10, i));

    
    
}

setTimeout(main, 30000);

JavaScript:
const mongoose = require("mongoose");
const connection = mongoose.connect("mongodb://127.0.0.1:27017/db_server", {keepAlive: true, useUnifiedTopology: true});

mongoose.connection.on('error', (error) =>
{
    console.error("[MongoDB] Connection error: " + error);
    process.exit(2);
});

mongoose.connection.on('connected',() =>
{
    console.log("[MongoDB] Соединение с базой установленно");
});

let schTest = mongoose.Schema(
{
    numberInt    :     Number,
    numberFloat    :    Number,
    string        :    String
});
var mTest = mongoose.model("tested", schTest);

function SpeedTestMongoSave(max_req)
{
    let date = new Date();
    let start_time = date.getTime();
    let work_count = 0;
    for(let i=0; i<max_req; i++)
    {
        let test = new mTest(
        {
            numberInt    :     1,
            numberFloat    :    3.14,
            string        :    "Test"       
        });
        test.save((error, doc) =>
        {
            if(work_count == 0)
            {
                date = new Date();
                start_time = date.getTime();
            }

            if(++work_count >= max_req)
            {
                date = new Date();
                console.log(`\x1b[33m[MongoDB] save at ${work_count} times waste ${(date.getTime() - start_time)} ms.` );
            }
        });
    }
}

function SpeedTestMongoFind(max_req)
{
    let date = new Date();
    let start_time = date.getTime();
    let work_count = 0;
    for(let i=0; i<max_req; i++)
    {
        mTest.find({numberInt: 65535}).limit(1).exec((error, row) =>
        {
            if(work_count == 0)
            {
                date = new Date();
                start_time = date.getTime();
            }

            if(++work_count >= max_req)
            {
                date = new Date();
                console.log(`\x1b[32m[MongoDB] find at ${work_count} times waste ${(date.getTime() - start_time)} ms.` );
            }
        });
    }
}

function main()
{
    for(let i=1; i<4; i++)
        SpeedTestMongoSave(Math.pow(10, i));

    for(let i=1; i<4; i++)
        SpeedTestMongoFind(Math.pow(10, i));
}main();
 

UchihaMadara

Гуру
high coder
27 Окт 2020
512
225
101
Протестил скорость INSERT, SELECT и save, find. Почему-то получилось якобы MySQL медленнее в разы.
Тестил на OpenServer MongoDB 4.2 (x64), MySQL 5.7 (x64)

[MySQL] INSERT at 10 times waste 330 ms. [MongoDB] save at 10 times waste 21 ms.
[MySQL] INSERT at 100 times waste 4394 ms. [MongoDB] save at 100 times waste 140 ms.
[MySQL] INSERT at 1000 times waste 44092 ms. [MongoDB] save at 1000 times waste 1311 ms.

[MySQL] SELECT at 10 times waste 99 ms. [MongoDB] find at 10 times waste 129 ms.
[MySQL] SELECT at 100 times waste 1140 ms. [MongoDB] find at 100 times waste 1618 ms.
[MySQL] SELECT at 1000 times waste 11712 ms. [MongoDB] find at 1000 times waste 17912 ms.

XczsGWL.png


JavaScript:
const mysql = require("mysql2");

const connection = mysql.createConnection(
{
    host: "127.0.0.1",
    user: "root",
    password: "",
    database: "db_server"
});

connection.connect((error) =>
{
    if(error)
        console.log("MySQL error: " + error);
    else
    {
        console.log("Подлючение с базой MySQL установленно!");
    }
});

function ObjectToInsertQuery(db_table, object)
{
    let sql_str = "INSERT INTO `test`";// (`id`, `intValue`, `floatValue`, `stringValue`) VALUES (NULL, '1', '2.1', 'dwa');"
    let keys = "", values = "", is_first = true;
    for([key, value] of Object.entries(object))
    {
        if(!is_first)
        {
            keys += ",";
            values += ",";  
        }

        keys += `\`${key}\``;
        values += `'${value}'`;
        is_first = false;
    }

    return `INSERT INTO \`${db_table}\` (${keys}) VALUES (${values});`;
}

function SpeedTestInsertSQL(max_req)
{
    let object =
    {
        numberInt    :     65535,
        numberFloat    :    3.14,
        string        :    "Hello world"
    };
    let query_str = ObjectToInsertQuery("test", object);
    //console.log(query_str);
   
    let date = new Date();
    let start_time = date.getTime();
    let work_count = 0;
    for(let i=0; i<max_req; i++)
    {
        connection.query(query_str, (error, result) =>
        {
            // Очередь? Таймер запускается после выполнения 1-го запроса
            if(work_count == 0)
            {
                date = new Date();
                start_time = date.getTime();  
            }

            if(++work_count >= max_req)
            {
                date = new Date();
                console.log(`\x1b[33m[MySQL] INSERT at ${work_count} times waste ${(date.getTime() - start_time)} ms.` );
            }
        });
    }
}

function SpeedTestReadSQL(max_req)
{
    let date = new Date();
    let start_time = date.getTime();
    let work_count = 0;
    for(let i=0; i<max_req; i++)
    {
        let query_str = `SELECT * FROM \`test\` WHERE \`id\` = 1`;
        connection.query(query_str, (error, result) =>
        {
            if(work_count == 0)
            {
                date = new Date();
                start_time = date.getTime();  
            }

            if(++work_count >= max_req)
            {
                date = new Date();
                console.log(`\x1b[32m[MySQL] SELECT at ${work_count} times waste ${(date.getTime() - start_time)} ms.` );
            }
        });
    }
}

function main()
{
    for(let i=1; i<4; i++)
        SpeedTestInsertSQL(Math.pow(10, i));

    for(let i=1; i<4; i++)
        SpeedTestReadSQL(Math.pow(10, i));

   
   
}

setTimeout(main, 30000);

JavaScript:
const mongoose = require("mongoose");
const connection = mongoose.connect("mongodb://127.0.0.1:27017/db_server", {keepAlive: true, useUnifiedTopology: true});

mongoose.connection.on('error', (error) =>
{
    console.error("[MongoDB] Connection error: " + error);
    process.exit(2);
});

mongoose.connection.on('connected',() =>
{
    console.log("[MongoDB] Соединение с базой установленно");
});

let schTest = mongoose.Schema(
{
    numberInt    :     Number,
    numberFloat    :    Number,
    string        :    String
});
var mTest = mongoose.model("tested", schTest);

function SpeedTestMongoSave(max_req)
{
    let date = new Date();
    let start_time = date.getTime();
    let work_count = 0;
    for(let i=0; i<max_req; i++)
    {
        let test = new mTest(
        {
            numberInt    :     1,
            numberFloat    :    3.14,
            string        :    "Test"      
        });
        test.save((error, doc) =>
        {
            if(work_count == 0)
            {
                date = new Date();
                start_time = date.getTime();
            }

            if(++work_count >= max_req)
            {
                date = new Date();
                console.log(`\x1b[33m[MongoDB] save at ${work_count} times waste ${(date.getTime() - start_time)} ms.` );
            }
        });
    }
}

function SpeedTestMongoFind(max_req)
{
    let date = new Date();
    let start_time = date.getTime();
    let work_count = 0;
    for(let i=0; i<max_req; i++)
    {
        mTest.find({numberInt: 65535}).limit(1).exec((error, row) =>
        {
            if(work_count == 0)
            {
                date = new Date();
                start_time = date.getTime();
            }

            if(++work_count >= max_req)
            {
                date = new Date();
                console.log(`\x1b[32m[MongoDB] find at ${work_count} times waste ${(date.getTime() - start_time)} ms.` );
            }
        });
    }
}

function main()
{
    for(let i=1; i<4; i++)
        SpeedTestMongoSave(Math.pow(10, i));

    for(let i=1; i<4; i++)
        SpeedTestMongoFind(Math.pow(10, i));
}main();

В SQL INSERT не делают циклом. Это плохая практика. Так что не показатель
 

Wa3Rix

Активный участник
high coder
19 Ноя 2020
32
4
30
В SQL INSERT не делают циклом. Это плохая практика. Так что не показатель
Да, теперь всё сходится. не то что бы я когда либо использовал INSERT в цикле, но это первое что пришло в мысль для теста.
Код:
[MySQL] INSERT with 10 lines waste 708 ms.
[MySQL] INSERT with 100 lines waste 738 ms.
[MySQL] INSERT with 1000 lines waste 770 ms.
[MySQL] INSERT with 10000 lines waste 997 ms.
[MySQL] INSERT with 100000 lines waste 2169 ms.
 

Cook old

Активный участник
8 Ноя 2020
6
4
40
Они занимают ресурс жёсткого диска
сначала они занимают ресурс ОЗУ, если ее недостаточно, тогда уже часть отправляется в ПЗУ.
А как ты будет дебажить когда 100+ методов обращаются к одной переменной, производят различные операции над этой переменной
в сампе кстати так все и делается (по крайней мере на серверах, написанных на Pawn), так как в языке нет каких-либо иных конструкций, кроме глобальных переменных.
В Rage вроде бы даже C# есть, поэтому если у приложения настолько сложная логика, берите ООП и не будет проблем.