美文网首页
从零开发游戏引擎系列(三)日志系统

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

作者: zaintan | 来源:发表于2021-02-16 16:58 被阅读0次

    该系列教程源自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

    相关文章

      网友评论

          本文标题:从零开发游戏引擎系列(三)日志系统

          本文链接:https://www.haomeiwen.com/subject/tbivxltx.html