小编sam*_*var的帖子

"BC break"是什么意思?

我在GitHub上找到了"BC break"一词 - 这是什么意思?

terminology

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

如何使用Visual Studio调试amd64上的未对齐访问?

我想调试和配置一些执行未对齐访问的64位软件,如下例所示:

int foo[2] = { 1, 2 };
*((int *)((char *)foo + 2)) = 3;
Run Code Online (Sandbox Code Playgroud)

gcc的方式

我知道在使用gccgdb时有两种方法可以做到这一点.第一种方法是直接在我的C或C++代码中启用寄存器中的对齐校验位(位18)eflags:

asm volatile("pushf \n"
             "pop %%rax \n"
             "or $0x40000, %%rax \n"
             "push %%rax \n"
             "popf \n" ::: "rax");
Run Code Online (Sandbox Code Playgroud)

这非常方便,因为我可以在应用程序本身中选择是否绕过未对齐的访问检查,例如在调用已知的错误库时.

另一种方式是来自gdb,在调试可执行文件时的任何时刻:

set $eflags |= 1<<18
Run Code Online (Sandbox Code Playgroud)

同样,这可以随意启用或禁用,编写脚本等.非常方便.

视觉工作室

现在,我已经无法在Vista64上使用Visual Studio 20082010完成相同的操作.在任何版本的Visual Studio中,x64模式下的C++程序中的内联汇编不再可用,但我可以使用内在函数代替:

#include <intrin.h>
/* ... */
__writeeflags(__readeflags() | 0x40000);
Run Code Online (Sandbox Code Playgroud)

这与Linux上的代码完全相同.它有点工作:当我的错误代码运行时,我得到了异常.EFL.AC每次遇到断点时,标志都会重置为零.这意味着我无法正确调试具有大量复杂断点的大型应用程序,除非我通过调用我的asm函数来丢弃代码.

所以我尝试EFL |= …

debugging 64-bit assembly alignment visual-c++

23
推荐指数
1
解决办法
1145
查看次数

OpenGL(ES) - 视锥体和正交之间有什么区别?

当我使用相同参数的每一个时,我注意到的唯一区别是"相机"与物体的距离.这里有什么区别,哪个主要是2D游戏?

graphics android opengl-es

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

p4命令行相当于"git log -p"?

我经常使用git log -p <file>git log -p <directory>获得文件或文件集中更改的全面摘要.它输出影响文件的提交历史记录,以及每个提交的统一差异.

使用Perforce我可以做p4 changes <file>p4 changes <directory>/...获得提交列表.但似乎没有显示相应差异的选项.

我可以使用Perforce等效物吗?如果需要shell脚本,那么一个完全正常工作的函数会很好.

如果你想知道为什么我会错过这个功能,这里有一些东西git log -p让我可以非常快速地完成:

  • 最后一个.cpp要修改的文件是什么?
  • 找到FOO已将字符串添加到文件的所有提交.
  • 一个函数刚被弃用; 其他开发人员用什么替代它?
  • 一般来说,只知道最近在给定目录中发生了什么.

git diff command-line perforce

7
推荐指数
1
解决办法
3593
查看次数

在PHP中,如何解压缩两次压缩的文件?

我有一个bigfile.gz.gz很大的文件.我想在运行中解压缩它.理想情况下,这就是我的想法:

$in = fopen('compress.zlib://compress.zlib://bigfile.gz.gz', 'rb');
while (!feof($in))
    print fread($in, 4096);
fclose($in);
Run Code Online (Sandbox Code Playgroud)

但是,compress.zlib://不能用那种方式链接:

PHP Warning:  fopen(): cannot represent a stream of type ZLIB as a File Descriptor in gztest.php on line 1
Run Code Online (Sandbox Code Playgroud)

 

所以,我想我会结合起来gzopen(),并compress.zlib://一起:

$in = gzopen('compress.zlib://bigfile.gz.gz', 'rb');
while (!gzeof($in))
    print gzread($in, 4096);
gzclose($in);
Run Code Online (Sandbox Code Playgroud)

但是,这只会解压缩一级gzip.

 

我尝试了其他10种方法,遗憾的gzopen()是,php://memory如果它已被写入使用,则无法使用fwrite().并且stream_filter_append(… zlib.inflate …)无法读取gzip压缩文件.

这是我能想到的最好的,但它会产生两个系统进程,这会带来不必要的开销:

$in = popen('zcat bigfile.gz.gz | gunzip', 'rb');
while (!feof($in))
    print fread($in, 4096);
fclose($in);
Run Code Online (Sandbox Code Playgroud)

 

有人可以提出更好的建议吗?

php gzip zlib

7
推荐指数
1
解决办法
1837
查看次数

Frustum平面微积分

我正在从头开始编写一个简单的JavaScript 3D引擎,使用Canvas和像原始文件一样的盒子(例如Minecraft).我正在实施尽可能多的优化,到目前为止,我已经背面剔除和隐藏面部遮挡,但我无法弄清楚如何做截头剔除最佳方式.

我已经尝试过2D剔除,但这有一个我无法解决的具体问题:如果一个4点平面的单个顶点出现在相机后面,它仍然被绘制但完全失真(我认为x和y坐标是相反的) - 看图像.

我开始认为如果不使用更复杂的数学和渲染序列,这还没有真正的解决方案.

