兼容

这是一场不停的追逐!


  • Home

  • About

  • Tags

  • Archives

批处理的专有命令

Posted on 2018-07-21

批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT。这些命令统称批处理命令,下面我就来给大家介绍一下批处理的命令。

REM

  • REM 是个注释命令一般是用来给程序加上注解的,该命令后的内容在程序执行的时候将不会被显示和执行
  • :: 也是注释, 但是不能回显
1
2
REM 你现在看到的就是注解,这一句将不会被执行
:: 在以后的例子中解释的内容都REM 会放在REM后面。请大家注意。

ECHO

ECHO 是一个回显命令主要参数有OFF和 ON,一般用ECHO message来显示一个特定的消息

1
2
3
4
5
Echo off
Rem 以上代表关闭回显即不显示所执行的命令
Echo 这个就是消息
Rem 以上代表显示"这就是消息"这列字符
执行结果: C:>ECHO.BAT 这个就是消息

GOTO

GOTO 即为跳转的意思。在批处理中允许以”:XXX”来构建一个标号然后用GOTO :标号直接来执行标号后的命令

1
2
3
4
5
6
GOTO LABEL

:LABEL
REM 上面就是名为LABEL的标号
DIR C:\ DIR D:\
REM 以上程序跳转标号LABEL处继续执行。

CALL

CALL 命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后再继续执行原来的批处理

PAUSE

PAUSE 停止系统命令的执行并显示下面的内容

1
2
3
C:>
PAUSE
请按任意键继续 . . .

IF

具体请参考: 批处理之if语句

FOR

具体请参考: 批处理之for语句

SETLOCAL

  • 开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后 所做的环境改动只限于批处理文件。要还原原先的设置,必须执 行 ENDLOCAL
  • 达到批处理文件结尾时,对于该批处理文件的每个 尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被 执行。例:
