性能优化和诊断工具

游戏性能优化和诊断工具是游戏开发中不可或缺的部分,它们帮助开发者识别和解决性能瓶颈,提升游戏的整体表现。以下是一些主要的性能优化和诊断工具及其功能,以及它们的实现方法:

主要功能

  1. 性能监控

    • 实时监控:实时监控游戏的帧率、CPU使用率、GPU使用率、内存使用等关键指标。
    • 历史记录:记录性能数据的历史变化,便于分析和对比。
  2. 性能分析

    • CPU分析:分析CPU的使用情况,找出性能瓶颈和热点函数。
    • GPU分析:分析GPU的使用情况,找出渲染瓶颈和优化点。
    • 内存分析:分析内存的使用情况,找出内存泄漏和不合理的内存分配。
  3. 资源管理

    • 资源加载监控:监控资源的加载时间和频率,优化资源加载策略。
    • 资源使用分析:分析资源的使用情况,找出未使用的资源和可以优化的资源。
  4. 网络诊断

    • 网络延迟监控:监控网络延迟和丢包率,优化网络通信。
    • 网络流量分析:分析网络流量,找出网络瓶颈和优化点。
  5. 调试和诊断

    • 日志系统:记录游戏的运行日志,便于排查问题和分析行为。
    • 断言和检查:在关键位置添加断言和检查,确保程序的正确性和稳定性。
  6. 可视化工具

    • 性能图表:以图表形式展示性能数据,便于直观理解和分析。
    • 场景渲染分析:可视化场景的渲染过程,找出渲染瓶颈和优化点。

实现方法

  1. 性能监控

    • 使用性能监控库(如Unity的Profiler、Unreal Engine的Stat命令)来实时监控游戏的性能指标。
    • 通过操作系统提供的API(如Windows的Performance Counter、Linux的perf工具)获取更详细的性能数据。
  2. 性能分析

    • 使用CPU分析工具(如Intel VTune、Visual Studio Performance Tools)来分析CPU的使用情况。
    • 使用GPU分析工具(如NVIDIA Nsight、AMD Radeon Profiler)来分析GPU的使用情况。
    • 使用内存分析工具(如Valgrind、Unity Memory Profiler)来分析内存的使用情况。
  3. 资源管理

    • 在资源加载时记录加载时间和频率,分析资源加载的性能瓶颈。
    • 使用资源使用分析工具(如Unity Asset Importer、Unreal Engine Asset Manager)来分析资源的使用情况。
  4. 网络诊断

    • 使用网络监控工具(如Wireshark、Fiddler)来监控网络延迟和丢包率。
    • 使用网络流量分析工具(如Unity Networking、Unreal Engine Online Subsystem)来分析网络流量。
  5. 调试和诊断

    • 实现一个日志系统,记录游戏的运行日志,便于排查问题和分析行为。
    • 在关键位置添加断言和检查,确保程序的正确性和稳定性。
  6. 可视化工具

    • 使用图表库(如Qt Charts、D3.js)来实现性能数据的可视化展示。
    • 使用渲染分析工具(如Unity Frame Debugger、Unreal Engine RenderDoc)来可视化场景的渲染过程。

示例代码

以下是一个简单的性能监控工具的示例代码:

#include <chrono>
#include <iostream>
#include <string>

class PerformanceMonitor {
public:
    void StartFrame();
    void EndFrame();
    void LogPerformance();

private:
    std::chrono::high_resolution_clock::time_point frameStartTime_;
    double frameTime_ = 0.0;
    int frameCount_ = 0;
    double totalFrameTime_ = 0.0;
};

void PerformanceMonitor::StartFrame() {
    frameStartTime_ = std::chrono::high_resolution_clock::now();
}

void PerformanceMonitor::EndFrame() {
    auto endTime = std::chrono::high_resolution_clock::now();
    frameTime_ = std::chrono::duration<double, std::milli>(endTime - frameStartTime_).count();
    totalFrameTime_ += frameTime_;
    frameCount_++;
}

void PerformanceMonitor::LogPerformance() {
    double averageFrameTime = totalFrameTime_ / frameCount_;
    std::cout << "Average Frame Time: " << averageFrameTime << " ms" << std::endl;
}