起初一切都好

在此输入图像描述

我试图限制2D屏幕内的顶点x和y坐标,只要4个顶点中至少有一个仍在屏幕内(见下文),但这完全扭曲了方形面(虽然我想我可以去更多花哨的数学和其他三角形).

在此输入图像描述

我有一些OpenGL的经验,它完全不同的东西,所以这甚至不是一个问题.

我有没有机会在不拔头发的情况下修理它?


最终的解决方案是在进行2D投影然后进行屏幕剪裁之前,在3D中针对近剪裁平面测试8个顶点中的每一个.

这是第二个剪切步骤,第一个是使用半径的边界球来测试框是否完全位于剪切平面的后面sqrt(3/2)*boxSideLength.

额外的三角形(在这种情况下实际上是点)太复杂和数学密集,这个解决方案并不完美但非常漂亮.

3d clipping

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

如何解决以下C2220错误?

我在构建项目时遇到以下错误.即使我将属性"将警告视为错误"设置为"否",我得到的是:

error C2220: warning treated as error - no object file is created.
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题吗?提前致谢.

visual-studio-2005 visual-studio

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

对于Frustum Culling感到困惑

我是OpenGL的新手.我和JOGL一起使用它.

我正在读关于截头剔除:

http://www.lighthouse3d.com/opengl/viewfrustum/

http://www.crownandcutlass.com/features/technicaldetails/frustum.html

我不确定它应该做什么.OpenGL不会自动剔除屏幕外对象吗?(这种剔除速度明显慢于不首先发送对象吗?)

从我正在阅读的内容来看,它看起来并不像是避免绘制被遮挡在另一个之后但在视锥体内的对象.这是否意味着唯一的好处是避免将屏幕外对象发送到OpenGL?

java opengl graphics jogl frustum

5
推荐指数
2
解决办法
1923
查看次数

使用OpenGL ES在任何分辨率上的视口边界

我很难理解OpenGL透视图.我已经阅读了大量的信息,但它并没有帮助我尝试实现我所追求的目标.这确保我的3D场景充满了每个Android设备上的整个屏幕.

为了测试这个,我将在3d空间中绘制一个四边形,最后应该触及每个角落,填满整个设备的屏幕.然后我可以使用这个四边形,或者实际上它的坐标指定一个Z距离的边界框,我可以使用它来放置几何体并确保它们填满我的屏幕.当屏幕调整大小,或者我要在另一个屏幕分辨率上运行它时,我会重新计算此边界框和几何体.我不是在谈论静态几何,但是比如说我想用球填充屏幕,无论有多大或多少球都没关系,唯一重要的是屏幕被填满而且没有多余的可见平截头体外的球.

在此输入图像描述

  • 据我所知,在指定视口时,您实际上将像素值绑定到视锥体的边界.我知道您实际上可以设置一个正交视图,其窗口像素与三维几何位置相匹配,但我不确定它在透视视图中是如何工作的.
  • 这里我假设视口宽度和高度要映射到nearZ.所以当球在Z = 1f时,它具有原始尺寸
  • 当将球移动到屏幕中以便进入farZ方向时,球将按比例缩小以使透视工作.因此,例如Z = 51f的球在我的屏幕上显得更小,我需要更多的球来填满整个屏幕.
  • 现在为了做到这一点,我正在寻找紫色的边界
  • 实际上我需要这些边界以不同的平截头体尺寸(宽度x高度)填充整个屏幕,而球的平截头体角度和Z距离总是相同的
  • 我想我可以用trig来计算这些紫色边界(见蓝色三角形注释)
  • 我正确地标记了截锥体角度,它是截锥体的垂直角度吗?
  • 有人可以详细说明绿色的1f和-1f值,因为我似乎已经读过它了吗?看起来像是一些用于调整平截头体内几何体大小的标量?

我实际上希望能够在任何分辨率/窗口的任何Android设备的3d空间内针对视口边界进行programmaticaly定位几何.

注意:我有一个闪光背景,它使用一个具有任何分辨率的已知宽度x高度的舞台(视觉区域),这使得使用绝对测量或百分比测量很容易定位/缩放资产.我想我正在试图弄清楚这个系统如何应用于OpenGL的透视图.

android opengl-es perspective

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

这个C++ setter/getter模式打破了什么?

在C++中使用GLSL语法

我写了自定义矢量类,如vec2,vec3等模仿GLSL类型和大致如下:

struct vec3
{
    inline vec3(float x, float y, float z)
      : x(x), y(y), z(z) {}
    union { float x, r, s; };
    union { float y, g, t; };
    union { float z, b, p; };
};
Run Code Online (Sandbox Code Playgroud)

矢量的操作以这种方式实现:

inline vec3 operator +(vec3 a, vec3 b)
{
    return vec3(a.x + b.x, a.y + b.y, a.z + b.z);
}
Run Code Online (Sandbox Code Playgroud)

这允许我使用类似GLSL的语法创建向量并访问它们的组件,并对它们执行操作,就像它们是数字类型一样.工会允许我指的是第一个冷漠的坐标作为x或作为r,如在GLSL的情况.例如:

vec3 point = vec3(1.f, 2.f, 3.f);
vec3 other = point + point; …
Run Code Online (Sandbox Code Playgroud)

c++ design-patterns glsl getter-setter

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