小编Ste*_* Lu的帖子

iOS OpenGL ES 2.0上的sRGB

根据我能找到的少数相关主题我收集的是,获取正确照明计算的取幂步骤可能必须在iOS应用程序的最终片段着色器中完成.

我一直在使用最新最好的Xcode 5 OpenGL调试器进行分析,并且片段的取幂会占用大量的计算量.这条线在整个着色器中花费的时间最长(其余的性能都被norm点光源所需的各种调用所吸引).

glEnable(GL_FRAMEBUFFER_SRGB);不幸的GL_FRAMEBUFFER_SRGB是,没有宣布的工作.

当然,我应该用于GL ES的实际枚举可能会有所不同.

根据Apple的说法:

仅SGX 543和554处理器支持以下扩展:

EXT_color_buffer_half_float
EXT_occlusion_query_boolean
EXT_pvrtc_sRGB
EXT_shadow_samplers
EXT_sRGB
EXT_texture_rg
OES_texture_half_float_linear

嗯,这很好,没有543或554的最新设备是iPhone 4.

扩展名的文本文件看起来我可以设置SRGB8_ALPHA8_EXTinternalformat参数RenderbufferStorage,但没有说明如何让正常的最终帧缓冲区为我们免费应用sRGB.

现在sRGB校正似乎是获得正确颜色的缺失步骤.我在我的应用程序中处理可怕的"曝光不足"颜色的方法是在片段着色器中手动应用像这样的伽马校正:

mediump float gammaf = 1.0/1.8; // this line declared outside of `main()`
// it specifies a constant 1.8 gamma
mediump vec4 gamma = vec4(gammaf, gammaf, gammaf, 1.0);
gl_FragColor = pow(color, gamma); // last line of `main()`
Run Code Online (Sandbox Code Playgroud)

现在我认识到典型的渲染管道涉及一个或多个渲染到纹理,然后是FS四边形绘制,这将使我有机会使用SRGB8_ALPHA_EXT渲染缓冲区,但是如果没有渲染缓冲区我应该做什么呢?我是SOL吗?

如果是这种情况,那么这个 …

opengl-es ios opengl-es-2.0

9
推荐指数
2
解决办法
3853
查看次数

在Javascript中执行(整数)操作的最有效方法是什么?

我正在使用Javascript实现图灵机(将其视为虚拟机).我正在研究一个尽可能高效地执行计算的例程(从一开始就不是项目的重点).

是的,除非遇到性能问题,否则我不应该考虑优化.但是我正在做的事情的性质(大多数非平凡的程序具有非常低效的渐近运行时)意味着将始终从优化中获得一些东西.我想尽我所能每秒获得尽可能多的指令(​​合理).

如果我用C++进行编程,那么解决方案很清楚.做一些时间.gprof.-O3我将研究我期望代码运行的架构,并且可能还会查看正在生成的程序集.

但是,不能用javascript做到这一点.我的第一直觉是将内循环中的操作减少到数组查找.在我看来,如果解释器能够将其转换为(希望很短的)一系列整数运算,那么我将能够利用CPU缓存性能.

图灵机非常简单.它实际上是最简单的计算公式(!):它具有有限数量的状态,双向无限磁带,可以在任一方向上移动一个单元的磁带头,并且可以读取和写入单个字符到录影带.

程序在转换函数中被编码,该转换函数获取被读取的状态和字符,并且该信息提供要写入的字符,移动头部的方向和新状态.

这是每一步的逻辑:

// states is an array of arrays of triplets and is the transition func
var trans = states[state][alph_index[tape[pos]]]; 
tape[cur_tape_pos] = trans[0]; // write
cur_tape_pos += trans[1]; // move
state = trans[2]; // state update
Run Code Online (Sandbox Code Playgroud)

该过程在循环中发生.我似乎很清楚磁带是一个数组.我想存储(附加)值到数组的末尾至少是一个使用Javascript数组的摊销的常量时间操作.更不清楚的是,附加到阵列的前面也会有很好的性能,所以我可能想要使用两个阵列,一个向左延伸,一个向右延伸.

问题是,在naive实现中会在内部循环中插入条件语句.我不喜欢那样.无论如何必须已经有条件检查来检查状态是否处于暂停状态.所以也许它不会那么糟糕.

还有一个潜在的优化可以alph_index通过将索引存储在字母表而不是磁带上的字母值本身来消除索引.

但主要的问题是这个.我还可以采取哪些其他措施来加快速度?有可能让它更快吗?我不知道执行的哪个组件会成为瓶颈(CPU或I/O,还是别的什么?)而且我不知道如何找到它.使用Javascript我也可以使用哈希表,但似乎数组总是更快.

也许我过早地寻求建议.随着我的进步,我会回来编辑性能数字.

作为阅读我的问题的奖励,我将提供一个链接到我的项目的实时工作进展版本:http://stevenlu.net/tm.html

到目前为止,它的操作是操纵一个div填充spans代表磁带.它还对字符串执行大量操作,并且还对元素进行大量复制,这些元素在图灵机的实际计算中是完全不必要的.但即便如此,它也能取得不错的表现.我的机器花了大约一分钟来计算600,000左右的步数(5 ^ 4 = 625),即每秒10,000步.这并不是那么糟糕,但我知道我可以通过一些较低级别的编程实现每秒超过一百万.