通过这些工具和实现方法,开发者可以有效地监控和优化游戏的性能,提升游戏的整体表现和用户体验。

进一步扩展功能

在前面的讨论中,我们已经涵盖了性能优化和诊断工具的一些基本功能。为了进一步深入探讨,我们可以考虑以下几个方面:

7. 内存泄漏检测
  • 自动检测:自动检测内存泄漏,记录泄漏的内存块和分配位置。
  • 手动检查:提供工具和接口,允许开发者手动检查和标记潜在的内存泄漏点。
8. CPU热点分析
  • 函数调用图:生成函数调用图,展示函数调用关系和调用频率。
  • 热点函数优化:识别和优化CPU使用率高的热点函数。
9. GPU性能分析
  • 渲染管线分析:分析渲染管线的各个阶段,找出性能瓶颈。
  • 着色器优化:优化着色器代码,减少GPU的计算负担。
10. 网络性能优化
  • 带宽分析:分析网络带宽的使用情况,找出带宽瓶颈。
  • 数据包优化:优化数据包的大小和传输频率,减少网络延迟。
11. 资源加载优化
  • 异步加载:实现资源的异步加载,避免阻塞主线程。
  • 资源预加载:根据游戏逻辑预加载资源,减少运行时的加载时间。
12. 可视化调试工具
  • 场景渲染调试:可视化场景的渲染过程,展示渲染批次和渲染时间。
  • 物理模拟调试:可视化物理模拟的结果,展示碰撞检测和响应。

实现扩展功能的示例代码

以下是一个简单的内存泄漏检测工具的示例代码:

#include <unordered_map>
#include <iostream>
#include <cstdlib>

class MemoryLeakDetector {
public:
    void* Allocate(size_t size);
    void Deallocate(void* ptr);
    void CheckLeaks();

private:
    struct AllocationInfo {
        size_t size;
        const char* file;
        int line;
    };
    std::unordered_map<void*, AllocationInfo> allocations_;
};

void* MemoryLeakDetector::Allocate(size_t size) {
    void* ptr = malloc(size);
    if (ptr) {
        allocations_[ptr] = {size, __FILE__, __LINE__};
    }
    return ptr;
}

void MemoryLeariantor::Deallocate(void* ptr) {
    auto it = allocations_.find(ptr);
    if (it != allocations_.end()) {
        free(ptr);
        allocations_.erase(it);
    }
}

void MemoryLeakDetector::CheckLeaks() {
    if (allocations_.empty()) {
        std::cout << "No memory leaks detected." << std::endl;
    } else {
        std::cout << "Memory leaks detected:" << std::endl;
        for (const auto& alloc : allocations_) {
            std::cout << "Leaked " << alloc.second.size << " bytes at " << alloc.first
                      << " allocated from " << alloc.second.file << ":" << alloc.second.line << std::endl;
        }
    }
}

性能优化和诊断工具的进一步优化

为了提高性能和可维护性,性能优化和诊断工具可以进行以下优化:

1. 自动化
  • 自动检测:自动检测和报告性能瓶颈和内存泄漏。
  • 自动优化:根据检测结果自动进行性能优化。
2. 集成化
  • 集成开发环境(IDE)插件:将性能优化和诊断工具集成到IDE中,便于开发者使用。
  • 命令行工具:提供命令行工具,便于在构建和部署过程中进行性能分析和优化。
3. 可视化
  • 图形界面:提供图形界面,便于开发者直观地查看和分析性能数据。
  • 实时监控:实时监控性能数据,并在图形界面中展示。
4. 跨平台支持
  • 多平台支持:支持多种操作系统和硬件平台,确保工具的通用性和兼容性。
  • 跨平台编译:提供跨平台编译选项,便于在不同平台上使用工具。

通过这些扩展功能和优化措施,性能优化和诊断工具可以更好地满足复杂游戏的需求,帮助开发者提升游戏的整体表现和用户体验。

进一步扩展功能

在前面的讨论中,我们已经涵盖了性能优化和诊断工具的一些基本和扩展功能。为了进一步深入探讨,我们可以考虑以下几个方面:

13. 多线程性能分析
  • 线程分析:分析多线程程序的性能,找出线程间的竞争和瓶颈。
  • 并发优化:优化多线程程序的并发执行,提高整体性能。