1
2
3
4
5
6
7
8
9
@ECHO OFF
SET PATH /*察看环境变量PATH
PAUSE
SETLOCAL
SET PATH=E:\TOOLS /*重新设置环境变量PATH
SET PATH
PAUSE
ENDLOCAL
SET PATH

SHIFT

SHIFT命令可以让在命令上的的命令使用超过10个(%0~%9)以上的可替代参数例:

1
2
3
4
5
6
7
8
9
10
11
12
ECHO OFF
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
SHIFT
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
SHIFT
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9

执行结果如下:
C::\>SHIFT.BAT 1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 10
3 4 5 6 7 8 9 10 11

hexo之使用记录

Posted on 2018-07-21

此博客使用了Hexo.

使用过程

安装hexo

首先需要保证你已经安装了node.js, 和git, 并且命令行使用有效.

1
$ npm install hexo-cli -g

新建一个博客

1
$ hexo init your_blog_name

启动hexo的服务器,用于本机查看效果

1
2
3
$ hexo server
# 或者
$ hexo s

启动后打开浏览器, 在地址栏输入: http://127.0.0.1:4000 就可以查看效果.

部署

部署到github page上面

修改配置文件

1
2
3
deploy:
type: git
repo: git@github.com:hello/hello.github.io.git

注意: git@github.com:hello/hello.github.io.git 应该修改为你的github page地址.

部署

1
$ hexo deploy

注:此时可能部署失败,说没有git类型,此时请继续往下看!

安装github上传插件

1
$ npm install hexo-deployer-git --save

注:安装了此插件后, 再运行: hexo deploy, 就会成功了!

新建文章

新建直接要发布的文章

1
$ hexo new "blog_name"

新建完之后就会在source/_posts下面生成新的文章,你就可以打开进行编辑.

新建不发布的草稿

由于你可能在一篇文章还没写好之前是不会发布的,所以这时候就需要草稿了,具体操作步骤如下:

1
$ hexo new draft "draft_test"

新建完之后会在source/_drafts下面新建draft_test.md的文件,这就是你需要开始编辑的新文档, 如果编辑完后需要发布,请进行如下操作:

1
$ hexo publish draft draft_test

进行完上面的步骤, 就会将draft_test.md移动到source/_posts文件夹下面.

生成要发布的内容

1
2
$ hexo clean
$ hexo generate

发布内容(部署)

1
$ hexo deploy

文章内使用图片

需要的插件

1
$ npm install hexo-asset-image --save

配置文件的修改

1
post_asset_folder: true

创建需要使用图片的文章

1
$ hexo new "image_test"

图片地址的确定

在_posts目录下新建 image_test 文件夹, 然后放入使用的图片 image_01.png.

图片使用

在 image_test.md文章中插入 ![](image_test/image_01.png).

目录结构图

1
2
3
4
5
6
7
8
source
|
|- _posts
| |
| |- image_test
| | |
| | |- image_01.png
| |- image_test.md

文章内引用其他文章

1
2
3
4
{% post_link 文章文件名(不要后缀) 文章标题(可选) %}

如要用git_learn时:
{% post_link git_learn 学习使用git %}

tags配置

在有的主题中, 有tags, 即标签页页面,具体配置过程如下:

1
$ hexo new page "tags"

进行了上面步骤后, 会在source下面生成tags文件夹, 并且有一个index.md文件,修改文件如下:

1
2
3
4
5
---
title: tags
date: 2016-05-21 12:51:53
type: "tags"
---

总的目录结构图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
your_blog_name
|
|-<Other Directory>
|
|-source
| |- _posts
| | |
| | |- image_test
| | | |
| | | |- image_01.png
| | |- image_test.md
| |
| |- tags
| | |-index.md
|
|-themes
| |- themename
| | |-_config.yml(主题配置文件)
|
|- _config.yml(站点配置文件)
|
|-<Other File>

`

主题配置

使用Next主题

使用参考地址

注意点:

  • 站点配置文件: 博客根目录下的_config.yml文件
  • 主题配置文件: themes/themename 下面的_config.yml文件

其他主题

linux安装后的基本配置

Posted on 2018-06-03

neovim or vim

一些必须包,在deepin,ubuntu下面编译用的

1
$ sudo apt-get install libtool libtool-bin autoconf automake cmake g++ pkg-config unzip curl xsel enca id-utils

安装vim时需要的一些包

1
2
$sudo apt install libncurses5-dev libgtk2.0-dev lua5.1 libluajit-5.1-2 liblua5.1-0-dev luajit python-dev
$sudo ln -s libluajit-5.1.so.2.0.4 libluajit-5.1.so

安装

直接安装

1
2
3
4
5
6
7
8
9
# debain
$sudo apt-get install neovim
# 首先需要安装pip或pip3
$sudo pip install neovim

# arch,manjaro
$sudo pacman -S neovim
# python支持
$sudo pacman -S python2-neovim python-neovim

从源码安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$git clone --depth 1 https://github.com/neovim/neovim.git
$cd neovim

# 创建第三方插件
$mkdir .deps
$cd .deps
$cmake ../third-party
$make

# 构建主体
$cd ..
$mkdir build
$cd build
$cmake .. -DMIN_LOG_LEVEL=0 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local
$make
$sudo make install

安装配置

1
2
3
4
$git clone https://github.com/DaSea/dotfiles.git .dotfiles
$git submodule update --init --recursive
$ln -s .dotfiles/dotsyncrc ~/.dotsyncrc
$./.dotfiles/dotsync/bin/dotsync -L

关于fstab文件

文件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## deepin和ubuntu上面可用
# ntf work
UUID="000D30A1000C5B09" /media/work ntfs-3g defaults 0 2
# ntfs download
UUID="000D8D4E0007D8B4" /media/download ntfs-3g defaults 0 2
# ntfs entertainment
UUID="02CCBFB1CCBF9CFB" /media/entertainment ntfs-3g defaults 0 2

## manjaro上使用
# ntf work
UUID="000D30A1000C5B09" /media/work ntfs-3g uid=1000,gid=1000,dmask=011,fmask=111 0 0
# ntfs download
UUID="000D8D4E0007D8B4" /media/download ntfs-3g uid=1000,gid=1000,dmask=011,fmask=111 0 0
# ntfs entertainment
UUID="02CCBFB1CCBF9CFB" /media/entertainment ntfs-3g uid=1000,gid=1000,dmask=011,fmask=111 0 0

有时ntfs分区现实只读文件系统,系统提示超级块损坏

1
2
3
4
# 使用ntfsfix进行修复
$sudo ntfsfix -b -d /dev/sdb2
# Note:修复成功后用mount重新挂载
$sudo mount -a

查看用UID与GID

1
2
# 使用id命令
$id -a

个人目录中文转英文

通过修改系统语言

1
2
3
4
5
6
7
8
# 查看当前语言
$echo $LANG
# 修改语言为en_US
$export LANG=en_US
# 通过xdg-user-dirs-gtk-update
$xgd-user-dirs-gtk-update
# 还原系统语言
$export LANG=zh_CN.UTF-8

通过修改系统配置文件

  1. 将中文目录重命名为英文;
  2. 修改~/.config/user-dirs.dirs,将其中的中文转换为英文;

创建ppt幻灯片壁纸(gnome)

参考: 如何设置 GNOME 显示自定义幻灯片

1
2
$ cd .local/share/gnome-background-properties
$ nvim ppt.xml

ppt.xml内容

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE wallpapers SYSTEM "gnome-wp-list.dtd">
<wallpapers>
<wallpaper deleted="false">
<name>Opensource.com Wallpapers</name>
<filename>/home/dasea/Pictures/ppt_bg.xml</filename>
<options>zoom</options>
</wallpaper>
</wallpapers>

ppt_bg.xml内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" ?>
<background>
<starttime>
<!-- 起始时间 -->
<year>2018</year>
<month>05</month>
<day>26</day>
<hour>6</hour>
<minute>00</minute>
<second>00</second>
</starttime>
<static>
<!-- Duration in seconds to display the background -->
<duration>1800.0</duration>
<file>/home/dasea/Pictures/39.jpg</file>
</static>
<transition>
<!-- Duration of the transition in seconds, default is 2 seconds -->
<duration>900</duration>
<from>/home/dasea/Pictures/41.jpg</from>
<to>/home/dasea/Pictures/373.jpg</to>
</transition>
<static>
<duration>1800.0</duration>
<file>/home/dasea/Pictures/background.jpeg</file>
</static>
<transition>
<duration>900</duration>
<from>/home/dasea/Pictures/pc0319.jpg</from>
<to>/home/dasea/Pictures/32.jpg</to>
</transition>
</background>

git命令记录

Posted on 2018-05-06

安装配置

1
2
3
4
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
# 生成私钥,公钥
$ ssh-keygen -t rsa -C "email@example.com"

自定义git

  • 让git显示颜色: git config –global color.ui true
  • 设置差异比较工具: git config –global merge.tool vimdiff
  • git编码问题

    1
    2
    3
    $ git config --system gui.encoding utf-8 # Git Gui乱码问题
    $ git config --system i18n.commitEncoding gbk # 提交的log里面可以用gbk提交
    $ git config --system i18n.logOutputEncoding gbk # 运行 git log 时将 utf-8 编码转换成 gbk 编码
  • 忽略特殊文件: 创建.gitignore文件,编写如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #windows
    Thumbs.db
    ehthumbs.db
    Desktop.ini
    #Python:
    *.py[cod]
    *.so
    *.egg
    *.egg-info
    dist
    build
    #My configurations:
    db.ini
    deploy_key_rsa

创建版本库

1
$ git init <name>

克隆及相关

  • git clone url<直接fork地址>
  • 添加upstream: git remote add upstream <原作者库地址>
  • 查看remote情况: git remote -v
  • 将原作者的修改更新到本地目录: git fetch upstream
  • 将直接fork的东西更新到本地目录: git pull origin master
  • 也可以通过checkout命令更新: git checkout master
  • 合并原作者与本地版本的区别: git merge upstream/master
    • 如果有冲突的话运行: git mergetool
  • 然后 git push origin master, 就可以将fork的版本与原作者版本进行统一

git fetch 与 git pull

  • git fetch:相当于是从远程获取最新标本到本地,不会自动merge

    • git fetch origin master
    • git log -p master origin/master
    • git merge origin/master
    • 上面的含义如下:
      • 从远程的origin的master主分支下载最新的版本到origin/master分支上;
      • 比较本地的master分支与origin/master分支的差别;
      • 合并
    • 上面的过程类似如下:
      • git fetch origin master:tmp
      • git diff tmp
      • git merge tmp
  • git pull: 获取最新版本病merge到本地

    • git pull origin master

提交更改

  • git status
  • git add 修改的文件
  • git rm 要删除的文件
  • git mv 要修改的文件名 修改后的
  • git commit -m “修改的内容”
  • git push origin master

管理修改

  • git status
  • git diff HEAD – filename(可以查看工作区与版本库里面的最新版本的区别)
  • git diff filename(查看文件的区别)
  • 如果使用git add提交修改后, 后悔了,使用git reset HEAD filename将暂存区的修改撤销掉

版本回退(git中,用HEAD表示当前版本,HEAD^表示上个版本, 上上个HEAD^^, 依次类推, 简化可以写成HEAD~100)

  • git log(查看提交的log)
  • git log –pretty=oneline(简化输出)
  • git log -p filename(查看文件所有变化)
  • git reset –hard HEAD^ (方法1)
  • git reset –hard (commit-id)

分支

  • 查看当前分支: git branch
  • 创建分支: git branch branch_name
  • 删除分支: git branch -d branch_name
  • 切换分支(如果存在): git checkout branch_name
  • 切换分支(如果不存在,创建): git checkout -b branch_name
  • 将分支上的修改合并到master: git merge branch_name
  • 克隆分支版本: git clone -b branch_name <主版本地址>

bug分支

  • 开发过程中,突然有个bug要修改,但是你当前正在工作的分支(dev)还有任务没有提交(由于未完成,无法提交)
  • 保存工作现场: git stash
  • 如果要修复master分支上的bug,则切换到master上创建分支: git checkout -b issue-101
  • 修改后: git add <修改的文件> , git commit -m “修改的内容”
    • 如果不进行这一步, 切回主分支还是能看到分支的内容的
  • 切换到主分支合并修改: git checkout master
  • 合并修改: git merge –no-ff -m “merge buf fix 101” issue-101
    • –no-ff 禁用Fast Forward模式,这样log就可以看出曾经做过合并
  • 删除分支: git branch -d issue-101
  • 切换到工作分支:git checkout dev
  • 查看工作现场列表: git stash list
  • 恢复现场
    • 方法1: git stash pop
    • 方法2: git stash apply; git stash drop
  • 可以多次恢复: git stash apply stash@{0}

标签管理

  • 标签的作用: 发布一个版本时,通常现在版本库中打一个标签, 这样就确定了打标签时刻的版本.*
  • 将来无论什么时候, 取某个标签的版本, 就可以取出历史版本.*
  • 查看标签: git tag
  • 创建标签: git tag v1.0
  • 查看标签信息: git show tag_name
  • 创建带说明的标签: git tag v0.2 -m “说明”
  • 删除标签: git tag -d v1.0
  • 删除远程标签: git push origin :refs/tags/v0.9
  • 推送某个标签到远程: git push origin v1.0
  • 或推送全部未推送的: git push origin –tags

子仓库(submodule)

1
git submodule允许一个git仓库作为另一个git仓库的子目录,并保持父项目与子项目相互独立.

添加子仓库

1
$ git submodule add <仓库地址> <本地地址>

检出(checkout)

1
2
clone一个包含子仓库的仓库,并不会clone子仓库,只会下载.gitmodule文件,需要通过
此描述文件clone子仓库。
  1. 方法1

    1
    2
    3
    4
    5
    # 初始化配置文件
    $ git submodule init

    # 检出父仓库列出的commit
    $ git submodule update
  2. 方法2

    1
    $ git submodule update --init --recursive

此时子目录在一个未命名分支,此时子仓库有改动并没有检测到。此时需要将子仓库的分支切换
到主分支,并更新到最新,然后切换到住仓库,并提交更改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看子仓库的分支
$ git branch
# 切换到主分支
$ git checkout master
# 更新
$ git pull
# 切换到主仓库并查看状态
$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。

尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
(提交或丢弃子模组中未跟踪或修改的内容)

修改: mshell/zsh/plugins/fast-syntax-highlighting (新提交)
修改: mshell/zsh/themes/powerlevel9k (新提交)
修改: oh-my-zsh (新提交)

修改尚未加入提交(使用 "git add" 和/或 "git")
# 上面的三个都是子仓库,可以提交修改。

删除子仓库

  • 删除.gitsubmodule里相关部分
  • 删除.git/config文件里相关字段
  • 删除子仓库目录
    $ git rm --cached <本地路径>

cmake基础常用总结

Posted on 2017-11-13

cmake是干啥的?

百度可以搜到很多,说了也是浪费资源

目的

主要记录自己使用过程中的常用疑问及解答;

常用命令

版本号

cmake_minimum_required(VERSION 3.7)

项目信息

project(cmake_demo)

查找当前目录下的所有文件并将名称保存到DIR_SRCS

aux_source_directory (. DIR_SRCS)
aux_source_directory (./src/intern SRC1)
aux_source_directory (./src SRC2)

头文件查找

include_directories (./)
include_directories (./src)
include_directories (./src/intern)

指定生成目标

  1. 生成可执行文件
    add_executable (dxftest ${DIR_SRCS} ${SRC1} ${SRC2})
  2. 生成动态库
    add_library(libdxf SHARED ${DIR_SRCS})
  3. 生成静态库
    add_library(libdxf STATIC ${DIR_SRCS})

链接库

1
2
target_link_libraries(libdxf libx1)
target_link_libraries(libdxf libx2)

使用cmake编译Qt工程

1
2
3
1. cmake编译Qt的最小版本是2.8.3,当然版本越高支持越好;
2. Qt5.7需要c++11支持,所以如果cmake不支持,则需要手动指定;
set(CMAKE_CXX_STANDARD 11)

查找qt5库

  1. find_package(Qt5Core Qt5Widgets);
  2. find_package的结果就是生成了一些targets可以被target_link_libraries使用;
  3. find_package也会也会生成一些变量用于编译,还有一些宏;
  4. 生成的每个module的目标匹配以Qt5::为前缀的Qt module. 如Qt5::Widgets;
  5. 如find_package(Qt5Widgets)将会生成以下变量
1
2
3
4
5
6
7
8
9
10
Qt5Widgets_VERSION String describing the version of the module.
Qt5Widgets_VERSION_STRING Same as Qt5Widgets_VERSION. Deprecated, use Qt5Widgets_VERSION instead.
Qt5Widgets_LIBRARIES List of libraries for use with the target_link_libraries command.
Qt5Widgets_INCLUDE_DIRS List of directories for use with the include_directories command.
Qt5Widgets_DEFINITIONS List of definitions for use with add_definitions.
Qt5Widgets_COMPILE_DEFINITIONS List of definitions for use with the COMPILE_DEFINITIONS target property.
Qt5Widgets_FOUND Boolean describing whether the module was found successfully.
Qt5Widgets_EXECUTABLE_COMPILE_FLAGS String of flags to be used when building executables.

Note: 其他类似,注意变量区分大小写。

链接库

target_link_libraries(example Qt5::Core Qt5::Widgets)

Qt build tools:moc,rcc,uic

moc

set(CMAKE_AUTOMOC ON):控制是否主动去对文件进行元处理

uic

  1. set(CMAKE_AUTOUIC ON)
  2. 如果文件#include “ui_.h”或工程包含.ui,则会触发uic;
  3. 可以通过AUTOUIC_SEARCH_PATHS寻找ui文件的路径;

rcc

  1. set(CMAKE_AUTORCC ON)
  2. add_executable(exe main.cpp resource_file.qrc)

最小例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cmake_minimum_required(VERSION 2.8.11)
project(testproject)

# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)

# Find the QtWidgets library
find_package(Qt5Widgets)

# Tell CMake to create the helloworld executable
add_executable(helloworld WIN32 main.cpp)

# Use the Widgets module from Qt 5.
target_link_libraries(helloworld Qt5::Widgets)

官方url

[cmake-qt-manual][http://doc.qt.io/qt-5/cmake-manual.html]

FAQ

1.

使用pandoc转换markdown为pdf

Posted on 2017-10-14

环境准备

1
2
3
4
5
# 本人系统为深度
# 安装pandoc
$sudo apt install pandoc
# 安装latex
$sudo apt install texlive-xetex texlive-latex-recommended texlive-latex-extra

生成pdf

1
2
3
4
$pandoc record.md -o record.pdf --latex-engine=xelatex

# 由于我们的文档中含有中文,所以需要指定字体
$pandoc record.md -o record1.pdf --latex-engine=xelatex -V mainfont='Noto Sans CJK SC'

Android中OpenGL ES版本

Posted on 2017-09-29

可使用的包(使用GLSurfaceView和GLSurfaceView.Renderer绘制)

包javax.microedition.khronos.opengles

- 提供OpenGL ES 1.0/1.1标准实现
- 可使用的API类包括:GL10,GL10Ext,GL11,GL11Ext和GL11ExtensionPack

包android.opengl

- 提供一套静态函数接口,包括OpenGL ES 1.0/1.1和2.0,其性能优于javax.microedition.khronos.opengles
- 支持OpenGL ES 1.0/1.1的类包括:GLES10、 GLES10Ext、 GLES11和GLES10Ext
- 支持OpenGL ES 2.0的API类是:android.opengl.GLES20(自Android 2.2开始)

版本选择

  • 性能:通常,OpenGL ES 2.0能比ES 1.0/1.1提供较快的性能。但是,这最终依赖于Android设备,不同的设备平台OpenGL的实现不同。
  • 设备兼容性:开发者开发的应用程序需要考虑Android设备类型,不同的Android版本对OpenGL版本支持不同,如OpenGL ES 2.0自Android 2.2才开始支持。
  • 编码便利性:OpenGL ES 1.0/1.1 API编程较为方便,2.0版本相对复杂些。
  • 图形控制:通过使用shaders,OpenGL ES 2.0对图形绘制能提供较多的控制,可以创建更好的效果,在1.0/1.1版本上则很难达到
  • 上面是谷歌的建议, 但是对于现在肯定选择2.0

EGL

前言

EGL是本地平台和OpenGL ES之间的抽象层,其完成了本地相关的环境初始化和上下文控制工作,以保证OpenGL ES的平台无关性。主要包含如下工作:

  • 选择显示设备
  • 选择像素格式。
  • 选择某些特性,比如如果你打算画中国水墨画,你需要额外指定宣纸和毛笔。
  • 申请显存。
  • 创建上下文(Context),上下文本质上是一组状态的集合,描述了在某个特定时刻系统的状态, 用于处理暂停、恢复、销毁、重建等情况;
  • 指定当前的环境为绘制环境 。

总体流程上,EGL按顺序分为若干步骤:

  1. 选择显示设备display,即上述的a.
  2. 指定特性,包括上述的像素格式(b)和特定特性(c),根据指定的特性来获取多个满足这些特性的config
    (比如你指定RGB中的R为5bits,那么可能会有RGB_565和RGB_555两种像素格式均满足此特性),
    用户从这些可用的configs中选择一个,根据display和config获取绘制用的buffer(一般为显存).
  3. 使用display、config、buffer来创建context,及即上述的e.
  4. 使用display、buffer、context 设置当前的渲染环境,即上述的f.

选择显示设备及确认EGL版本

EGL有1.0、1.1、1.2、1.3、1.4这几个版本,Android中使用的是1.4,EGL提供了查询版本的API,以下为Android中例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
EGL10 egl = (EGL10) EGLContext.getEGL();
EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); //获取显示设备

// Init
int[] version = new int[2];
egl.eglInitialize(display, version); //version中存放EGL 版本号,int[0]为主版本号,int[1]为子版本号

String vendor = egl.eglQueryString(display, EGL10.EGL_VENDOR);
WLog.d("egl vendor: " + vendor); // 打印此版本EGL的实现厂商

String version = egl.eglQueryString(display, EGL10.EGL_VERSION);
WLog.d("egl version: " + version);// 打印EGL版本号

String extension = egl.eglQueryString(display, EGL10.EGL_EXTENSIONS);
WLog.d("egl extension: " + extension); //打印支持的EGL扩展

说明:

  1. 虽然Android使用(实现)的是EGL 1.4(从打印的版本号中可见), 但在Android 4.2(API 17)以前的版本没
    有EGL14,只有EGL10和EGL11,而这两个版本是不支持OpengGL ES 2.x的,因此在老版本中某些ES 2.x相关的常
    量参数只能用手写的硬编码代替,典型的如设定EGL渲染类型API的参数EGL10.EGL_RENDERABLE_TYPE,这个属性
    用不同的赋值指定的不同的渲染API,包括OpenGL,OpenGL ES 1.x, OpenGL ES 2.x,OpenVG等,
    如果采用ES 2.0,应该设置此值为: EGL14.EGL_OPENGL_ES2_BIT,但是在Android 4.2之前,没有EGL14接口.
    只能采取手写的硬编码来指定,类似: EGL_RENDERABLE_TYPE = 4;

  2. EGL10.EGL_DEFAULT_DISPLAY 默认对应手机主屏幕。

指定(buffer)特性,获取config

1.构造需要的特性列表

1
2
3
4
5
6
7
8
int[] attributes = new int[] { 
EGL10.EGL_RED_SIZE, 8, //指定RGB中的R大小(bits)
EGL10.EGL_GREEN_SIZE, 8, //指定G大小
EGL10.EGL_BLUE_SIZE, 8, //指定B大小
EGL10.EGL_ALPHA_SIZE, 8, //指定Alpha大小,以上四项实际上指定了像素格式
EGL10.EGL_DEPTH_SIZE, 16, //指定深度缓存(Z Buffer)大小
EGL10.EGL_RENDERABLE_TYPE, 4, //指定渲染api类别, 如上一小节描述,这里或者是硬编码的4,或者是EGL14.EGL_OPENGL_ES2_BIT
EGL10.EGL_NONE }; //总是以EGL10.EGL_NONE结尾

  1. 获取所有可用的configs,每个config都是EGL系统根据特定规则选择出来的最符合特性列表要求的一组特性。
1
2
3
4
5
6
7
8
9
10
11
EGLConfig config = null;
int[] configNum = new int[1];
//获取满足attributes的config个数。
egl.eglChooseConfig(display, attributes, null, 0, configNum);
int num = configNum[0];
if(num != 0){
EGLConfig[] configs = new EGLConfig[num];
//获取所有满足attributes的configs
egl.eglChooseConfig(display, attributes, configs, num, configNum);
config = configs[0]; //以某种规则选择一个config,这里使用了最简单的规则。
}

说明:

  1. display和attributes都来自之前的步骤。
  2. eglChooseConfig(display, attributes, configs, num, configNum); 用于获取满足attributes的所有config,
    参数1、2其意明显,参数3用于存放输出的configs,参数4指定最多输出多少个config,参数5由EGL系统写入,
    表明满足attributes的config一共有多少个。如果使用eglChooseConfig(display, attributes, null, 0, configNum)
    这种形式调用,则会在configNum中输出所有满足条件的config个数。
  3. 一般习惯是获取所有满足attributes的config个数,再据此分配存放config的数组,获取所有config,根据某种特定规则,从中选择其一。
  4. API详细说明和所有可指定的attributes见这里:http://www.khronos.org/registry/egl/sdk/docs/man/xhtml/
  5. 打印config中的常用attributes:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     /**
    * 打印EGLConfig信息
    *
    * @param egl
    * @param display
    * @param config
    * : 指定的EGLConfig
    */
    public static void printEGLConfigAttribs(EGL10 egl, EGLDisplay display, EGLConfig config) {
    int value = findConfigAttrib(egl, display, config, EGL10.EGL_RED_SIZE, -1);
    WLog.d("eglconfig: EGL_RED_SIZE: " + value);

    value = findConfigAttrib(egl, display, config, EGL10.EGL_GREEN_SIZE, -1);
    WLog.d("eglconfig: EGL_GREEN_SIZE: " + value);

    value = findConfigAttrib(egl, display, config, EGL10.EGL_BLUE_SIZE, -1);
    WLog.d("eglconfig: EGL_BLUE_SIZE: " + value);

    value = findConfigAttrib(egl, display, config, EGL10.EGL_ALPHA_SIZE, -1);
    WLog.d("eglconfig: EGL_ALPHA_SIZE: " + value);

    value = findConfigAttrib(egl, display, config, EGL10.EGL_DEPTH_SIZE, -1);
    WLog.d("eglconfig: EGL_DEPTH_SIZE: " + value);

    value = findConfigAttrib(egl, display, config, EGL10.EGL_RENDERABLE_TYPE, -1);
    WLog.d("eglconfig: EGL_RENDERABL_TYPE: " + value);

    value = findConfigAttrib(egl, display, config, EGL10.EGL_SAMPLE_BUFFERS, -1);
    WLog.d("eglconfig: EGL_SAMPLE_BUFFERS: " + value);

    value = findConfigAttrib(egl, display, config, EGL10.EGL_SAMPLES, -1);
    WLog.d("eglconfig: EGL_SAMPLES: " + value);

    value = findConfigAttrib(egl, display, config, EGL10.EGL_STENCIL_SIZE, -1);
    WLog.d("eglconfig: EGL_STENCIL_SIZE: " + value);
    }


    /**
    * 在指定EGLConfig中查找指定attrib的值,如果没有此属性,返回指定的默认值
    *
    * @param egl
    * @param display
    * @param config
    * : 指定的EGLConfig
    * @param attribute
    * : 指定的attrib
    * @param defaultValue
    * : 查找失败时返回的默认值
    * @return: 查找成功,返回查找值;查找失败,返回参数中指定的默认值
    */
    static public int findConfigAttrib(EGL10 egl, EGLDisplay display, EGLConfig config,
    int attribute, int defaultValue) {
    int[] val = new int[1];
    if (egl.eglGetConfigAttrib(display, config, attribute, val)) {
    return val[0];
    }
    return defaultValue;
    }