在寻找标杆PERF这里对以往根CPU的我看到每个核心约10000 MIPS.因此,我估计如果我可以在运行50 Dhrystone迭代所花费的时间内运行一次我的内循环(即使我不知道这些综合基准实际上做了什么,这似乎很简单的C实现),禁止内存带宽限制,我在一个线程上每秒有2亿次迭代.我的600k步计算将在3ms内完成!!

好吧,如果我可以让我的5 ^ 4计算运行而没有浏览器向我报告它已挂起,我会很高兴...

UPDATE

通过更高效的javascript实现完成的算法,计算9^4 = 6561采取58202209步骤,计算时间为6173毫秒.那是每秒940万步.比我原来的DOM依赖方法增加了近1,000倍.

原始 …

javascript arrays optimization performance

8
推荐指数
1
解决办法
359
查看次数

从字符串就地删除空格?

我在"面试问题列表"中看到了这一点.让我想知道.

当然,不限于空白,很容易推广为"从字符串中删除某些特定字符,就地".

我的解决方案是:

void stripChar(char *str, char c = ' ') {
  int x = 0;
  for (int i=0;i<strlen(str);i++) {
    str[i-x]=str[i];
    if (str[i]==c) x++;
  }
  str[strlen(str)-x] = '\0';
}
Run Code Online (Sandbox Code Playgroud)

我怀疑还有一个更高效,但是有更优雅的解决方案吗?

编辑:完全忘了我离开strlen那里,绝对没有效率

c

8
推荐指数
2
解决办法
9938
查看次数

一个更强大的点(重复)版本

我知道记录q到寄存器中,但我想知道是否可以设置一些内容来快速调用最后一次记录,这与.回忆最后一个短编辑命令的方式非常相似(参见此处讨论.).

我知道,@@但它似乎只是在使用寄存器的@z地方后工作z.例如,要进行录音,你必须打字qz,继续做你的事情,q然后为了运行录音你必须@z在开始@@重复之前.

我的黑客解决方案现在是一个绑定nnoremap , @q,它允许我做录音qq和结束它们q.是否有更好的东西(例如,通过单次击键记录到特定寄存器中的东西,或者特定重复最后记录的宏的东西)?诚然,这不是一个巨大的进步,因为它已经非常优秀.

对我来说,一个易于使用的寄存器通常比需要更多工作的大量寄存器更有用.虽然这可能只是因为我很难记住事情并且不认为自己有效地利用了不止一个.

vim

8
推荐指数
1
解决办法
1368
查看次数

如何阅读Git 3路统一差异输出格式?

前言

这个问题是关于理解基本的统一差异输出格式.三种方式的差异和合并可能是最好的方法,从适当的GUI合并工具的舒适性,或至少,vim diff模式与插件,如fugitive.vim.

我发现git diff在合并冲突时运行会产生一个带有两列优缺点的差异视图.

很明显,在比较相同数据的三个不同版本时,我们需要的信息比仅比较两个版本时要多.但这些专栏究竟意味着什么呢?现在显然有很多组合可用于现在属于给定线的可能"桶".它曾经只是无论是空白的(相同的), +(加)或-(删除),现在我们有空白,++,--,+ , +,- ,和 -.甚至可能还有更多我没见过的东西.

git

8
推荐指数
1
解决办法
1500
查看次数

tmux在焦点上调整大小

我希望能够为特定窗格指定辅助大小参数,以便在聚焦窗格时分配新大小,并在退出时返回它.所以,例如

(注意[]表示聚焦的终端光标)

________________
|$ ls  |       |
|a's   |       |
|dir   |       |
|$     |$ []   |
|______|_______|
Run Code Online (Sandbox Code Playgroud)

交换窗格焦点

_______________
|        |    |
|$ ls    |    |
|a's dir |    |
|$ []    |$   |
|________|____|
Run Code Online (Sandbox Code Playgroud)

等等.特别是很酷,因为在最近的tmux版本中调整窗格大小,它可以很好地重新处理内容而不是将其切掉.

在该示例中,左窗格的宽度设置为在聚焦时自动切换为8列,并且在失去焦点时会变窄.注意内容是如何仍然可见的(这是我们为什么喜欢tmux),但是我们仍然可以通过让当前关注的窗格自动扩展来吃掉我们的蛋糕,因此它总是足够大以便进行工作!

我可能会想出一些精心设计的绑定来自动执行resize-pane命令的应用,并使其适合我的愿望.但我希望有一些内置的功能.

跟踪并允许为每个窗格修改辅助的4元组整数是切实可行的.这些指定了resize-pane -L/D/U/R该窗格聚焦时要执行的操作量,以及该窗格散焦时的反向操作.

可能还有其他更合理的配方.

unix terminal tmux

8
推荐指数
1
解决办法
841
查看次数

使标志只使用一个字符宽度?

