I’ve noticed that you are using build #2468. We’ve made some performance improvements since then. In this case, I’ve noticed that you are using widget.newButton() in each row, which uses display.newText() internally even if you do *not* display text within the button (it’ll create an empty “” text object in that case). We’ve optimized Corona for WP8 since then to no incur a performance penalty for text objects that contain no characters or unprintable characters.
So… I recommend that you grab the newest daily build and re-build/re-test your app.
That said, I would expect Cocos2d-x to render faster than Corona on WP8. This is because they’re built using different Microsoft frameworks, each having their own advantages and disadvantages. Cocos2d-x only supports pure native DirectX WP8 apps and does *not* support native UI, ads (Google AdMob or Microsoft Ads), or .NET (C# or VB). This means you can only develop a pure DirectX driven game via Cocos2d-x. This also makes business style apps impossible. Now, Corona only supports building WP8 Silverlight apps which *does* support Microsoft’s native UI (including ads) and .NET support. Now, the reason a Silverlight app will be a bit slower is because the Corona has to compete with Microsoft’s native UI framework for control over the CPU (ie: the 1 Direct3D rendering thread that has to be shared). But that said, I still find the framerate to be about 60 FPS even on the low-end devices, but admittedly, I have one Lumia 920 where the framerate is usually around 45-50 FPS and we can’t squeak anymore performance out of a Silverlight app.
But that said, I’ve never heard of anyone getting 10 FPS on a WP8 device with Corona before. This is extremely unusual. After updating your project to the newest daily build, would you mind inserting the below code into your “main.lua” to measure the actual FPS please? It’ll log the average FPS once per second.
local lastEnterFrameTime = nil local durationCollectionSize = display.fps local durationCollectionIndex = 1 local durationCollection = {} for index = 1, durationCollectionSize do durationCollection[index] = 0 end local function onEnterFrame(event) local currentTime = system.getTimer() -- If this is the first frame, then fetch the current time and exit out. if (lastEnterFrameTime == nil) then lastEnterFrameTime = currentTime return end -- Store the duration since the last frame. durationCollection[durationCollectionIndex] = currentTime - lastEnterFrameTime lastEnterFrameTime = currentTime -- Do not continue if we have more durations to collection before averaging below. if (durationCollectionIndex \< durationCollectionSize) then durationCollectionIndex = durationCollectionIndex + 1 return end -- Average the collected durations and print it to the log. local averageDuration = 0 for index = 1, durationCollectionSize do averageDuration = averageDuration + durationCollection[index] end averageDuration = averageDuration / durationCollectionSize local averageFps = 1000 / averageDuration print("Average FPS = " .. tostring(averageFps) .. ", Average Duration = " .. tostring(averageDuration)) -- Reset data collection. durationCollectionIndex = 1 end Runtime:addEventListener("enterFrame", onEnterFrame)