14. 数据库性能分析
  • 查询优化:分析和优化数据库查询,减少查询时间和资源消耗。
  • 索引优化:优化数据库索引,提高数据检索效率。
15. UI性能分析
  • 渲染优化:分析和优化UI渲染过程,减少渲染时间和资源消耗。
  • 布局优化:优化UI布局,减少布局计算和重绘次数。
16. 音频性能分析
  • 音频渲染优化:分析和优化音频渲染过程,减少音频延迟和资源消耗。
  • 音频编解码优化:优化音频编解码过程,提高音频处理效率。
17. 脚本性能分析
  • 脚本执行优化:分析和优化脚本执行过程,减少脚本运行时间和资源消耗。
  • 脚本编译优化:优化脚本编译过程,提高脚本加载和执行效率。

实现扩展功能的示例代码

以下是一个简单的多线程性能分析工具的示例代码:

#include <thread>
#include <vector>
#include <chrono>
#include <iostream>

class ThreadPerformanceAnalyzer {
public:
    void StartThread(std::function<void()> threadFunc);
    void StopThreads();
    void LogPerformance();

private:
    std::vector<std::thread> threads_;
    std::vector<std::chrono::high_resolution_clock::time_point> threadStartTimes_;
    std::vector<double> threadDurations_;
};

void ThreadPerformanceAnalyzer::StartThread(std::function<void()> threadFunc) {
    threads_.emplace_back(threadFunc);
    threadStartTimes_.push_back(std::chrono::high_resolution_clock::now());
}

void ThreadPerformanceAnalyzer::StopThreads() {
    for (size_t i = 0; i < threads_.size(); ++i) {
        threads_[i].join();
        auto endTime = std::chrono::high_resolution_clock::now();
        threadDurations_.push_back(std::chrono::duration<double, std::milli>(endTime - threadStartTimes_[i]).count());
    }
}

void ThreadPerformanceAnalyzer::LogPerformance() {
    double totalDuration = 0.0;
    for (const auto& duration : threadDadients_) {
        totalDuration += duration;
    }
    double averageDuration = totalDuration / threadDurations_.size();
    std::cout << "Average Thread Duration: " << averageDuration << " ms" << std::endl;
}

性能优化和诊断工具的进一步优化

为了提高性能和可维护性,性能优化和诊断工具可以进行以下优化:

1. 自动化
  • 自动检测:自动检测和报告性能瓶颈和内存泄漏。
  • 自动优化:根据检测结果自动进行性能优化。
2. 集成化
  • 集成开发环境(IDE)插件:将性能优化和诊断工具集成到IDE中,便于开发者使用。
  • 命令行工具:提供命令行工具,便于在构建和部署过程中进行性能分析和优化。
3. 可视化
  • 图形界面:提供图形界面,便于开发者直观地查看和分析性能数据。
  • 实时监控:实时监控性能数据,并在图形界面中展示。
4. 跨平台支持
  • 多平台支持:支持多种操作系统和硬件平台,确保工具的通用性和兼容性。
  • 跨平台编译:提供跨平台编译选项,便于在不同平台上使用工具。

通过这些扩展功能和优化措施,性能优化和诊断工具可以更好地满足复杂游戏的需求,帮助开发者提升游戏的整体表现和用户体验。

进一步扩展功能

在前面的讨论中,我们已经涵盖了性能优化和诊断工具的一些基本和扩展功能。为了进一步深入探讨,我们可以考虑以下几个方面:

18. GPU资源管理
  • 纹理压缩:分析和优化纹理资源的压缩格式和大小。
  • 渲染批次优化:减少渲染批次的数量,提高渲染效率。
19. AI性能分析
  • 路径规划优化:分析和优化AI角色的路径规划算法,减少计算时间和资源消耗。
  • 决策树优化:优化AI角色的决策树,提高决策效率和准确性。
20. 网络资源管理
  • 数据包压缩:分析和优化网络数据包的压缩算法,减少网络带宽消耗。
  • 连接管理优化:优化网络连接的管理,减少连接建立和断开的开销。
21. 物理性能分析
  • 碰撞检测优化:分析和优化碰撞检测算法,减少计算时间和资源消耗。
  • 物理模拟优化:优化物理模拟过程,提高模拟效率和准确性。
