网络编程中的scatter/gather I/O(发散/聚合IO)

asio中支持scatter/gather I/O操作,于是就想知道它是否真正的节省了底层系统调用。直接搜asio相关实现的介绍,没找到。自己也没时间翻代码。于是猜应该是系统支持相关API,于是搜 socket scatter/gather I/O,马上就找到了维基百科,还有一篇csdn博客。

Vectored I/O
分散/聚集IO(scatter/gather)及iovec结构体

有API示例代码,示例中是linux代码,在windows平台也有类似API。

原来人家还叫“ Vectored I/O”
核心读写函数可以接受多个数组,由操作系统提供。这样在发送多个小数据包时,可以降低系统调用次数,或者减少数据拷贝次数。

降低boost智能指针开销

1.完全单线程

如果程序是单线程,或者多线程交互由上层调度(比如我这里,c程序是单线程,上层c#程序是多线程),这时可以在编译c库时加上”-DBOOST_SP_DISABLE_THREADS”,降低智能指针开销。

BOOST_SP_DISABLE_THREADS是boost智能指针库定义的一个宏,开启这个宏后,会把底层的atomic计数,换成普通的++。这样就变成了一个普通的计数,去除了不必要的开销。
新版本中是换成了“sp_counted_base_nt.hpp”,道理是一样的。

这样我们就可以用更低的开销,写同样安全的代码,而且不用打破编码习惯,像enable_shared_from_this等着用的写法,一样统统能用,一点不用变。

继续阅读降低boost智能指针开销

msvs2017中设置文件的默认格式

可以采用editorconfig,额可以指定编码、换行符缩进等。只要在根文件夹下放一个“.editorconfig”文件,下面所有的文件都生效。详情可以去官方网站看:点我

很多别的编辑器也支持这个配置,比如idea,vscode,所以换个编辑器,也是同样的配置,很方便。

PS:vs的高级保存设置 中,看不到文件真正的编码和EOL,可以换到vscode中验证,是否生效。我在msvs中新建文件保存中文,tab缩进,用vscode打开后都是生效的,中文也正常显示,没有乱码。推荐!!

在我的cmake工程中使用的配置如下,想偷懒的直接拿去。

# top-most EditorConfig file
root = true
[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 4

windows10利用linux子系统编译mono

  1. 安装debian
    1. 系统设置中,启用开发者选项
    2. windows组件中,安装linux子系统组件
    3. app store中安装debian
  2. 安装编译工具
    1. 打开debian命令行
    2. sudo apt install build-essential zip unzip git bison
    3. sudo apt-get install git autoconf libtool automake build-essential gettext cmake python
  3. 下载相应的mono
    1. unzip到/home/xxxx-user
    2. 查看external/build/build-runtime-android.sh,查找ndk版本,这里是r10e
  4. 下载ndk
    1. 下载ndk的linux-x86_64版本
    2. unzip解压到/home/xxxx-user
  5. 设置ndk-root
    1. 修改external/build/build-runtime-android.sh
    2. 在前面添加 export ANDROID_NDK_ROOT=/home/xxx-user/ndk-r10e
    3. 修改CFLAGS -fpic -O2
    4. 修改KRAIT_PATCH_PATH=”${CWD}/android_krait_signal_handler/build”
  6. 执行一次 编译
    1. 在mono根目录下执行 external/build/build-runtime-android.sh
    2. 这次不会成功
    3. 错误提示有可能在最开始,而不再最后(我一直再后面找错误,卡了很久)
  7. 修改android_krait_signal_handler/build/build.pl
    1. 把第一行中的 -w 去掉
    2. #use PrepareAndroidSDK; 这是注释掉,因为sdk校验在脚本中完成了,这里加上是冗余,而且会报错
    3. #PrepareAndroidSDK::GetAndroidSDK(undef, undef, “r10e”); 这里也注释掉
  8. 再次尝试编译,这次应该成功了,提示缺少什么,安装就行了。
    1. 在mono根目录下执行 external/build/build-runtime-android.sh

.net core GC 暂停

很多C#程序员都没遇到过明显的GC暂停,就以为没有。
这里贴一篇老外的文章,可以更真切的认识.net core的GC。
本文中,当内存有6G常驻对象的话,GC暂停时间就会达到1秒以上,48G时可以达到8秒以上。

这是原作者2018年9月末写的文章,比较新了。

原文地址

jdk11发布了ZGC

jdk11带来了一个实验性的GC

ZGC的官方目标:

  • Pause times do not exceed 10ms
  • Pause times do not increase with the heap or live-set size
  • Handle heaps ranging from a few hundred megabytes to multi terabytes in size

GC暂停最大(不是平均)时间在10ms以内
暂停不会随着内存和运行时间的增加而增大
支持的内存可以从几百M到几T。

真是神器,让java程序使用超大内存成为可能,基本消除了jvm优化工作。为java开启了更多应用场景,比如开发游戏服务器、开发缓存服务器。只要程序可以容忍最大10ms的延迟,就可以使用java来开发。

试用ZGC

  • 只能在linux上用
  • 开启zgc
    -XX:+UnlockExperimentalVMOptions -XX:+UseZGC
    • 查看gc日志:
      -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc
    • 看详细gc日志:
      -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xmx<size> -Xlog:gc*

貌似还有另外一个GC: Shenandoah

也只能再linux上使用。看官方测试延迟大概再50ms以下。
https://wiki.openjdk.java.net/display/shenandoah/Main

如何把一个图片中黑色部分变透明,灰色部分半透明

这个最终效果是:在黑色底版上,放上了一个白色半透明图片。最终形成和原图相同的图片。
打开PS

  • 黑色变透明:魔棒容差0,选择黑色,删除。
  • 灰色变半透明:选择复制图片,新建图层,填充白色,添加Mask(下方小图标),在通道页选中Mask,粘贴图片。ctrl+i反转Mask即可。

unity crunch 压缩

crunch压缩是有损压缩,具有很高的压缩比,要比Low quality还要小50%以上。所以,要高清显示的图片可以采用它。

  • 如果启用crunch压缩,最好把compressor quality置为100。出来的图不会明显变形。这样压缩的会慢点,尺寸稍微增大(不明显,比50的质量大了16%左右,相比没有启用crunch,这点变化可以忽略)。
  • 对于UI元素用图,最好不要启用crunch,而且要选择“高品质”。
  • 有时候某些Sprite里会掺杂别的sprite的边边角角,这时可以尝试图集里的Tight模式。