小编ReX*_*357的帖子

C:更快地访问查找表?

我有一段代码,一次跟踪4个正弦值.

我的原始代码是每帧大约12000个sin()函数调用,运行速度为30 fps.

我尝试通过生成查找表来优化它.我最终得到了16个不同的查找表.我声明并将它们加载到程序顶部的单独头文件中.每个表都声明如下:

static const float d4_lookup[800] {...};
Run Code Online (Sandbox Code Playgroud)

现在,使用这种新方法我实际上丢失了fps?!我现在以20 fps而不是30运行.每帧现在只需要执行8次sin/cos调用和19200次查询调用与12000次sin()调用.我使用带有-O3标志的gcc编译.目前,查找表包含在顶部,是程序全局范围的一部分.

我假设我没有将它们加载到正确的内存或其他类似的东西.如何加快查找时间?

**编辑1**

根据要求,这是使用查找调用的函数,每帧调用一次:

void
update_sines(void)
{
    static float c1_sin, c1_cos;
    static float c2_sin, c2_cos;
    static float c3_sin, c3_cos;
    static float c4_sin, c4_cos;

    clock_gettime(CLOCK_MONOTONIC, &spec);
    s = spec.tv_sec;
    ms = spec.tv_nsec * 0.0000001;
    etime = concatenate((long)s, ms);

    c1_sin = sinf(etime * 0.00525);
    c1_cos = cosf(etime * 0.00525);
    c2_sin = sinf(etime * 0.007326);
    c2_cos = cosf(etime * 0.007326);
    c3_sin = sinf(etime * 0.0046);
    c3_cos = cosf(etime * 0.0046);
    c4_sin …
Run Code Online (Sandbox Code Playgroud)

c linux optimization compiler-optimization

16
推荐指数
2
解决办法
2322
查看次数

C:使用沉重的sin()来提高功能的性能

我有一个C函数,它根据经过的时间计算4个正弦值.使用gprof,我认为这个函数使用100%(100.7%确切地说是lol)的CPU时间.

void
update_sines(void)
{
    clock_gettime(CLOCK_MONOTONIC, &spec);
    s = spec.tv_sec;
    ms = spec.tv_nsec * 0.0000001;
    etime = concatenate((long)s, ms);

    int k;
    for (k = 0; k < 799; ++k)
    {
        double A1 = 145 * sin((RAND1 * k + etime) * 0.00333) + RAND5;           // Amplitude
        double A2 = 100 * sin((RAND2 * k + etime) * 0.00333) + RAND4;           // Amplitude
        double A3 = 168 * sin((RAND3 * k + etime) * 0.00333) + RAND3;           // Amplitude
        double A4 = …
Run Code Online (Sandbox Code Playgroud)

c math optimization performance trigonometry

9
推荐指数
1
解决办法
921
查看次数

Javascript:承诺+这个

请考虑以下代码:

foo: function() {
  var self = this;
  var p1 = p2 = someFunctionThatReturnsAPromise();

  Promise.all([p1, p2])
    .then(self.bar);
}

bar: function(promises) {
  var self = this;
  console.log(self);
}
Run Code Online (Sandbox Code Playgroud)

输出:

undefined
Run Code Online (Sandbox Code Playgroud)

但如果我改为:

foo: function() {
  var self = this;
  var p1 = p2 = someFunctionThatReturnsAPromise();

  Promise.all([p1, p2])
    .then(function(result) {
      self.bar(result);
    });
}

bar: function(promises) {
  var self = this;
  console.log(self);
}
Run Code Online (Sandbox Code Playgroud)

输出:

{ foo: [Function],
  bar: [Function] }
Run Code Online (Sandbox Code Playgroud)

我不明白为什么第一次调用会改变bar函数中的这个位置.有人可以开导我吗?

javascript this promise

9
推荐指数
1
解决办法
7559
查看次数

OpenGL ES 2.0 +开罗:HUD

我试图在ARM Linux平台上用C语言编写的OpenGL ES 2.0应用程序上呈现HUD.

我目前正在使用靠近近剪裁平面放置的2个三角形,并将纹理平铺到它们上面.纹理是屏幕的大小,除了我有文字渲染的部分外,它们大多是透明的.使用Pango/Cairo生成纹理

如果我打开HUD(取消对render_ui的调用),我目前的性能达到了50%(从60fps到30fps).

这是渲染HUD的代码:

void render_ui(OGL_STATE_T *state) {

    glUseProgram(state->uiHandle);

    matIdentity(modelViewMatrix);
    matTranslate(modelViewMatrix, 0, 0, -0.51);

    const GLfloat *mvMat2 = modelViewMatrix;

    glViewport(0,0,state->screen_width, state->screen_height);

    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);

    glBindBuffer(GL_ARRAY_BUFFER, state->uiVB);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, state->uiIB);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, state->uiTex);
    glUniform1i(_uiTexUniform, 0);

    glUniformMatrix4fv(_uiProjectionUniform, 1, 0, pMat);
    glUniformMatrix4fv(_uiModelViewUniform, 1, 0, mvMat2);

    glVertexAttribPointer(_uiPositionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); 
    glVertexAttribPointer(_uiColorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex),
            (GLvoid *) (sizeof(GLfloat) * 3));
    glVertexAttribPointer(_uiTexCoordSlot, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex),
            (GLvoid *) (sizeof(GLfloat) * 7));

    glEnableVertexAttribArray(_uiPositionSlot);
    glEnableVertexAttribArray(_uiColorSlot);
    glEnableVertexAttribArray(_uiTexCoordSlot);

    glDrawElements(GL_TRIANGLES, uiIndicesArraySize / uiIndicesElementSize,
            GL_UNSIGNED_BYTE, 0);   

    glDisableVertexAttribArray(_uiTexCoordSlot); …