获取显存

EGLSurface surface = egl.eglCreateWindowSurface(display, config, surfaceHolder, null);

说明:

  1. 详细的参数说明
  2. 参数surfaceHolder是android.view.SurfaceHolder类型,负责对Android Surface的管理.
  3. 参数4用于描述WindowSurface类型,初始化方式如同前面小节的egl attributes, 其中一个attribute是
    EGL_RENDER_BUFFER, 用于描述渲染buffer(所有的绘制在此buffer中进行)类别,取值为EGL_SINGLE_BUFFER
    以及默认的EGL_BACK_BUFFER,前者属于单缓冲,绘制的同时用户即可见;后者属于双缓冲,前端缓冲用于显示,
    OpenGL ES 在后端缓冲中进行绘制,绘制完毕后使用eglSwapBuffers()交换前后缓冲,用户即看到在后缓冲中的内容,
    如此反复。其他attributes见官方文档。

创建context

1
2
3
4
int attrs[] = { 
EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,
EGL10.EGL_NONE, };
EGLContext context = egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT, attrs);

说明:
函数原型:EGLContext eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list);
share_context: 是否有context共享,共享的contxt之间亦共享所有数据。EGL_NO_CONTEXT代表不共享;
attrib_list: 目前可用属性只有EGL_CONTEXT_CLIENT_VERSION, 1代表OpenGL ES 1.x, 2代表2.0,
同样在Android4.2之前,没有EGL_CONTEXT_CLIENT_VERSION这个属性,只能使用硬编码0x3098代替。