22. 跨平台性能分析
  • 平台差异分析:分析和优化不同平台上的性能差异,确保游戏在各平台上的表现一致。
  • 跨平台编译优化:优化跨平台编译过程,提高编译效率和性能。

实现扩展功能的示例代码

以下是一个简单的GPU资源管理工具的示例代码:

#include <unordered_map>
#include <iostream>
#include <string>

class GPUResourceManager {
public:
    void AddTexture(const std::string& textureName, size_t size);
    void RemoveTexture(const std::string& textureName);
    void LogResourceUsage();

private:
    std::unordered_map<std::string, size_t> textureSizes_;
};

void GPUResourceManager::AddTexture(const std::string& textureName, size_t size) {
    textureSizes_[textureName] += size;
}

void GPUResourceManager::RemoveTexture(const std::string& textureName) {
    auto it = textureSizes_.find(textureName);
    if (it != textureSizes_.end()) {
        textureSizes_.erase(it);
    }
}

void GPUResourceManager::LogResourceUsage() {
    size_t totalSize = 0;
    for (const auto& entry : textureSizes_) {
        totalSize += entry.second;
        std::cout << "Texture: " << entry.first << ", Size: " << entry.second << " KB" << std::endl;
    }
    std::cout << "Total GPU Memory Usage: " << totalSize << " KB" << std::endl;
}

性能优化和诊断工具的进一步优化

为了提高性能和可维护性,性能优化和诊断工具可以进行以下优化:

1. 自动化
  • 自动检测:自动检测和报告性能瓶颈和内存泄漏。
  • 自动优化:根据检测结果自动进行性能优化。
2. 集成化
  • 集成开发环境(IDE)插件:将性能优化和诊断工具集成到IDE中,便于开发者使用。
  • 命令行工具:提供命令行工具,便于在构建和部署过程中进行性能分析和优化。
3. 可视化
  • 图形界面:提供图形界面,便于开发者直观地查看和分析性能数据。
  • 实时监控:实时监控性能数据,并在图形界面中展示。
4. 跨平台支持
  • 多平台支持:支持多种操作系统和硬件平台,确保工具的通用性和兼容性。
  • 跨平台编译:提供跨平台编译选项,便于在不同平台上使用工具。

通过这些扩展功能和优化措施,性能优化和诊断工具可以更好地满足复杂游戏的需求,帮助开发者提升游戏的整体表现和用户体验。

进一步扩展功能

在前面的讨论中,我们已经涵盖了性能优化和诊断工具的一些基本和扩展功能。为了进一步深入探讨,我们可以考虑以下几个方面:

23. 代码剖析(Profiling)
  • 函数级剖析:详细分析每个函数的执行时间,找出耗时较长的函数。
  • 调用图剖析:生成函数调用图,展示函数调用关系和调用频率。
24. 内存访问模式分析
  • 缓存命中率分析:分析内存访问的缓存命中率,优化内存访问模式以提高性能。
  • 内存对齐分析:分析内存对齐情况,优化内存分配和访问。
25. 事件驱动性能分析
  • 事件追踪:追踪系统中发生的事件及其对性能的影响。
  • 事件优化:优化事件处理逻辑,减少事件处理的开销。
26. 数据流分析
  • 数据依赖分析:分析数据之间的依赖关系,优化数据流以提高性能。
  • 数据局部性分析:分析数据局部性,优化数据存储和访问。
27. 安全性能分析
  • 安全漏洞检测:检测代码中的安全漏洞,如缓冲区溢出、空指针引用等。
  • 安全性能优化:优化代码以提高安全性,减少安全漏洞的风险。

实现扩展功能的示例代码

以下是一个简单的代码剖析工具的示例代码:

#include <chrono>
#include <iostream>
#include <unordered_map>
#include <string>

class CodeProfiler {
public:
    void StartProfile(const std::string& functionName);
    void EndProfile(const std::string& functionName);
    void LogProfiles();

private:
    std::unordered_map<std::string, std::chrono::high_resolution_clock::time_point> startTimes_;
    std::unordered_map<std::string, double> durations_;
};

void CodeProfiler::StartProfile(const std::string& functionName) {
    startTimes_[functionName] = std::chrono::high_resolution......clock::now();
}