Run Code Online (Sandbox Code Playgroud)

c hud opengl-es-2.0

6
推荐指数
1
解决办法
401
查看次数

GTK2:g_thread_init已弃用

这是我第一次尝试制作一个线程软件.它将是基于Arch Linux的GTK2.

我按照这里的例子:

开罗的螺纹动画

使用底部的SIGALRM示例.

编译时收到以下警告:

warning: 'g_thread_init' is deprecated (declared at /usr/include/glib-2.0/glib/deprecated/gthread.h:260) [-Wdeprecated-declarations]
if (!g_thread_supported ()){ g_thread_init(NULL); }
Run Code Online (Sandbox Code Playgroud)

我正试图找到关于我应该怎么做的信息.网上出现此警告的唯一事情是软件在编译时抛出相同错误的错误报告.很多报告看起来像他们说只是删除线.

我是否只删除该线并保持其余部分完好无损?或者有更好的方法来解决这个问题吗?

我正在使用触摸屏在Raspberry Pi Model B上运行信息娱乐系统,我想确保它像iPhone一样快感,因此我想在高优先级线程中运行图形和用户输入内容.

如果有人能指出我正确的方向这种类型的东西,将不胜感激.如有必要,任何在线文学作品都会有所帮助.

提前致谢.

c linux gtk multithreading gtk2

5
推荐指数
1
解决办法
4029
查看次数

Gtk-ERROR**:检测到GTK + 2.x符号

我正在用gcc编译我的c应用程序,并带有以下标志:

gcc evis.c `pkg-config --cflags --libs gtk+-2.0 --libs clutter-gtk-1.0 --libs gthread-2.0` -Wall -o evis
Run Code Online (Sandbox Code Playgroud)

现在我的代码编译了一些警告,但仍然完成.当我尝试运行我的程序时,我得到:

(evis:1820): Gtk-ERROR **: GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported
Run Code Online (Sandbox Code Playgroud)

如何解决此错误?我怎么知道在哪里看?我可以使用某种工具在我的代码中扫描GTK3符号吗?我正在使用GTK + 2进行编译,所以我不明白这是怎么回事.

c linux gcc gtk2 gtk3

4
推荐指数
1
解决办法
1万
查看次数

左/右旋转进位的实际用途

循环左进位和循环右进位指令有哪些实际用途?

在我的汇编课上,我们无法想出一个有用的好例子。

assembly programming-languages

4
推荐指数
1
解决办法
1419
查看次数

Android:分享图片意图不与Facebook合作?

嗨,我有以下代码来共享图像:

// Share
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");

Uri uri = Uri.parse(getFilesDir() + File.separator + "myGoal.jpg");
        share.putExtra(Intent.EXTRA_STREAM, uri);

startActivity(Intent.createChooser(share, "Share Image"));
Run Code Online (Sandbox Code Playgroud)

它可以将图像分享到Dropbox,但是如果我选择了Facebook选项,我会获得Facebook的状态更新对话框,没有附加图像,如果我尝试用"测试"更新我的状态,它就不起作用.没有错误.只是不工作.

我知道这不是图像,因为它正确地上传到我的Dropbox,我可以拉出图像并查看它.

我是否必须以不同方式将图像附加到意图才能与Facebook一起使用?

有任何想法吗?我正在物理设备上调试.

java android facebook android-intent

3
推荐指数
1
解决办法
7109
查看次数

C + Linux:如何接管帧缓冲区

我有一个直接渲染到帧缓冲区的 OpenGL 应用程序。

如果我从终端启动应用程序,有时我会看到光标在我的应用程序后面闪烁。同样,如果我从 X 中的终端仿真器内部启动它,如果我四处移动鼠标,我会瞥见鼠标向后移动。

我的应用程序目前以 45fps 呈现,因此低帧率应该不是问题。

我注意到当 X 启动时,它似乎在开始渲染之前清除了外壳,但是当您稍后关闭 X 服务器时,发送到 stdout 的诊断内容又回来了,所以我怀疑它是否发出了明确的命令。

我想做的事情如何完成?你能简单地渲染到 fb1 并告诉视频输出从 fb1 显示而不是争夺 fb0 吗?那么当您的应用程序死亡时,您可以将显示返回到 fb0 吗?

编辑:

为澄清起见,该应用程序正在为配备 Vivante GPU 并在 ArchLinux ARM 上运行的 ARM SoC (Freescale i.MX6) 上的嵌入式系统开发。

c linux opengl framebuffer

3
推荐指数
1
解决办法
2506
查看次数