来自epoll的手册页:
epoll is a variant of poll(2) that can be used either as an edge-triggered
or a level-triggered interface
Run Code Online (Sandbox Code Playgroud)
什么时候会使用边缘触发选项?手册页给出了一个使用它的示例,但我不明白为什么在示例中有必要.
看着SSE运营商
CMPORDPS - ordered compare packed singles
CMPUNORDPS - unordered compare packed singles
Run Code Online (Sandbox Code Playgroud)
有序和无序是什么意思?我在x86指令集中寻找等效指令,它似乎只有无序(FUCOM).
我一直在比较拉动式FRP(即netwire)和推拉式FRP(即反应性 - 香蕉)在游戏的实施中.一个优于另一个有优势吗?我注意到的事情是:
IO漂浮,这总是更好.我还错过了什么?
编辑,以减少基于意见:主要目标是尽可能具有表达/简洁的东西,没有时间泄漏.
更新:我发现Netwire的一个大问题是,似乎没有一种方便的方法来获得多个帧速率,如"修复你的时间步"一文中所述.
更新2:我解决这个问题的方法是让我的游戏模拟线返回一个Float -> IO ()获取alpha值并使用该alpha插值的所有GL调用.理想情况下,我应该能够通过一个"绘制函数"传递给另一个线程MVar并在该线程中运行它.男人,哈斯克尔太棒了.
更新3:在提出这个问题后的六个月里,我开发了一个基于Netwire 的简单渲染引擎,以及"实体组件编程"的概念.在这个过程中,我实际上没有发现使用FRP非常有用.Wire在某些情况下,s 的表现力实际上已成为障碍.问题集中在对象的"身份"上.在定义Wire类型的值时,它没有标识,即它可以在整个网络中多次重复使用,并且每次表示不同的物理事物.当你想要做一些像碰撞检测这样的事情并且无法遍历场景图时,这是一个巨大的痛苦,因为它不能在不融合成单根不透明线的情况下存在.在"玩具"示例中不会出现此问题,因为很容易准确指定哪些对象与哪些其他对象以哪种方式交互.我相信这是任何一种FRP的问题.
如果一些Haskell向导在这方面证明我错了,那将是很棒的,但我真的没有看到它的方法.此外,如果解释不是很好,我很抱歉,但如果不自己尝试,这并不容易理解.
是否有充分的理由首先运行类型检查器?如果它运行在较小的语法上,那么类型检查器似乎会变得非常简单,特别是因为在当前系统中,每个语法扩展都需要触及类型检查器.这个问题尤其适用于箭头语法,这里的评论中所述的类型检查被认为是虚假的.
我想这样做的一个原因是不会发出提及生成代码的错误,但是在deriving条款未能进行类型检查的情况下已经涵盖了这种情况; GHC知道代码是生成的.
我正在尝试学习如何实现GHC的各个方面,如类型推断,模式匹配和其他代码转换.
然而,代码库相当大,文件名使用了很多首字母缩略词(简单,stg,stranal ......).这些是什么意思,代码是如何组织的?
当我尝试使用proc语法(使用Netwire和Vinyl)对GADT 进行模式匹配时:
sceneRoot = proc inputs -> do
let (Identity camera :& Identity children) = inputs
returnA -< (<*>) (map (rGet draw) children) . pure
Run Code Online (Sandbox Code Playgroud)
我从ghc-7.6.3得到(相当奇怪的)编译器错误
My brain just exploded
I can't handle pattern bindings for existential or GADT data constructors.
Instead, use a case-expression, or do-notation, to unpack the constructor.
In the pattern: Identity cam :& Identity childs
当我将模式放在模式中时,我得到了类似的错误proc (...).为什么是这样?它不健全,还是只是未实现?
我有一些Haskell代码
indLoc index way = do
Store p <- ask
return $ plusPtr p localAddr
where localAddr = (stHeader + stIndices + index + stIndices * way) * blockSize
--snip...
(Just way, _) -> do
liftIO $ pokeElemOff loc way a
indLoc index way
Run Code Online (Sandbox Code Playgroud)
这产生了一些相当奇怪的核心:
case GHC.Prim.writeInt64OffAddr#
@ GHC.Prim.RealWorld a4_s4UV i_s4UW x_s4UX new_s_s4UY
of s2_s4V0 { __DEFAULT ->
let {
sat_s528 :: GHC.Ptr.Ptr b_a1UV
[LclId]
sat_s528 =
case r_s4Us `cast` ... of _ { GHC.Ptr.Ptr addr_s4Vb ->
case index_s4Um of …Run Code Online (Sandbox Code Playgroud) 在我的项目中,我有一些功能
std::tuple<VAO, Mesh, ShaderProgram> LoadWavefront(std::string filename);
Run Code Online (Sandbox Code Playgroud)
我可以像这样使用:
VAO teapotVAO;
Mesh teapotMesh;
ShaderProgram teapotShader;
std::tie(teapotVAO, teapotMesh, teapotShader)
= LoadWavefront("assets/teapot.obj");
Run Code Online (Sandbox Code Playgroud)
问题是,这要求每个类都有一个默认构造函数,它在无效状态下创建它们,这很容易出错.如何在不必std::get<>每件物品的情况下解决这个问题?有一种优雅的方式来做到这一点?
使用DataKinds,定义如
data KFoo = TFoo
Run Code Online (Sandbox Code Playgroud)
介绍种类KFoo :: BOX和类型TFoo :: KFoo.为什么我不能继续定义
data TFoo = CFoo
Run Code Online (Sandbox Code Playgroud)
这样CFoo :: TFoo,TFoo :: KFoo,KFoo :: BOX?
所有构造函数都需要属于属于该类型的类型*吗?如果是这样,为什么?
编辑:当我这样做时,我没有收到错误,因为构造函数和类型共享一个命名空间,但GHC允许冲突,因为它将名称消歧为常规类型,而不是提升构造函数.文档说前缀为a '来引用提升的构造函数.当我改变第二行时
data 'TFoo = CFoo
Run Code Online (Sandbox Code Playgroud)
我收到了错误
格式错误的类型或类声明:TFoo
对于编写编译器,使用LLVM IR vs C作为目标语言有哪些优缺点?我知道两者都被使用了,我想如果我使用clang来编译C,那么最终的机器代码会是相似的.那么还有什么需要考虑的事情呢?