bg游戏资讯:开源框架介绍,环境搭建

作者: 游戏通关视频  发布:2019-09-24

引言 - 有时心起, libuv linux 搭建

引言 - 一切才刚刚初叶

  有一天猛然想起来想写个动画. 找了一晃 ui 库太大. 前面想起在此之前弄过的 libuv. 但意识 libuv 相关材质也相当少.

  structc 是 C 结构基础库. 轻松可复用.

由此就有了那么些内容. 

  structc -

  libuv -

  此前也陈述过一回 structc, 文字多代码风格少. 近年来加班加点相当少, 图谋详细解释哈其思维初志.

libuv 在 linux 上边运用相比简单,  一伊始 从 linux hello 跑起来

0.0 全体布局

libuv linux 安装

structc├── extern├── LICENSE├── Makefile├── README.md├── structc└── structc.sln

率先假定你和本身同一用的是Ubuntu去做开荒. 在云平台下边测量试验过, Ubuntu Server 版本比 CentOS 版本少个十几兆.

structc.sln : winds 项目管理文件visual studio

有意思味朋友能够详细相比较数据, 也能够尝试跑跑 Ubuntu Server .

structc : 项目完全源码和资料文件目录

# libuv 安装
cd
wget https://github.com/libuv/libuv/archive/v1.18.0.tar.gz
tar -zxvf v1.18.0.tar.gz
cd libuv-1.18.0

sh autogen.sh
./configure

make -j4