Sign指的是左侧的额外列,在使用例如syntastic插件时添加.如果可能的话,我想节省空间,只占用一列空间.我可以改变以前的标志>,>>但它仍然是两个字符宽!

vim

8
推荐指数
1
解决办法
1046
查看次数

Node.js:在退出之前,节点是否总是等待setTimeout()完成?

考虑:

node -e "setTimeout(function() {console.log('abc'); }, 2000);"
Run Code Online (Sandbox Code Playgroud)

这实际上会在程序退出之前等待超时.

我基本上想知道这是否意味着该节点旨在等待所有超时完成后退出.

这是我的情况.我的客户端有一个node.js服务器,他将从Windows运行一个快捷方式图标.如果节点应用程序遇到异常情况,它通常会立即退出,没有留出足够的时间在控制台中查看错误是什么,这很糟糕.

我的做法是用尝试捕捉包住整个程序,所以现在它看起来像这样:try { (function () { ... })(); } catch (e) { console.log("EXCEPTION CAUGHT:", e); },但当然,这将导致程序立即退出.

所以在这一点上,我想留下大约10秒的时间让用户在退出之前查看异常的截图或截图.

我想我应该sleep()通过npm模块使用阻塞,但我在测试中发现设置超时似乎也有效.(也就是说,如果内置的东西有效,为什么要打扰模块?)我猜这个意义不大,但我只是好奇它是否被指定某个节点实际上会在退出之前等待所有超时完成,所以这样做我能感到安全.

node.js

8
推荐指数
2
解决办法
9603
查看次数

std :: shared_ptr :: owner_before和std :: owner_less:"基于所有者的订单"究竟是什么意思?

我已经就此发现了一些讨论,但似乎没有任何内容可以指明"基于所有者的订单"实际上是什么.

它是否有效地评估<自有指针内存地址的值?

c++ c++11

8
推荐指数
2
解决办法
1525
查看次数

当运行从源构建的clang时,如何指定libc ++的位置,或者,有人向我解释-stdlib = libc ++是什么

我正在使用clang的规定开发插件和工具,通过插件和clang的LibTooling来实现.我能做以下事情:

  • 通过运行configure脚本(不使用cmake)按照入门页面编译来自svn(Linux和OSX)的clang里面的llvm
  • 在Linux上编译libcxx/libc ++(也来自svn),我没理由在OSX上遇到任何麻烦.问题是libc ++头文件已存在于我的OSX系统上

    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c++/v1/
    
    Run Code Online (Sandbox Code Playgroud)

    并且libc ++ dylib位于/ usr/lib /.

    编辑4:我能够按照指示在OS X上编译libcxx.我有一个全新的libc ++.1.0.dylib现在坐在这里.

  • 在OSX上,使用Release + Asserts(和Debug + Asserts)构建clang++来编译C++源代码,方法是附加

    -I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c++/v1/
    
    Run Code Online (Sandbox Code Playgroud)

    并且不使用-stdlib=libc++.使用此标志将libc ++显式指定为include目录允许我构建的clang"看到"标准c ++标头.令人惊讶的是,它在编译一个适度基本的源文件时仍然很满意(它仍然在其中运行了大量的c ++ 11疯狂)

基于此,您可以看到我正在修改我刚刚构建的clang version 3.6.0 (trunk 217905)用于查找Apple的Xcode打包的libc ++.这表面上看起来很有效,因为Apple的libc ++与Xcode一起提供的ABI兼容我刚从源代码构建的编译器.对我来说仍然很好奇的是我的新编译的clang能够找出在哪里找到相应的libc ++ dylib!这引发了后来我实际上编译libc ++时的问题,我该如何告诉我的新svn编译的clang查找并使用新的svn编译的libc ++ dylib?

所以,基本上,我还是心乱如麻什么,我真的应该做成立的libc ++正常.具体来说,当你说出来时clang 实际上做了什么-stdlib=libc++

它是一个硬编码的包含路径吗?我可能想要从svn构建libc ++ abi和libc ++以与从svn构建的clang一起使用.这是最有意义的...然后我该如何安装呢?必须将-I~/libcxx/include/c++/v1/(或任何它可能的)放入构建配置是不优雅的.

据推测,我可以设置我的llvm构建来构建clang以及libc ++ abi和libc ++,同时从svn中查看libcxxabi和libcxx,我的期望是安装它应该-stdlib=libc++神奇地工作.另请注意,Apple为您提供Xcode的铿锵声并不需要您使用-stdlib=libc++.它只是神奇地知道在哪里抓取库文件.

然而!美中不足,至少是迄今为止我所知道的唯一一个:我的机器已经有了/usr/bin/clang++:

$ ls -la $(which clang++)
-rwxr-xr-x  1 root  wheel  14240 Mar …
Run Code Online (Sandbox Code Playgroud)

c++ macos clang

8
推荐指数
1
解决办法
1508
查看次数

标签 统计

c++ ×2

vim ×2

arrays ×1

c ×1

c++11 ×1

clang ×1

git ×1

ios ×1

javascript ×1

macos ×1

node.js ×1

opengl-es ×1

opengl-es-2.0 ×1

optimization ×1

performance ×1

terminal ×1

tmux ×1

unix ×1