void CodeProfiler::EndProfile(const std::LocalString& functionName) {
    auto endTime = std::chrono::high_resolution_clock::now();
    auto startTime = startTimes_[functionName];
    durations_[functionName] += std::chrono::duration<double, std::milli>(endTime - startTime).count();
}

void CodeProfiler::LogProfiles() {
    for (const auto& entry : durations_) {
        std::cout << "Function: " << entry.first << ", Duration: " << entry.second << " ms" << std::endl;
    }
}

性能优化和诊断工具的进一步优化

为了提高性能和可维护性,性能优化和诊断工具可以进行以下优化:

1. 自动化
  • 自动检测:自动检测和报告性能瓶颈和内存泄漏。
  • 自动优化:根据检测结果自动进行性能优化。
2. 集成化
  • 集成开发环境(IDE)插件:将性能优化和诊断工具集成到IDE中,便于开发者使用。
  • 命令行工具:提供命令行工具,便于在构建和部署过程中进行性能分析和优化。
3. 可视化
  • 图形界面:提供图形界面,便于开发者直观地查看和分析性能数据。
  • 实时监控:实时监控性能数据,并在图形边这句话展示。
4. 跨平台支持
  • 多平台支持:支持多种操作系统和硬件平台,确保工具的通用性和兼容性。
  • 跨平台编译:提供跨平台编译选项,便于在不同平台上使用工具。

通过这些扩展功能和优化措施,性能优化和诊断工具可以更好地满足复杂游戏的需求,帮助开发者提升游戏的整体表现和用户体验。

进一步扩展功能

在前面的讨论中,我们已经涵盖了性能优化和诊断工具的一些基本和扩展功能。为了进一步深入探讨,我们可以考虑以下几个方面:

28. 动态代码分析
  • 运行时分析:在程序运行时动态分析代码的执行情况,找出潜在的性能问题。
  • 热路径分析:识别程序中最频繁执行的代码路径,优化这些关键路径的性能。
29. 资源泄漏检测
  • 内存泄漏检测:自动检测和报告内存泄漏,帮助开发者定位和修复内存管理问题。
  • 资源泄漏检测:检测其他类型的资源泄漏,如文件句柄、网络连接等。
30. 并发和多线程优化
  • 锁竞争分析:分析多线程程序中的锁竞争情况,优化锁的使用以减少性能开销。
  • 线程池优化:优化线程池的使用,提高多线程程序的性能和资源利用率。
31. 数据库性能调优
  • 查询优化:分析和优化数据库查询,减少查询时间和资源消耗。
  • 索引优化:优化数据库索引,提高数据检索效率。
32. 网络性能调优
  • 网络延迟分析:分析网络延迟和丢包率,优化网络通信性能。
  • 带宽优化:优化网络带宽的使用,减少数据传输的开销。

实现扩展功能的示例代码

以下是一个简单的动态代码分析工具的示例代码:

#include <chrono>
#include <iostream>
#include <unordered_map>
#include <string>

class DynamicCodeAnalyzer {
public:
    void StartFunction(const std::string& functionName);
    void EndFunction(const std::string& functionName);
    void LogAnalysis();

private:
    std::unordered_map<std::string, std::chrono::high_resolution_clock::time_point> startTimes_;
    std::unordered_map<std::string, double> durations_;
};

void DynamicCodeAnalyzer::StartFunction(const std::string& functionName) {
    startTimes_[functionName] = std::chrono::high_resolution_clock::now();
}

void DynamicCodeández::EndFunction(const std::string& functionName) {
    auto endTime = std::chrono::high_resolution_clock::now();
    auto startTime = startTimes_[functionName];
    durations_[functionName] += std::chrono::duration<double, std::milli>(endTime - startTime).count();
}

void DynamicCodeAnalyzer::LogAnalysis() {
    for (const auto& entry : durations_) {
        std::cout << "Function: " << entry.first << ", Duration: " << entry.second << " ms" << std::endl;
    }
}

性能优化和诊断工具的进一步优化

为了提高性能和可维护性,性能优化和诊断工具可以进行以下优化:

1. 自动化
  • 自动检测:自动检测和报告性能瓶颈和内存泄漏。
  • 自动优化:根据检测结果自动进行性能优化。
