从零开发游戏引擎系列(三)日志系统

2021-02-16  本文已影响0人  zaintan

该系列教程源自youtube的cherno的视频-GAME ENGINE series!

视频地址: https://www.youtube.com/watch?v=vtWdgtMo1T4

引擎源代码地址: https://github.com/TheCherno/Hazel

主要内容简介:

将使用第三方库speedlog: https://github.com/gabime/spdlog

当前cmd目录下E:\GitResp\GameEngine\Hazel 执行

git submodule add https://github.com/gabime/spdlog Hazel/vendor/spdlog

将使用Hazel/vendor下放所有的第三方库

按照从零开发游戏引擎系列(二)引擎入口所教的步骤 :
分别给项目Hazel Sandbox都添加头文件目录:(注意每个平台(Debug/Release)都要设置) $(SolutionDir)Hazel\vendor\spdlog\include
配置属性 -> c/c++ -> 常规 -> 附加包含目录

然后开始写日志包装器, 写日志包装器主要是为了以后替换第三方库方便。

增加
Hazel/Log.h
Hazel/Log.cpp
修改
Hazel/EntryPoint.h
Hazel.h

最新目录结构如下:


image.png

Hazel/Log.h

#pragma once

#include <memory> // for use shared_ptr<>
#include "Core.h"
#include "spdlog/spdlog.h"

namespace Hazel {
    class HAZEL_API Log
    {
    public:
        static void Init();
        inline static std::shared_ptr<spdlog::logger>& GetCoreLogger() { return s_CoreLogger; }
        inline static std::shared_ptr<spdlog::logger>& GetClientLogger() { return s_ClientLogger; }
    private:
        static std::shared_ptr<spdlog::logger> s_CoreLogger;//for engine use
        static std::shared_ptr<spdlog::logger> s_ClientLogger;//for client app use
    };
}

// Core log macros
#define HZ_CORE_TRACE(...)    ::Hazel::Log::GetCoreLogger()->trace(__VA_ARGS__)
#define HZ_CORE_INFO(...)     ::Hazel::Log::GetCoreLogger()->info(__VA_ARGS__)
#define HZ_CORE_WARN(...)     ::Hazel::Log::GetCoreLogger()->warn(__VA_ARGS__)
#define HZ_CORE_ERROR(...)    ::Hazel::Log::GetCoreLogger()->error(__VA_ARGS__)
#define HZ_CORE_CRITICAL(...) ::Hazel::Log::GetCoreLogger()->critical(__VA_ARGS__)

// Client log macros
#define HZ_TRACE(...)         ::Hazel::Log::GetClientLogger()->trace(__VA_ARGS__)
#define HZ_INFO(...)          ::Hazel::Log::GetClientLogger()->info(__VA_ARGS__)
#define HZ_WARN(...)          ::Hazel::Log::GetClientLogger()->warn(__VA_ARGS__)
#define HZ_ERROR(...)         ::Hazel::Log::GetClientLogger()->error(__VA_ARGS__)
#define HZ_CRITICAL(...)      ::Hazel::Log::GetClientLogger()->critical(__VA_ARGS__)

Hazel/Log.cpp

#include "Log.h"
#include "spdlog/sinks/stdout_color_sinks.h"//stdout_color_mt接口需要

namespace Hazel {

    std::shared_ptr<spdlog::logger> Log::s_CoreLogger;
    std::shared_ptr<spdlog::logger> Log::s_ClientLogger;

    void Log::Init() {
        spdlog::set_pattern("%^[%T] %n: %v%$");
        
        s_CoreLogger = spdlog::stdout_color_mt("HAZEL");
        s_CoreLogger->set_level(spdlog::level::trace);

        s_ClientLogger = spdlog::stdout_color_mt("APP");
        s_ClientLogger->set_level(spdlog::level::trace);
    }
}

Hazel/EntryPoint.h

#pragma once

#ifdef HZ_PLATFORM_WINDOWS

extern Hazel::Application* Hazel::CreateApplication();

int main(int argc, char** argv) {

    Hazel::Log::Init();//日志初始化

    HZ_CORE_WARN("Engine Init!");//打印日志
    HZ_INFO("Hello!");

    auto app = Hazel::CreateApplication();
    app->Run();
    delete app;
    return 0;
}

#endif

Hazel.h

#pragma once

#include "Hazel/Application.h"
#include "Hazel/Log.h"//增加Log.h头文件

总结要点:
1.使用github submodule管理第三方库,方便更新
2.依赖的第三方统一放在引擎vendor目录下,方便管理
3.两个日志实例区分开引擎的日志输出和游戏应用的日志输出,避免相互影响
4.使用宏简化日志打印函数,调用方更友好,也使需替换修改的时候管理更可控

注意 改动了Hazel引擎相关代码 重编后时候要把exe目录下的.dll更新成最新编的.dll

上一篇下一篇

猜你喜欢

热点阅读