函数详细描述

设置为当前的渲染环境

1
egl.eglMakeCurrent(display, surface, surface, contxt);

参考文档

环境初始化完毕,开始使用OpenGL ES 2.0 API 进行绘制。

1
2
3
// 开始使用OpenGL ES 2.0 API 进行绘制。
GLES20.glClearColor(0, 0, 0, 1);
GLES20.clear(GL_COLOR_BUFFER_BIT);

关于SurfaceHolder

一般在Android中使用OpenGL ES,总是会从GLSurfaceView和Renderer开始,但是由上面描述的过程可知,
只需要提供一个合适的SurfaceHolder,就可以完成整个环境初始化,并进行绘制。GLSurfaceView和Renderer
事实上只是在本文描述的基础上封装了一些便利的功能,便于开发者开发,比如渲染同步、状态控制、主(渲染)循环等。

Untitled

Posted on 2017-09-01

字体的单位

  1. px,pixel的意思,像素,屏幕上显示数据最基本的点;
    note:px是一个点,不是自然界的长度单位,不能说一个“点”很大或很小。一个点可以画的很小,也可以画的
    很大。如果大那就清晰,则说分辨率高,反之分辨率低。“点”的大小是会变的,称之为“相对长度”。

  2. pt,point的意思,印刷行业常用单位,等于1/72英寸;
    note: 全称为point, 但中文不叫“点”,确切的说法是一个专用的印刷单位“磅”,大小为1/72英寸,自然界标准
    的长度单位,也称为“绝对长度”。

