我想调试和配置一些执行未对齐访问的64位软件,如下例所示:
int foo[2] = { 1, 2 };
*((int *)((char *)foo + 2)) = 3;
Run Code Online (Sandbox Code Playgroud)
我知道在使用gcc和gdb时有两种方法可以做到这一点.第一种方法是直接在我的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 2008或2010完成相同的操作.在任何版本的Visual Studio中,x64模式下的C++程序中的内联汇编不再可用,但我可以使用内在函数代替:
#include <intrin.h>
/* ... */
__writeeflags(__readeflags() | 0x40000);
Run Code Online (Sandbox Code Playgroud)
这与Linux上的代码完全相同.它有点工作:当我的错误代码运行时,我得到了异常.EFL.AC每次遇到断点时,标志都会重置为零.这意味着我无法正确调试具有大量复杂断点的大型应用程序,除非我通过调用我的asm函数来丢弃代码.
所以我尝试EFL |= …
当我使用相同参数的每一个时,我注意到的唯一区别是"相机"与物体的距离.这里有什么区别,哪个主要是2D游戏?
我经常使用git log -p <file>或git log -p <directory>获得文件或文件集中更改的全面摘要.它输出影响文件的提交历史记录,以及每个提交的统一差异.
使用Perforce我可以做p4 changes <file>或p4 changes <directory>/...获得提交列表.但似乎没有显示相应差异的选项.
我可以使用Perforce等效物吗?如果需要shell脚本,那么一个完全正常工作的函数会很好.
如果你想知道为什么我会错过这个功能,这里有一些东西git log -p让我可以非常快速地完成:
.cpp要修改的文件是什么?FOO已将字符串添加到文件的所有提交.我有一个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)
有人可以提出更好的建议吗?
我正在从头开始编写一个简单的JavaScript 3D引擎,使用Canvas和像原始文件一样的盒子(例如Minecraft).我正在实施尽可能多的优化,到目前为止,我已经背面剔除和隐藏面部遮挡,但我无法弄清楚如何做截头剔除最佳方式.
我已经尝试过2D剔除,但这有一个我无法解决的具体问题:如果一个4点平面的单个顶点出现在相机后面,它仍然被绘制但完全失真(我认为x和y坐标是相反的) - 看图像.
我开始认为如果不使用更复杂的数学和渲染序列,这还没有真正的解决方案.


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

我有一些OpenGL的经验,它完全不同的东西,所以这甚至不是一个问题.
我有没有机会在不拔头发的情况下修理它?
最终的解决方案是在进行2D投影然后进行屏幕剪裁之前,在3D中针对近剪裁平面测试8个顶点中的每一个.
这是第二个剪切步骤,第一个是使用半径的边界球来测试框是否完全位于剪切平面的后面sqrt(3/2)*boxSideLength.
额外的三角形(在这种情况下实际上是点)太复杂和数学密集,这个解决方案并不完美但非常漂亮.
我在构建项目时遇到以下错误.即使我将属性"将警告视为错误"设置为"否",我得到的是:
error C2220: warning treated as error - no object file is created.
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我解决这个问题吗?提前致谢.
我是OpenGL的新手.我和JOGL一起使用它.
我正在读关于截头剔除:
http://www.lighthouse3d.com/opengl/viewfrustum/
http://www.crownandcutlass.com/features/technicaldetails/frustum.html
我不确定它应该做什么.OpenGL不会自动剔除屏幕外对象吗?(这种剔除速度明显慢于不首先发送对象吗?)
从我正在阅读的内容来看,它看起来并不像是避免绘制被遮挡在另一个之后但在视锥体内的对象.这是否意味着唯一的好处是避免将屏幕外对象发送到OpenGL?
我很难理解OpenGL透视图.我已经阅读了大量的信息,但它并没有帮助我尝试实现我所追求的目标.这确保我的3D场景充满了每个Android设备上的整个屏幕.
为了测试这个,我将在3d空间中绘制一个四边形,最后应该触及每个角落,填满整个设备的屏幕.然后我可以使用这个四边形,或者实际上它的坐标指定一个Z距离的边界框,我可以使用它来放置几何体并确保它们填满我的屏幕.当屏幕调整大小,或者我要在另一个屏幕分辨率上运行它时,我会重新计算此边界框和几何体.我不是在谈论静态几何,但是比如说我想用球填充屏幕,无论有多大或多少球都没关系,唯一重要的是屏幕被填满而且没有多余的可见平截头体外的球.

我实际上希望能够在任何分辨率/窗口的任何Android设备的3d空间内针对视口边界进行programmaticaly定位几何.
注意:我有一个闪光背景,它使用一个具有任何分辨率的已知宽度x高度的舞台(视觉区域),这使得使用绝对测量或百分比测量很容易定位/缩放资产.我想我正在试图弄清楚这个系统如何应用于OpenGL的透视图.
我写了自定义矢量类,如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)