2. 集成化
  • 集成开发环境(IDE)插件:将性能优化和诊断工具集成到IDE中,便于开发者使用。
  • 命令行工具:提供命令行工具,便于在构建和部署过程中进行性能分析和优化。
3. 可视化
  • 图形界面:提供图形界面,便于开发者直观地查看和分析性能数据。
  • 实时监控:实时监控性能数据,并在图形界面中展示。
4. 跨平台支持
  • 多平台支持:支持多种操作系统和硬件平台,确保工具的通用性和兼容性。
  • 跨平台编译:提供跨平台编译选项,便于在不同平台上使用工具。

通过这些扩展功能和优化措施,性能优化和诊断工具可以更好地满足复杂游戏的需求,帮助开发者提升游戏的整体表现和用户体验。

进一步扩展功能

在前面的讨论中,我们已经涵盖了性能优化和诊断工具的一些基本和扩展功能。为了进一步深入探讨,我们可以考虑以下几个方面:

33. 微基准测试
  • 基准测试:创建微基准测试来测量特定代码段的性能。
  • 性能基准:建立性能基准,用于比较不同版本或不同实现之间的性能差异。
34. 代码覆盖率分析
  • 代码覆盖率:测量代码被测试覆盖的程度,确保所有关键代码路径都被测试到。
  • 未覆盖代码检测:检测未被测试覆盖的代码,帮助开发者编写更全面的测试。
35. 依赖分析
  • 模块依赖分析:分析模块之间的依赖关系,优化模块的加载和执行顺序。
  • 数据依赖分析:分析数据之间的依赖关系,优化数据流以提高性能。
36. 异常检测
  • 运行时异常检测:在程序运行时检测异常行为,如内存泄漏、死锁等。
  • 性能异常检测:检测性能异常,如突然的性能下降或资源耗尽。
37. 配置优化
  • 配置文件分析:分析配置文件,优化配置参数以提高性能。
  • 环境变量分析:分析环境变量,优化运行时环境以提高性能。

实现扩展功能的示例代码

以下是一个简单的微基准测试工具的示例代码:

#include <chrono>
#include <iostream>
#include <string>

class MicroBenchmark {
public:
    void StartBenchmark(const std::string& benchmarkName);
    void EndBenchmark(const std::string& benchmarkName);
    void LogBenchmarks();

private:
    std::unordered_map<std::string, std::chrono::high_resolution_clock::time_point> startTimes_;
    std::unordered_map<std::string, double> durations_;
};

void MicroBenchmark::StartBenchmark(const std::string& benchmarkName) {
    startTimes_[benchmarkName] = std::chrono::high_resolution_clock::now();
}

void MicroBenchmark::EndBenchmark(const std::string& benchmarkName) {
    auto endTime = std::chrono::high_resolution_clock::now();
    auto startTime = startTimes_[benchmarkingName];
    durations_[benchmarkName] += std::chrono::duration<double, std::milli>(endTime - startTime).count();
}

void MicroBenchmark::LogBenchmarks() {
    for (const auto& entry : durations_) {
        std::cout << "Benchmark: " << entry.first << ", Duration: " << entry.second << " ms" << std::endl;
    }
}

性能优化和诊断工具的进一步优化

为了提高性能和可维护性,性能优化和诊断工具可以进行以下优化:

1. 自动化
  • 自动检测:自动检测和报告性能瓶颈和内存泄漏。
  • 自动优化:根据检测结果自动进行性能优化。
2. 集成化
  • 集成开发环境(IDE)插件:将性能优化和诊断工具集成到IDE中,便于开发者使用。
  • 命令行工具:提供命令行工具,便于在构建和部署过程中进行性能分析和优化。
3. 可视化
  • 图形界面:提供图形界面,便于开发者直观地查看和分析性能数据。
  • 实时监控:实时监控性能数据,并在图形界面中展示。
4. 跨平台支持
  • 多平台支持:支持多种操作系统和硬件平台,确保工具的通用性和兼容性。
  • 跨平台编译:提供跨平台编译选项,便于在不同平台上使用工具。

通过这些扩展功能和优化措施,性能优化和诊断工具可以更好地满足复杂游戏的需求,帮助开发者提升游戏的整体表现和用户体验。

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛掰是怎么形成的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值