pt或px的选择

一般系统中,把文字定义为96DPI(PPI异同)。这样,则:1px=1/96英寸。由1pt=1/72英寸,

可得出1px=0.75pt,常见的宋体9pt=12px。在显示器分辨率不变的基础上(如1024*768),1px
大小固定不变;改变显示设置为144DPI, 则可计算得1px=0.5pt,常见的宋体9pt=18px。原来用
12px的字现在用18px,字变大了。px与pt的使用区别,只有当用户改变默认的96DPI的时候才会
产生。

DPI与PPI

  1. DPI: dot per inch,没英寸多少点, 印刷品的点密度;
  2. PPI: pixel per inch, 每英寸像素数, 设备的点密度;
  3. 针对显示器的设计:dpi==ppi

pt与px的换算

px = pt×DPI/72; DPI=96时,pt = 4/3px

em: %。 一个相对单位。网页中使用, em = 16×px,1.5em=1.5*16=24px

FreeType中字体的大小的设置

  1. FT_Set_Char_size(face, char_width, char_height, horz_resolution, vert_resolution)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    FT_Set_Char_Size(face, 12*64, 0, 96, 0);

    设置字号,这里 char_height, vert_resolution 设置 0,表示
    沿用 char_width, horz_resolution 的值。这里设置 12pt 字号,96dpi
    注意 12 * 64,因为 FreeType2 中所有 float 都是通过变换成整数来做的,这
    里是 26.6 float format,所以 (12 << 6) == 12.0

    26.6 float format: 是将-1.0到1.0之间的小数转换为整数参与计算的方式,有利于进行浮点数的定点运算,
    与小数比较,精度差不多,但速度加快.
  2. FT_Set_Pixel_Size(face, char_pixel_width, char_pixel_height)

    1
    上面单位为像素不需要转换。