sudo make install
sudo ldconfig
cd ../
rm -rf libuv-1.18.0 v1.18.0.tar.gz
```

README.md : 项目介绍 马克down

举行下边命令操作, 大家的体系中就已经有了 libuv 开垦遇到.

bg游戏资讯:开源框架介绍,环境搭建。Makefile : linux 编写翻译文件make

有一点亟需留意的是当大家要运用 libuv时候推荐用静态库.

LICENSE : MIT 开源公约

gcc -l:libuv.a

externbg游戏资讯:开源框架介绍,环境搭建。 : 项目引进的外界库目录

到这里 linux 安装 libuvbg游戏资讯:开源框架介绍,环境搭建。bg游戏资讯:开源框架介绍,环境搭建。 已经告竣了. 

extern├── jemalloc├── jemalloc-vc141-Release-static.lib├── libuv.lib├── pthread.h├── pthread_lib.lib├── sched.h├── semaphore.h├── strings.h├── uv└── uv.h

bg游戏资讯:开源框架介绍,环境搭建。  不要紧写个 hello world demo

bg游戏资讯:开源框架介绍,环境搭建。上述正是大家见到 structc 项目完全结构.

#include <uv.h>
#include <assext.h>

//
// 测试 libuv tty 操作控制台
// 输出一段有颜色的文字
//
void uv_tty_test(void) {
    uv_tty_t tty;
    uv_buf_t buf[3];
    unsigned i, len = sizeof buf / sizeof *buf;
    uv_loop_t * loop = uv_default_loop();

    // 目前只对 tty 控制台处理
    if (uv_guess_handle(1) != UV_TTY) {
        fprintf(stderr, "uv_guess_handle(1) != UV_TTY!n");
        exit(EXIT_FAILURE);
    }

    uv_tty_init(loop, &tty, 1, 0);
    uv_tty_set_mode(&tty, UV_TTY_MODE_NORMAL);

    // 开始发送消息
    buf[0].base = "\033[46;37m";
    buf[1].base = u8"(✿◡‿◡) 喵酱 ((●'-'●)) 比 ♥ 里~ n";
    buf[2].base = "\033[0m";
    for (i = 0; i < len;   i)
        buf[i].len = (int)strlen(buf[i].base);
    uv_try_write((uv_stream_t *)&tty, buf, len);

    // 重置终端行为
    uv_tty_reset_mode();
    uv_run(loop, UV_RUN_DEFAULT);
}

0.1 外部库

代码运转作效果果是, 输出一段话, 並且设置背景观.  对于  uv_tty_test 能够掌握为 main (本质是 structc 一种单元测验函数约束写法)

  当前十分的小心的引进三个半表面库. 最大程度会静态库编写翻译链接运转. 荣小编慢慢细说.

到那容小编安利二个小东西, 感兴趣的能够品味一下, 从零开首搭建二个 c 的 struct 小框架. 五脏慢慢全了.

  1. jemalloc -

  bg游戏资讯:开源框架介绍,环境搭建。structc -

bg游戏资讯:开源框架介绍,环境搭建。  jemalloc 是 c 营造底层高品质 malloc 库. 也被称为系统一编写程后期最后免费中饭.整个structc

一句话来讲说一下libuv中选用的多少个函数,  第一个是 uv_try_write 尝试马上发送音讯数组. 不像 uv_write 写入到新闻队列中.

malloc全权交给 je_malloc 抗压.在那之中 winds 编译静态库部分, 项目本身也是有细说 -

int uv_try_write(uv_stream_t* handle, const uv_buf_t bufs[], unsigned int nbufs)

    Same as uv_write(), but won’t queue a write request if it can’t be completed immediately.
    Will return either:
        > 0: number of bytes written (can be less than the supplied buffer size).
        < 0: negative error code (UV_EAGAIN is returned if no data can be sent immediately).

当前大家是用 tty 输出到显示屏方面, 能够用那几个 api . 若是单独是走 TCP, 不要过于正视那一个 api.

How to build jemalloc for Windows=================================1. Install Cygwin with at least the following packages:   * autoconf   * autogen   * gawk   * grep   * sed2. Install Visual Studio 2015 or 2017 with Visual C  3. Add Cygwinbin to the PATH environment variable4. Open "x64 Native Tools Command Prompt for VS 2017"   (note: x86/x64 doesn't matter at this point)5. Generate header files:   sh -c "CC=cl ./autogen.sh"6. Now the project can be opened and built in Visual Studio:   msvcjemalloc_vc2017.sln

简单的讲为了稳固还是别用 uv_try_write.

( 注: vs 使用新型版本. 网站打不开那就FQ. 后边其也一致, 时刻保障最新 2018/10/10 ~ )

其次个要说的是 uv_run

对于 linux 编写翻译安装参照上边脚本

int uv_run(uv_loop_t* loop, uv_run_mode mode)

    This function runs the event loop. It will act differently depending on the specified mode:
        UV_RUN_DEFAULT: Runs the event loop until there are no more active and referenced handles or requests. 
              Returns non-zero if uv_stop() was called and there are still active handles or requests.
               Returns zero in all other cases.
        UV_RUN_ONCE: Poll for i/o once. Note that this function blocks if there are no pending callbacks. 
             Returns zero when done (no active handles or requests left), 
             or non-zero if more callbacks are expected 
             (meaning you should run the event loop again sometime in the future).
        UV_RUN_NOWAIT: Poll for i/o once but don’t block if there are no pending callbacks. 
              Returns zero if done (no active handles or requests left), 
              or non-zero if more callbacks are expected 
              (meaning you should run the event loop again sometime in the future).
# 开发环境安装sudo apt install gcc gdb autogen autoconf# jemalloc 安装cdwget https://github.com/jemalloc/jemalloc/releases/download/5.1.0/jemalloc-5.1.0.tar.bz2tar -jxvf jemalloc-5.1.0.tar.bz2cd jemalloc-5.1.0sh autogen.shmake -j4sudo make installsudo ldconfigcdrm -rf jemalloc-5.1.0 jemalloc-5.1.0.tar.bz2

其中 UV_RUN_DEFAULT 表示 uv_run 会平昔不通运维, 只到未有职业要拍卖的时候, 才会有再次回到值.

当 jemalloc 构建好了. 设计 alloc 层引进到 structc 框架中, 客商代替系统 malloc...

而 UV_RUN_ONCE 代表实施 poll 贰遍. 类比你写代码只调用贰次 select 阻塞, 直到事件激活恐怕逾期触发.

alloc.h -

相似的 UV_RUN_NOWAIT 也是只 poll 轮询二次, 然则未有要管理业务是不会阻塞.

#ifndef _H_ALLOC#define _H_ALLOC#include <stdlib.h>#include <string.h>// :) 高效内存分配, 莫名伤感 ~// _MSC_VER -> Winds CL// __GNUC__ -> Linux GCC//#ifdef _MSC_VER//// CPU 检测 x64 or x86// ISX64 defined 表示 x64 否则 x86//#   if defined || defined#       define ISX64#   endif//// _M_PPC 为 PowerPC 平台定义, 现在已不支持// so winds 可以认为都是小端平台//#   if defined#       define ISBENIAN#   endif#elif  __GNUC__#   if defined(__x86_64__)#       define ISX64#   endif//// 大小端检测 : ISBENIAN defined 表示大端//#   if defined(__BIG_ENDIAN__) || defined(__BIG_ENDIAN_BITFIELD)#       define ISBENIAN#   endif#else#   error BUILD  S#endif// OFF_ALLOC - 关闭全局 free / malloc 配置#ifndef OFF_ALLOC#   undef  free#   define free    free_#   undef  strdup#   define strdup  strdup_#   undef  malloc#   define malloc  malloc_#   undef  calloc#   define calloc  calloc_#   undef  realloc#   define realloc realloc_#endif//OFF_ALLOC//// free_ - free 包装函数// ptr      : 内存首地址// return   : void//extern void free_(void * ptr);//// malloc_ - malloc 包装, 封装一些特殊业务// size     : 分配的内存字节// return   : 返回可使用的内存地址.//extern void * malloc_(size_t size);//// strdup_ - strdup 包装函数// s        : '\0' 结尾 C 字符串// return   : 拷贝后新的 C 字符串//extern char * strdup_(const char * s);//// calloc_ - calloc 包装, 封装一些特殊业务// num      : 数量// size     : 大小// return   : 返回可用内存地址, 并且置0//extern void * calloc_(size_t num, size_t size);//// realloc_ - realoc 包装函数, 封装一些特殊业务// ptr      : 内存首地址, NULL 等同于 malloc// size     : 重新分配的内存大小// return   : 返回重新分配好的新地址内容//extern void * realloc_(void * ptr, size_t size);#endif//_H_STDEXIT

  到这里, 差十分少 linux libuv 的 hello world 应该也算起来了.

alloc.c -

 

#include <stdio.h>#define OFF_ALLOC#include "alloc.h"#define JEMALLOC_NO_DEMANGLE#include <jemalloc/jemalloc.h>//// free_ - free 包装函数// ptr      : 内存首地址// return   : void//inline void free_(void * ptr) {    je_free;}// 简单内存不足检测处理static inline void * mcheck(void * ptr, size_t size) {    if (NULL == ptr) {        fprintf(stderr, "out of memory trying to allocate %zun", size);        fflush;        abort();    }    return ptr;}//// malloc_ - malloc 包装, 封装一些特殊业务// size     : 分配的内存字节// return   : 返回可使用的内存地址.//inline void * malloc_(size_t size) {    void * ptr = je_malloc;    return mcheck(ptr, size);}//// strdup_ - strdup 包装函数// s        : '\0' 结尾 C 字符串// return   : 拷贝后新的 C 字符串//inline char * strdup_(const char * s) {    if  {        size_t n = strlen   1;        char * ptr = malloc_;        return memcpy(ptr, s, n);    }    return NULL;}//// calloc_ - calloc 包装, 封装一些特殊业务// num      : 数量// size     : 大小// return   : 返回可用内存地址, 并且置0//inline void * calloc_(size_t num, size_t size) {    void * ptr = je_calloc(num, size);    return mcheck(ptr, size);}//// realloc_ - realoc 包装函数, 封装一些特殊业务// ptr      : 内存首地址, NULL 等同于 malloc// size     : 重新分配的内存大小// return   : 返回重新分配好的新地址内容//inline void * realloc_(void * ptr, size_t size) {    void * ntr = je_realloc(ptr, size);    return mcheck(ntr, size);}

前言 - winds 跑起 libuv

包装了一层. 从 alloc.h 中 OFF_ALLOC 宏能够见见, 具有援助插拔手艺 ~

   下面开端带大家, 在 winds 编写翻译最新版本 libuv.  一样在 github 上 下载 libuv 最新的发表版本.

2.libuv -  

    libuv-1.18.0

  libuv 用 c 写的高质量单线程网络 io 库. 希望经过它来支撑网络层.winds 编写翻译静态库

参照 libuv 项目首页燥起来就行. 当中 gyp 安装了那么些本子, 其余随俗浮沉 ~

解压操作完结后, 会是底下那样的

  gyp -

bg游戏资讯 1

linux 编写翻译安装脚本

那时候先参照一下官方网站的 libuv 首页 README.md 表达.  

# libuv 安装cdwget https://github.com/libuv/libuv/archive/v1.23.1.zipunzip v1.23.1.zipcd libuv-1.23.1sh autogen.sh./configuremake -j4sudo make installsudo ldconfigcd## 注意 uv 头文件, 全部导入到系统 include 目录下面#rm -rf libuv-1.23.1 v1.23.1.zip

先安装 Python 2.7 . 扯一点.  以来 python 好虎 (二〇一七年10月三十日),  可是依旧不知道为何 2.7 和 3.x 版本不包容. 

注意要将编写翻译后 include 完整拷贝到安装目录 include下. 那样 uv 头文件全, 日后会用到.

就现阶段来说依旧多用 Python 2.7 感到.  随后安装 gyp google 推出的跨平台编写翻译意况.

libuv 开箱即用, 不太须求怎么样基础封装.

  gyp - 

3.pthread -

是因为采纳的是 VS2017, 原始版本 gyp 不帮衬, 请参照笔者提的那么些提交, 进行更换让其协理 VS2017 版本

  那是最终那半个, 为 winds 引进 POSIX thread 模型.编写翻译起来很简短(前提咱们 VS 玩的熟).

  gyp-vs2017 version  - 

扯点闲篇. linux 和 winds 相得益彰, 对峙而统一. 一个是全部从头码, 贰个开首就已经登记未来.

ok winds 10 VS2017 libuv-1.18.0 python2.7 gyp gyp vs2017 version 编写翻译遇到搭建达成.

呈报非常粗大, 但大致那意思. (七个都不 eary, 玩比较久才敢入门见三叔婆婆) . 这里包装了一层

最初走起, 先走入 gyp 目录施行 

thread.h -

python .setup.py install
#ifndef _H_THREAD#define _H_THREAD#include "struct.h"#include <pthread.h>#include <semaphore.h>//// pthread_end - 等待启动线程结束// tid      : 线程id// return   : void//inline void pthread_end(pthread_t tid) {    pthread_join(tid, NULL);}//// pthread_run - 异步启动线程// id       : &tid 线程id地址// frun     : 运行的主体// arg      : 运行参数// return   : 返回线程构建结果, 0 is success//#define pthread_run(id, frun, arg)                                  pthread_run_(&(id), , (void *)inline int pthread_run_(pthread_t * id, node_f frun, void * arg) {    return pthread_create(id, NULL, frun, arg);}//// pthread_async - 异步启动分离线程// frun     : 运行的主体// arg      : 运行参数// return   : 返回 0 is success// #define pthread_async(frun, arg)                                    pthread_async_, (void *)inline int pthread_async_(node_f frun, void * arg) {    int ret;    pthread_t tid;    pthread_attr_t attr;    pthread_attr_init(&attr);    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);    ret = pthread_create(&tid, &attr, frun, arg);    pthread_attr_destroy(&attr);    return ret;}#endif//_H_THREAD

bg游戏资讯 2

选择今世编写翻译器包容性创设了 pthread 二种运行宏, 后续写 pthread create 相关代码会百发百中!

成功后, 初始营造 uv.sln 工程. 先进入 libuv-1.18.0 开首目录, 实践下边命令 

到此我们大学一年级统治线程模型就定下来了. 还附带引出了八个比较重大扶助头文件.

 .vcbuild.bat release vs2017 x64 static

struct.h -

继之能够望见 uv.sln 和 Releaseliblibuv.lib 生成文件. 编写翻译进程中 x64版本警告非常的多.  你一丝一毫能够尝尝化解,

#ifndef _H_STRUCT#define _H_STRUCT#include <math.h>#include "alloc.h"#include <ctype.h>#include <float.h>#include <stdio.h>#include <errno.h>#include <assert.h>#include <stdarg.h>#include <stdint.h>#include <stddef.h>#include <limits.h>#include <stdbool.h>#include <inttypes.h>//// enum Flag int - 函数返回值全局状态码// >= 0 标识 Success 状态, < 0 标识 Error 状态//enum {    SBase       =   0, // 正确基础类型    EBase       =  -1, // 错误基础类型    EParam      =  -2, // 输入参数错误    EFd         =  -3, // 文件打开失败    EClose      =  -4, // 文件操作关闭    EAccess     =  -5, // 没有操作权限    EAlloc      =  -6, // 内存操作错误    EParse      =  -7, // 协议解析错误    ESmall      =  -8, // 过小基础错误    EBig        =  -9, // 过大基础错误    ETimeout    = -10, // 操作超时错误};//// DCODE - DEBUG 模式下的测试宏// DCODE({//     puts("debug start...");// });//#ifndef DCODE#   ifdef _DEBUG#       define DCODE  do code while(0)#   else#       define DCODE  #   endif //  ! _DEBUG#endif  //  ! DCODE//// icmp_f - 比较行为的类型//  : int add_cmp(const void * now, const void * node)//typedef int (* icmp_f)();//// vnew_f - 根据规则构建对象//  : void * rtree_new(void * node)//typedef void * (* vnew_f)();//// node_f - 销毁当前对象节点//  : void list_die(void * node); //typedef void (void * node);//// start_f - pthread create func//  : int * run(int * arg)//typedef void * (* start_f)(void * arg);//// each_f - each 循环操作, arg 外部参数, node 是内部结点//  : int dict_echo(struct dict * node, void * arg) { return 0; }//typedef int (void * node, void * arg);//// CERR - 打印错误信息// EXIT - 打印错误信息, 并 exit// IF   - 条件判断异常退出的辅助宏//#define CERR                                                   fprintf(stderr, "[%s:%s:%d][%d:%s]" fmt "n",                                __FILE__, __func__, __LINE__, errno, strerror, ##__VA_ARGS__)#define EXIT                                                   do {                                                                         CERR(fmt, ##__VA_ARGS__);                                                exit(EXIT_FAILURE);                                                  } while(0)#define IF                                                         if  EXIT//// RETURN - 打印错误信息, 并 return 返回指定结果// val      : return的东西, 当需要 return void; 时候填 ',' 就过 or NIL// fmt      : 双引号包裹的格式化字符串// ...      : fmt中对应的参数// return   : val// #define RETURN(val, fmt, ...)                                           do {                                                                        CERR(fmt, ##__VA_ARGS__);                                               return val;                                                         } while(0)#define NIL#define RETNIL                                                RETURN(NIL , fmt, ##__VA_ARGS__)#define RETNUL                                                RETURN(NULL, fmt, ##__VA_ARGS__)#endif//_H_STRUCT

重在是 linux 和 winds 对于 POSIX socket writev 批量读写完毕的布局用了不等同类型导致的. 

笔者尝试写 structc 项目时首先个源文件 : )

投机改了它有个别源码和测量试验代码, 消除了任何警告. 详细 libuv 在 VS2017 上边使用无外乎 include lib 

0.2 IDE 弱议

带上 libuv.h 下面的 include 头文件

   winds 没得选, 最新最全的 visual studio best version 有技术统治一切. 这里首要说

 bg游戏资讯 3 

的是linux 上边大家的选择. 最开始作者是 vi make gcc gdb 开辟和编写翻译的.

再增多项目工程中程导弹入上边库 

Makefile -

advapi32.lib
iphlpapi.lib
psapi.lib
shell32.lib
user32.lib
userenv.lib
ws2_32.lib
# 编译的目录结构# Release : make # Debug   : make D=-D_DEBUG# Clean   : make clean

头文件什么的简要导入上边就足以了 

make 是编写翻译公布,make D=-D_DEBUG 是编写翻译 Debug, make clean 项目清理. 手工业操作.

WIN32_LEAN_AND_MEAN
_CRT_SECURE_NO_WARNINGS
_CRT_NONSTDC_NO_DEPRECATE
_WINSOCK_DEPRECATED_NO_WARNINGS

诸如此比搞对本身都万幸, 什么都行.

到那基本上 libuv winds 就马到成功了.  

但不要紧越来越精进一步 [vi make gcc gdb] -> [code F5 F10 F11] 是或不是更妙.

此间写了个示范 demo, 有意思味的能够品尝练习一下

微软作为桌面软件霸主, code(VSCode 简称)不用自身多说, 不得不服. 那开搞

#include <uv.h>
#include <assext.h>

// 继承 uv_timer_t 结构
struct gravity {
    uv_timer_t tick;

    uv_tty_t tty;

    int width;
    int height;
    int pos;

    char * msg;
};

// _update - 更新图片内容
static void _update(struct gravity * grav) {
    char data[BUFSIZ];
    uv_buf_t buf;
    buf.base = data;
    //
    // \033[2J      : 清屏
    // \033[H       : 光标移到(0, 0)
    // \033[
					

本文由bg游戏资讯发布于游戏通关视频,转载请注明出处:bg游戏资讯:开源框架介绍,环境搭建

关键词: structc linux libuv winds tty

上一篇:算出轨吗,前华为工程师找不到女朋友
下一篇:没有了