rust 开发编译 Android 动态库实践

最近关注了一波 rust,一门目前还比较小众但却很强大的编程语言,官网地址如下:

https://www.rust-lang.org/

rust 的学习曲线比较陡峭,在开始学习之前建议看看王垠的这篇文章 《如何掌握所有的编程语言》,地址如下:

https://www.yinwang.org/blog-cn/2017/07/06/master-pl

学习语言,重要的是掌握其语言特性。

王垠举了一些语言特性的例子:

  • 变量定义
  • 算术运算
  • for 循环语句,while 循环语句
  • 函数定义,函数调用
  • 递归
  • 静态类型系统
  • 类型推导
  • lambda 函数
  • 面向对象
  • 垃圾回收
  • 指针算术
  • goto 语句

看着这些特性是不是很像一些编程语言书的目录🤔

在学习 rust 的时候也可以照着这些语言特性去对比自己是否掌握了。

[Read More]

Android NDK 开发 —— 从 Assets 文件夹加载图片并上传纹理

在 OpenGL 开发中,我们要渲染一张图片,通常先是得到一张图片对应的 Bitmap ,然后将该 Bitmap 作为纹理上传到 OpenGL 中。在 Android 中有封装好的 GLUtils 类的 texImage2D 方法供我们调用。

    public static void texImage2D(int target, int level, int internalformat,
            Bitmap bitmap, int type, int border)

该方法的底层原理实际上也是解析了该 Bitmap ,得到了 Bitmap 所有的像素数据,类似于 Android NDK 关于 Bitmap 操作的 AndroidBitmap_lockPixels 方法,如果你不太了解该方法,可以参考这篇文章:Android JNI 之 Bitmap 操作

得到了所有像素数据之后,实际最终还是调用了 OpenGL 的 glTexImage2D 来实现纹理上传。当然,如果可以直接得到所有数据,也不需要走解析 Bitmap 这一步了,这种场景最常见的就是把相机作为输入了。

[Read More]

简单易用的图像解码库介绍 —— stb_image

说到图像解码库,最容易想起的就是 libpnglibjpeg 这两个老牌图像解码库了。

libpnglibjpeg 分别各自对应 pngjpeg 两种图像格式。这两种格式的区别如下:

png 支持透明度,无损压缩的图片格式,能在保证不失真的情况下尽可能压缩图像文件的大小,因此图像质量高,在一些贴纸应用中也大部分用的是 png 图片。

jpg 不支持透明度,有损压缩的图片格式,有损压缩会使得原始图片数据质量下载,也因此它占用的内存小,在网页应用中加速速度快。

要想在工程中同时解码 pngjpeg 格式图片,就必须同时引用这两种库,而且还得经过一系列编译步骤才行。

在这里,介绍一个简单易用的图像库:stb_image 。Github 地址为:https://github.com/nothings/stb ,目前已经有了 9600+ Star 。它的使用非常简单,看看 README 可能你就会了。

[Read More]

博客图床迁移记

微博图床一时爽,迁移火葬场

前几天在群里看到说新浪微博图床挂掉了,图床上的图片链接单独访问还可以,但是在博客文章上就显示不出来了。

去自己网站上看一下,果然,连博客首页图片都加载不出来了,极大地影响了阅读体验呀。

还好图片链接是可以访问的,这就意味着图片还在,还来得及做迁移和备份。

回顾之前用了好多免(hao)费(yang)图(mao)床,从最早的 七牛,到 Cloudinary,再到 微博图床。七牛由于是临时域名,没有及时备份图片,导致图都没了,而 Cloudinary 和 微博图床 倒还是可以继续访问的。不过这种薅羊毛总不是个办法,万一服务商政策变了,又得再迁移图片了。

果然,免费的才是最贵的。

[Read More]

进击的 Vulkan 移动开发之 SwapChain

Vulkan 开发的系列文章:

  1. 进击的 Vulkan 移动开发(一)之今生前世

  2. 进击的 Vulkan 移动开发(二)之谈谈对渲染流程的理解

  3. 进击的 Vulkan 移动开发之 Instance & Device & Queue

  4. 进击的 Vulkan 移动开发之 Command-Buffer

在之前的文章中,讲到了 Command-Buffer 提交给 Queue 去执行,也提到了 Vulkan 实现跨平台机制,是有一些拓展的,这里就讲讲 Vulkan 窗口系统的拓展(Vulkan Window System Integration WSI),如下图所示:

[Read More]

进击的 Vulkan 移动开发之 Instance & Device & Queue

Vulkan 开发的系列文章:

  1. 进击的 Vulkan 移动开发(一)之今生前世

  2. 进击的 Vulkan 移动开发(二)之谈谈对渲染流程的理解

在 Vulkan 的系列文章中出现过如下的图片:

这张图片很详细的概括了 Vulkan 中的重要组件以及它们的工作流程,接下来的文章中会针对每个组件进行学习讲解并配上相关的示例代码,首先是 Instance、Device 和 Queue 组件。

[Read More]

Java 显式锁 Lock 与条件队列

在 Java 5.0 之前,在协调对共享对象的访问时可以使用的机制只有 synchronized 内置锁和 volatile 关键字。

Java 5.0 增加了一种新的机制:Lock 显式锁,当内置锁 synchronized 不适用时,它就可以作为一种新的选择。

回顾一下内置锁 synchronized 的使用:

// synchronized关键字用法示例
public synchronized void add(int t){// 同步方法
    this.v += t;
}

public static synchronized void sub(int t){// 同步静态方法
    value -= t;
}
public int decrementAndGet(){
    synchronized(obj){// 同步代码块
        return --v;
    }
}

内置锁不需要显式的获取和释放,任何一个对象都能作为一把内置锁。

  • 当 synchronized 作用于普通方法时,锁对象是 this 。
  • 当 synchronized 作用于静态方法时,锁对象是当前类的 Class 对象。
  • 当 synchronized 作用于代码块时,锁对象是 synchronized(obj) 中的这个 obj 对象。

[Read More]