FreeType字形约定

FreeType字形约定
FreeType Glyph Conventions

道路线元计算工具

Posted on 2017-07-26

道路线总结

三种线元

  • 直线段
  • 圆曲线
  • 缓和曲线
    • 第一缓和曲线(包括完整和不完整的,不完整的需要补充为完整的)
    • 第二缓和曲线(同上)

道路放样的俩种方法

  • 线元法
    • 已知各个线元,直接可以用于计算
  • 交点法
    • 线路转向时的交点,如从右偏到左偏,此时会发生方向的变化,所以就会一个交点
    • 交点之间的线元会包含多段

交点法文件

  1. ZH(起点桩号):
  2. 交点属性: 点名, N, E, 第一缓和曲线长, 圆弧半径, 第二缓和曲线长
  3. 起点和终点无后面三个属性

这里的点为每条线段之间的连接点, 每三个点之间可以有几段数据;

第一个交点就是起点; 最后一个就是终点

转角:

路线由一个方向偏向另一个方向时, 偏转后的反向与原方向的夹角;
当偏转后的方向在原方向的左侧,称为左转角; 反之为右转角.

用到的须知点

  • 所有的角度都是弧度
  • 左偏为-1, 右偏为1
  • 缓和曲线的无穷大半径用0表示
  • 最小误差是0.0001
  • Point中的x为N, y为E
  • 左偏桩点偏距为负数, 右偏桩点为正
  • 方位角的范围必须为0-360度

算法实现的一些参考

github:roadline实现

参考的一些网址

参考1
参考2
参考3
参考4
点在线的左边和右边
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考
参考

opengl es模板缓冲的使用

Posted on 2017-07-26

opengl es 模板缓冲测试

网上的解释很多,这里不在描述,可参考下面的博客:
模板测试

实际在gis中可能的使用

在gis软件中,绘制shape数据时,一般都会要求绘制一个地图,俗称符号化;在pc端,

可以直接使用gdi等绘制,但在Android设备上,使用纹理填充效果更好。
对于shape中的点和线数据, 可直接使用纹理图片代替点和线的数据进行绘制;对于面
实体数据,则需要按照面实体的不规则形状将正正方方的纹理图片进行裁剪,才能显示为理
想的情况。

参考示例

参考示例

效果图如下:

12…6

DaSea

Fucking Code!

51 posts
25 tags
GitHub
© 2018 DaSea
Powered by Hexo v3.7.1
|
Theme — NexT.Gemini v6.3.0